2009-04-18 8 views
0

J'essaie de créer un service OSGi qui enveloppe un autre pot. J'ai ajouté le jar au projet, le classpath et la construction binaire. J'ai enregistré le service dans l'activateur mais quand l'ensemble consommant appelle le service j'obtiens un java.lang.NoClassDefFoundError sur le pot d'emballage. Est-ce que quelqu'un a une idée de ce que je fais mal ici?Service OSGi envelopper un pot

Merci d'avance.

Répondre

2

Exportez-vous les paquets requis par le consommateur, ainsi que tous ceux dont l'implémentation a besoin. Le consommateur devra importer tout ce qui sera référencé.

En remarque, la création d'un ensemble de cette manière ne fonctionne pas bien dans Eclipse pour le développement (fonctionne bien pour l'exécution). Si vous essayez de référencer une classe ou une interface dans le fichier jar à partir d'un autre projet OSGi, l'EDI ne résoudra rien puisqu'il ne peut pas "voir" les fichiers dans le fichier jar. Le pot doit être développé dans le bundle pour que tout soit visible (dans l'EDI). Eclipse crée automagiquement les références de classpath appropriées en fonction des importations et des exportations à des fins de génération. Sans le fichier jar dans le bundle, vous devrez maintenir explicitement ce classpath.

+0

J'ai déjà utilisé lib jars dans des bundles OSGi, mais pas avec un service leur déléguant. Je pense que je comprends maintenant - merci beaucoup! – javamonkey79

0

Avez-vous utilisé Bundle-Classpath dans le manifeste? Pourquoi n'utilisez-vous pas bnd pour un pot existant?

+0

Oui, j'utilise Bundle-Classpath. Je n'utilise pas bnd car il s'agit d'une application de démonstration - c'est plus pour l'instruction que l'utilisation réelle. J'aimerais savoir pourquoi le problème ne se limite pas à la simple pression. Est-ce dû aux chemins de classes séparés, par ex. le consommateur ne peut pas voir les fournisseurs embarqués jar lib? Autre chose? – javamonkey79

1

Votre comportement peut avoir plusieurs raisons. Pour vous assurer, je vérifier les points suivants:

  • supposant que vous travaillez avec contrôle Eclipse si vous avez inclus le pot dans l'onglet « Build » de l'éditeur manifeste, ainsi que souligné ce pot très à l'intérieur l'onglet "Runtime" sous "Classpath".

  • le paquet créé: contient-il le pot? Est-ce qu'il a l'en-tête "Bundle-ClassPath" pointant vers le jar, comme: "Bundle-ClassPath: lib/myLibrary.jar ,." (le dernier est nécessaire pour inclure les classes provenant du répertoire racine du bundle - votre activateur fi)

  • assurez-vous que le fichier contient réellement toutes les dépendances requises ou les exprime via des en-têtes Import-Package dans le bundle d'emballage . Eclipse a un "Assistant d'importation" pour cela. L'outil bnd mentionné ci-dessus fait de même en passant. Espérons que cela aide ...

+0

Je ne l'essayais pas en construisant tout le chemin, je courais juste d'Eclipse. Cependant, quand je l'ai empaqueté le lib lib est dans le paquet et c'était dans le manifeste: Bundle-ClassPath:., Lib/the_jar_that_is_failing.jar J'ai couru le dossier d'installation sur l'ensemble et ai mis à jour le pot de consommateur. À ce stade, le pot de consommation n'a pas été démarré. Quand j'essaie de le démarrer, j'obtiens l'exception. Je connaissais BND, mais j'espérais apprendre ce que je fais de mal par opposition à 'juste le réparer' :) – javamonkey79

Questions connexes