Problèmes avec maven construit OSGi y compris les dépendances
Je suis en train de commencer avec OSGi, iPOJO et iPOJO Annotations et d'essayer de construire un simple composant à être déployée dans les Felix. Malheureusement, je suis tomber sur divers problèmes, qui me prennent des heures à résoudre ou à qui je ne peux même pas résoudre après de perdre des heures, comme suit:
Je veux utiliser une bibliothèque existante dans mon bundle OSGi qui nous construire à l'aide de Maven. La bibliothèque est actuellement pas "OSGI-identifiés" et nous n'envisageons pas de le faire à moyen terme. À cause de cela, je veux inclure cette librairie et toutes ses dépendances dans l'ensemble, à l'aide de ...:
<Embed-Dependency>*</Embed-Dependency>
<Embed-Transitive>true</Embed-Transitive>
Ce que j'ai maintenant, est le suivant pom.xml fichier pour le composant OSGi:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>foo</groupId>
<artifactId>samplecomponent</artifactId>
<packaging>bundle</packaging>
<version>0.0.1-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<compilerArgument>-Xlint:all</compilerArgument>
<showWarnings>true</showWarnings>
<source>1.6</source>
<target>1.6</target>
<compilerArguments>
<encoding>UTF-8</encoding>
</compilerArguments>
<showDeprecation>true</showDeprecation>
<verbose>true</verbose>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<version>2.3.6</version>
<configuration>
<instructions>
<Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
<Embed-Dependency>*</Embed-Dependency>
<Embed-Transitive>true</Embed-Transitive>
<Embed-Directory>lib</Embed-Directory>
<Export-Package>*</Export-Package>
<_exportcontents>*</_exportcontents>
</instructions>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-ipojo-plugin</artifactId>
<version>1.6.0</version>
<executions>
<execution>
<goals>
<goal>ipojo-bundle</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.apache.felix</groupId>
<artifactId>org.apache.felix.ipojo.annotations</artifactId>
<version>1.8.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>foo</groupId>
<artifactId>mylibrary</artifactId>
<version>1.2.3</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
Le bundle fichier jar est construit sans aucun problème, mais lors du déploiement et de départ de l'ensemble sur Apache Felix, j'obtiens l'erreur suivante:
g! install file:/…/samplecomponent-0.0.1-SNAPSHOT.jar
Bundle ID: 8
g! start 8
org.osgi.framework.BundleException: Unresolved constraint in bundle samplecomponent [8]: Unable to resolve 8.0: missing requirement [8.0] osgi.wiring.package; (osgi.wiring.package=com.sun.jdmk.comm)
J'ai mis le niveau de journalisation pour le plus haut niveau de verbosité, rien de plus malheureusement. Quand j'ai supprimer mylibrary, le bundle est démarré sans problèmes.
Des suggestions apprécié!
OriginalL'auteur qqilihq | 2012-02-15
Vous devez vous connecter pour publier un commentaire.
Apparemment, la bibliothèque utilise
com.sun.jdmk.comm
, ce qui n'est pas exposée à partir du cadre de bundle. Vous pouvez le vérifier cette question si vous en avez vraiment besoin, ou l'exclure les importations en les mettant dans une instruction supplémentaire,<Import-Package>*;resolution:=optional</Import-Package>
Maintenant je l'ai eu à travailler comme prévu 🙂Hm, bon de voir que vous êtes le problème est résolu, mais
resolution:=optional
doit être utilisé uniquement dans les moments de grande détresse: vous saper le OSGi résoudre mécanisme en faisant cela, puisque vous marque tous importer à titre d'option. Je préfère quelque chose comme!com.sun.*,*
.Ok, je vais garder cela à l'esprit pour l'avenir, merci pour l'avertissement. Mais dans l'exemple ci-dessus, le problème, c'est que de nouvelles manquant dépendances non résolues ont été popping up pour les différents espaces de noms, de faire une énorme liste d'exclusion.
Le problème avec votre solution proposée est que TOUS les colis, les importations sont maintenant marquées comme étant facultatives. Si vous vous apprêtez à le faire, pourquoi même pas la peine d'utiliser OSGi?
Il y a un manque de fermeture de slash dans le dernier <Import-Package> tag...
OriginalL'auteur Angelo van der Sijpt
Si vous vous retrouvez avec une énorme liste d'exclusion, vous devriez probablement prendre cela comme un signe que quelque chose ne va pas avec votre processus de création et le bundle.
Si c'était moi, la première chose que je ferais est le crack ouvrir votre bundle et regardez quelles classes, il comprend, et que les paquets qu'il exporte. Je soupçonne que vous avez une assez massive bundle, ce qui signifie que votre bundle dépendances vont être assez vaste. Cela signifie que vous perdez beaucoup de la modularité des prestations d'OSGi, et il peut causer beaucoup de problèmes pratiques.
Tout moment vous déclarez un package optionnel, vous êtes en train de dire " je suis heureux d'accepter ClassDefNotFoundExceptions pour les classes de ce package.' Pour votre code, vous pouvez probablement savoir si un package est vraiment facultatif, mais il est assez compliqué de deviner lequel des paquets utilisés par un tiers sont en option. Ceci, bien sûr, c'est pourquoi la pré-bundleised pots sont plus pratique, mais je constate que ce n'est pas d'une grande aide pour vous. 🙂
Ce que vous faites par l'intégration de la troisième partie de la bibliothèque est bundleising, mais d'une manière qui n'est pas réutilisable. (L'autre différence, c'est qu'il va partager un chargeur de classe avec l'incorporation de bundle, ce qui pourrait rendre les choses fonctionnent beaucoup mieux si la troisième partie de la bibliothèque tente de charger votre classées par réflexion, par exemple.) Puisque vous rencontrez des problèmes avec les dépendances, je serais enclin à prendre le coup de l'ajout d'une étape de génération qui encapsule la troisième partie jar, de sorte que vous pouvez voir clairement les classes et les dépendances liées à votre code, et qui pour cette extra jar.
L'autre chose que je regarde est votre package d'exportation=* clause. Cela permettra d'exporter chaque paquet sur votre chemin de classe, ce qui signifie que tous les paquets sont construits dans votre pot. Et vous obtenez tout leur forfait importations, trop. Votre pauvre bundle devient une application, plutôt que le lean OSGi module que vous espériez. Vous devriez limiter votre exportations au strict minimum (vous voulez garder vos entrailles privé, et vous ne voulez certainement pas être le partage de tous les autres viscères).
--
OSGi dans l'Action: http://www.manning.com/cummins
Export-Package
à l'essentiel. Ce que je n'ai pas entièrement compris, c'est votre suggestion "[...] prendre le coup de l'ajout d'une étape de génération qui encapsule la troisième partie jar, de sorte que vous pouvez voir clairement les classes et les dépendances liées à votre code, et qui à ce surplus de pot." - pouvez-vous élaborer sur ce point?Il ya quelques façons de le faire, mais la plupart utilisent le même mécanisme qui le maven bundle plugin est à l'aide de sous les couvertures, bnd. Vous pouvez télécharger bnd comme un outil de ligne de commande et puis il suffit d'appeler 'bnd wrap [yourjar]', avec une option de fichier bnd pour affiner les choses comme le nom du bundle, les importations et les exportations. Alternativement, vous pouvez utiliser maven pour le faire (google 'maven bundle envelopper objectif"). Ceux-ci devraient à la fois vous donner, sacrément vite, une version de votre pot avec OSGi métadonnées. Ensuite, vous pouvez regarder à l'intérieur, vérifiez que vous n'avez traîné dans les classes à partir du pot lui-même, et de consulter l'ensemble des importations sont sensibles.
Holly, désolé pour la réponse tardive et merci pour votre astuce. Très apprécié!
OriginalL'auteur Holly Cummins