web-dev-qa-db-fra.com

OSGI - gestion des fichiers JAR tiers requis par un bundle

Je commence tout juste le développement OSGI et j'ai du mal à comprendre comment gérer au mieux les fichiers JAR dépendants.

par exemple, si je crée un bundle, il est probable que j'aurai besoin d'utiliser quelques JAR tiers. Lorsque je crée mon bundle JAR pour le déployer sur OSGI, il est évident que ces JAR tiers ne sont pas inclus et donc le bundle ne fonctionnera pas.

Je comprends qu'une option consiste à transformer ces fichiers JAR en bundles et à les déployer également dans le conteneur OSGI. Cependant, s'ils ne doivent être utilisés que par le seul paquet, cela ne semble pas idéal.

Quelle est la meilleure solution à cela? Les fichiers JAR peuvent-ils être intégrés dans le fichier JAR de l'ensemble et, dans l'affirmative, cette approche est-elle raisonnable?

39
William

Je regrouperais presque toujours chaque pot séparément. OSGi lui-même est destiné à la modularisation et vous prenez le système entier ad absurdum en ne le faisant pas.

Si vous souhaitez convertir des fichiers JAR en bundles, vous pouvez utiliser l'outil BND écrit par Peter Kriens . Mais d'abord, je vous suggère de rechercher le bundle dans le SpringSource Enterprise Bundle Repository s'ils n'ont pas déjà fait le travail pour vous.

27
Roland Schneider

Vous pouvez inclure un pot tiers dans votre bundle en ajoutant le pot tiers au répertoire racine du fichier de pot bundle, puis en ajoutant un en-tête de chemin de classe de bundle au manifeste du bundle, par exemple:

Bundle-ClassPath: .,my3rdparty.jar

Si vous souhaitez placer un fichier tiers dans un sous-répertoire, spécifiez le chemin sans utiliser l'en-tête ./, par exemple

Bundle-ClassPath: .,lib/my3rdparty.jar # (not ./lib/my3rdparty.jar)
40
William

Il est possible d'incorporer des dépendances non OSGi dans le bundle.

Un moyen simple de le faire est d'utiliser Maven pour gérer vos dépendances et Maven Bundle Plugin pour construire votre bundle. Jetez un oeil à la <Embed-Dependency> et <Embed-Transitive> instructions du plugin Maven Bundle décrites dans la section Incorporation des dépendances de la page de documentation du plug-in.

Comme Roland l'a souligné, ce n'est pas une solution idéale par rapport aux intentions d'OSGi, à savoir la modularisation et la réutilisation de modules individuels. Cependant, cela pourrait être une solution pragmatique pour le moment jusqu'à ce que les dépendances tierces puissent être converties en bundles OSGi.

9
Pavol Juhos

Ce fil est un peu ancien, mais je voulais souligner l'une des limites de l'intégration des dépendances. Rappelez-vous que les dépendances sont au niveau du fichier JAR, mais lorsque vous exportez des packages, certaines peuvent provenir des dépendances intégrées. Si cela se produit, vous vous retrouverez avec des classes en double, un ensemble en ligne dans le bundle de niveau supérieur et un autre dans le pot intégré. Bien sûr, vous pouvez incorporer l'intégralité du bocal intégré, mais avant de le savoir, cela se propage à travers toute votre chaîne de dépendance. Ce n'est là qu'un des problèmes auxquels Roland et d'autres se réfèrent.

6
Ed Ost

Voici un exemple si vous utilisez Maven Bundle Plugin .

Remarque: ce plugin importe automatiquement les packages dont vos dépendances ont besoin. Cela peut ou non être un problème pour vous. Heureusement, vous pouvez supprimer les packages que vous n'avez pas vraiment besoin d'importer (voir ci-dessous).

    <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
shreyas