¿Cómo puedo compartir bibliotecas que no sean OSGi entre paquetes en un contenedor OSGi?

StackOverflow https://stackoverflow.com/questions/1235129

  •  22-07-2019
  •  | 
  •  

Pregunta

Me encontré con esta pregunta cuando tratando de compartir los paquetes de Struts entre varios paquetes dentro de un contenedor OSGi. Quería evitar tanto la duplicación de dependencias dentro de los paquetes como la introducción de una nueva dependencia entre ellos (haciendo que un paquete exporte sus dependencias internas para que el otro las comparta).

Resulta que la respuesta es muy fácil si usa Maven, y si no lo hace, aún puede usar 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 publicaré un ejemplo aquí.

¿Fue útil?

Solución 2

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

La creación del paquete se realiza creando un proyecto que tiene la biblioteca como una dependencia y luego empaquetando el proyecto usando el maven-bundle-plugin del Proyecto Apache Felix y especificando los paquetes de la biblioteca con la instrucción Export-Package . Utilicé esto para compartir Buffers de protocolo de Google entre paquetes 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 se incluyan también en el paquete, use el objetivo bundleall del complemento.

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

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

Otros consejos

Una ruta adicional para aquellos que no están tan interesados ??en Maven, que no pueden portar, o que están perfectamente contentos con Ant / Hiedra

He descubierto que la forma más fácil de realizar la tarea indicada es convertir la biblioteca que no es OSGi en una biblioteca OSGi permitiendo que el manifiesto exporte cada paquete y agregue algunos nombres / versiones simbólicos apropiados. He podido hacer esto MUY fácilmente con bnd a través de tareas ant (o incluso línea de comando directa invocación). También hay repositorios que contienen " osgi-ified " versión de muchas bibliotecas populares. Algunas bibliotecas (joda-time) ya se envían con los manifiestos OSGi correctos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top