2009-08-05 13 views
8

Me encontré con esta pregunta cuando trying to share the Struts packages entre múltiples paquetes dentro de un contenedor OSGi. Quería evitar duplicar las dependencias dentro de los paquetes e introducir una nueva dependencia entre ellos (haciendo que un paquete exporte sus dependencias internas para que el otro lo comparta).¿Cómo puedo compartir bibliotecas que no sean OSGi entre paquetes en un contenedor OSGi?

Resulta que la respuesta es muy fácil si utiliza Maven, y si no lo está, puede utilizar la solución Maven para aprender a crear el mismo resultado con algún otro mecanismo.

Encontré este enfoque útil varias veces durante mi proyecto, así que voy a publicar un ejemplo aquí.

Respuesta

7

Usando Maven, es muy fácil crear un paquete OSGi desde cualquier biblioteca. Sin embargo, creo que el mismo resultado se puede crear con otros mecanismos, también. La solución de Maven me ayudó a entender cómo funciona.

crear el lote se hace mediante la creación de un proyecto que tiene la biblioteca como una dependencia y luego empaquetar el proyecto mediante el maven-bundle-plugin del Apache Felix project y especificando los paquetes de bibliotecas con la instrucción Export-Package. He utilizado este para compartir de Google Protocol Buffers entre los haces dentro de un contenedor OSGi:

<?xml version="1.0" encoding="UTF-8" ?> 
<project> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>com.example.lib</groupId> 
    <artifactId>protobuf-dist</artifactId> 
    <version>2.1.0</version> 
    <name>Google Protocol Buffers OSGi Distribution</name> 
    <packaging>bundle</packaging> 

    <dependencies> 
    <dependency> 
     <groupId>com.google.protobuf</groupId> 
     <artifactId>protobuf-java</artifactId> 
     <version>2.1.0</version> 
     <scope>compile</scope> 
    </dependency> 
    </dependencies> 

    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.felix</groupId> 
     <artifactId>maven-bundle-plugin</artifactId> 
     <extensions>true</extensions> 
     <configuration> 
      <instructions> 
      <Export-Package>com.google.protobuf</Export-Package> 
      </instructions> 
     </configuration> 
     </plugin> 
    </plugins> 
    </build> 
</project> 

Si desea que todas las dependencias transitivas, todo en el paquete, también, utilizar el objetivo bundleall del plugin.

El complemento reconoce y respeta los manifiestos OSGi existentes en la dependencia.

También puede usar el complemento del paquete para simplemente crear el manifiesto y decirle al jar complemento de empaquetado (o al ensamblado incorporado jar-with-dependencies) que use ese manifiesto a través de la sección de archivo. La página del complemento vinculada anteriormente muestra cómo hacerlo.

9

una vía adicional para aquellos que no quieren tantas experto, incapaz de puerto, o perfectamente feliz con la hormiga/hiedra

que he encontrado la manera más fácil que para cumplir la tarea indicada es convertir la no OSGi biblioteca en una biblioteca OSGi dejando que el manifiesto exporte cada paquete y agregue algunos nombres/versiones simbólicos apropiados. Pude hacerlo MUY fácilmente con bnd a través de tareas ant (o incluso invocación directa de línea de comando). También hay repositories que contienen la versión "osgi-ified" de muchas bibliotecas populares. Algunas bibliotecas (joda-time) ya están enviando manifiestos OSGi correctos.

+1

También hay repositorios que contienen la versión "osgi-ified" de muchas bibliotecas populares: SpringSource es una gran fuente: http://www.springsource.com/repository/app/ – Thilo

+0

¡gracias por el enlace! – basszero

Cuestiones relacionadas