2009-08-27 10 views
36

sólo estoy Iniciación al desarrollo de OSGi y estoy luchando para entender la mejor manera de manejar JAR dependientes.OSGI - manejo JAR 3 ª parte requeridos por un haz

es decir, si estoy creando un bulto del likelyhood es que voy a tener que usar unos JAR 3 ª parte. Cuando creo mi paquete JAR para implementarlo en OSGI, obviamente estos archivos JAR de terceros no están incluidos y, por lo tanto, el paquete no se ejecutará.

entiendo que una opción es convertir estos archivos JAR en haces y desplegarlos en el contenedor OSGi. Sin embargo, si solo necesitan ser utilizados por el paquete, esto no parece ideal.

¿Cuál es la mejor solución para esto? ¿Pueden los archivos JAR insertarse dentro del paquete JAR y, de ser así, es un enfoque razonable?

Respuesta

25

Casi siempre empaco cada frasco por separado. OSGi en sí está diseñado para la modularización y usted toma todo el sistema ad absurdum al no hacer esto.

Si desea convertir archivos JAR en haces es posible que desee utilizar el BND Tool written by Peter Kriens. Pero primero le sugiero que busque el paquete en el SpringSource Enterprise Bundle Repository si aún no lo han hecho por usted.

+0

Si está buscando una biblioteca de código abierto convencional, le pondría un buen dinero a los chicos de Spring que la tienen disponible en su repositorio. – SteveD

+0

También debe evitar la incrustación ya que a veces puede provocar un comportamiento extraño. – Thirlan

+0

Hoy en día, muchos de los lbis que necesitas ya son paquetes, así que el primer lugar para buscarme es el repositorio central de maven. Si la distribución principal de lib aún no es un paquete, también tiene sentido buscar en los paquetes de servicemix en central. –

9

Es posible incrustar dependencias que no sean OSGi en el paquete.

Una manera fácil de hacer esto es utilizar Maven para administrar sus dependencias y Maven Bundle Plugin para construir su paquete. Eche un vistazo a las instrucciones <Embed-Dependency> y <Embed-Transitive> del complemento Maven Bundle descrito en la sección Embedding dependencies de la página de documentación del complemento.

Como Roland señaló esto no es una solución ideal con respecto a las intenciones de OSGi, es decir, de modularización y reutilización de módulos individuales. Sin embargo, podría ser una solución pragmática por el momento hasta que las dependencias de terceros puedan convertirse en paquetes OSGi.

40

Puede incluir un tercer frasco de fiesta dentro de su paquete mediante la adición de la tercera jarra parte en el directorio raíz del archivo jar paquete y luego añadir una cabecera de paquete de ruta de clases de manifiesto del paquete, por ejemplo:

Bundle-ClassPath: .,my3rdparty.jar 

Si desea colocar la tercera parte en el tarro subdirectorio, especifique la ruta sin necesidad de utilizar las partidas ./, por ejemplo

Bundle-ClassPath: .,lib/my3rdparty.jar # (not ./lib/my3rdparty.jar) 
+0

Pensé que agregaría esta respuesta, ya que es una solución que encontré en la web y pude ponerme a trabajar rápidamente. Sin embargo, aprecio las opiniones con respecto a la ventaja de implementar correctamente los JAR como paquetes. – William

+0

Debería haber una coma en lugar de punto y coma como separador de classpath – Kojotak

+2

Tenga en cuenta que esto podría dar como resultado CLassCastExceptions si uno de los objetos en Bundle-Classpath se usa en otro paquete que declara su propio Bundle-Classpath ya que su classloader será diferente – Hilikus

6

Este hilo es un poco viejo, pero yo quería señalar una de las limitaciones de incrustar DEPEN dencies Recuerde que las dependencias están en el nivel jar, pero cuando exporta paquetes, algunas pueden necesitar venir de las dependencias incrustadas. Si esto ocurre, terminará con clases duplicadas, una en línea en el paquete de nivel superior y otra en el contenedor incrustado. Por supuesto, puede alinear todo el jar incrustado, pero antes de que lo sepa, esto se propaga a través de toda su cadena de dependencia. Este es solo uno de los problemas a los que se refieren Roland y otros.

4

Aquí hay un ejemplo si está usando Maven Bundle Plugin.

Nota: Este complemento importa automáticamente los paquetes que sus dependencias necesitan. Esto puede o no ser un problema para ti. Afortunadamente, puede suprimir los paquetes que realmente no necesita importar (consulte a continuación).

<Import-Package> 
     <!-- this was imported by one of the dependencies; I don't really need it --> 
     !org.apache.jackrabbit.test, 
     * 
    </Import-Package> 
    <Include-Resource> 
     lib/concurrent-1.3.4.jar, 
     lib/jackrabbit-core-2.6.5.jar, 
     lib/jackrabbit-spi-2.6.5.jar, 
     lib/jackrabbit-spi-commons-2.6.5.jar, 
     lib/lucene-core-3.6.0.jar, 
     lib/tika-core-1.3.jar 
    </Include-Resource> 
    <Bundle-ClassPath> 
     ., 
     concurrent-1.3.4.jar, 
     jackrabbit-core-2.6.5.jar, 
     jackrabbit-spi-2.6.5.jar, 
     jackrabbit-spi-commons-2.6.5.jar, 
     lucene-core-3.6.0.jar, 
     tika-core-1.3.jar 
    </Bundle-ClassPath> 
-4

podemos utilizar OSGi para anular los frascos de arranque cargador de clases cargadas en tiempo de ejecución, como si quisiéramos anular JAXP1.4.5 disponible con Java7 a JAXP1.6, no hay función -Dendorese para anular el API por defecto para actualizar API. ¿Podemos hacer esto con la ayuda de OSGI?

+2

¿Es esta una pregunta o una respuesta? Parece otra pregunta, en cuyo caso debe publicarla como una pregunta separada en lugar de como una respuesta. –

Cuestiones relacionadas