Comment partager des bibliothèques non-OSGi entre des ensembles d'un conteneur OSGi?

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

  •  22-07-2019
  •  | 
  •  

Question

Je suis tombé sur cette question lorsque essayait de partager les packages Struts parmi plusieurs bundles dans un conteneur OSGi. Je voulais éviter à la fois la duplication des dépendances à l'intérieur des bundles et l'introduction d'une nouvelle dépendance entre eux (en faisant en sorte qu'un bundle exporte ses dépendances internes pour que l'autre les partage).

Il s'avère que la réponse est très facile si vous utilisez Maven, et si vous ne l'utilisez pas, vous pouvez toujours utiliser la solution Maven pour apprendre à créer le même résultat avec un autre mécanisme.

J'ai trouvé cette approche utile plusieurs fois au cours de mon projet, je vais donc poster un exemple ici.

Était-ce utile?

La solution 2

Avec Maven, il est très facile de créer un ensemble OSGi à partir de n’importe quelle bibliothèque. Cependant, je pense que le même résultat peut être créé avec d'autres mécanismes. La solution Maven m'a aidé à comprendre comment cela fonctionne.

La création du bundle se fait en créant un projet dont la bibliothèque est une dépendance, puis en empaquetant le projet avec maven-bundle-plugin du Projet Apache Felix et en spécifiant les packages de bibliothèque avec l'instruction Export-Package . Je l’utilisais pour partager des tampons de protocole Google entre des offres groupées dans un conteneur 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 vous souhaitez également que toutes les dépendances transitives soient intégrées à l'ensemble, utilisez l'objectif bundleall du plug-in.

Le plug-in reconnaît et honore les manifestes OSGi existants dans la dépendance.

Vous pouvez également utiliser le plugin bundle pour créer simplement le manifeste et indiquer au plugin d'empaquetage jar (ou à l'assembly intégré jar-avec-dépendances ) d'utiliser ce manifeste via la section archives. La page du plugin liée ci-dessus montre comment faire.

Autres conseils

Un chemin supplémentaire pour ceux qui ne s’intéressent pas vraiment au monde, qui ne peuvent pas mettre en communication ou qui sont parfaitement satisfaits de ant / ivy

J'ai trouvé que le moyen le plus simple d'accomplir la tâche indiquée est de transformer la bibliothèque non OSGi en une bibliothèque OSGi en laissant le manifeste exporter chaque package et d'ajouter quelques noms / versions symboliques appropriés. J'ai été capable de le faire très facilement avec bnd via des tâches ant (ou même en ligne de commande directe). invocation). Il existe également des référentiels contenant le mot-clé "osgi-ified". version de nombreuses bibliothèques populaires. Certaines bibliothèques (joda-time) sont déjà livrées avec les manifestes OSGi corrects.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top