Printemps OSGI service référence les interfaces doivent être importés de façon explicite par la consommation de bundle?

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

Question

Je suis de se familiariser avec le Printemps OSGI et le Plan, mais j'ai du "classpath" des difficultés (comme beaucoup de débutants).

J'ai deux ensembles OSGI qui définit les différents haricots (à l'aide de Plan, pas qu'il devrait avoir de l'importance) et les exportations comme des services;et d'un autre bundle qui fait référence au service de haricots (à l'aide de Printemps OSGI) et les bouchons dans certains Apache Camel routes.

Le prestataire de service du bundle Plan ressemble à quelque chose comme ceci:

<service id="camelTsvDataFormat" 
    interface="org.apache.camel.spi.DataFormat"> 
    <bean class="org.apache.camel.component.flatpack.FlatpackDataFormat"/> 
</service> 

Le service consommateurs du bundle Printemps contexte ressemble à quelque chose comme ceci:

<osgi:reference id="tsvDataFormat" 
    interface="org.apache.camel.spi.DataFormat" /> 

<camel:camelContext> 
    <route> 
        <from uri="vm:in"> 
        <setBody> 
            <constant>SELECT * FROM myTable</constant> 
        </setBody> 
        <to uri="jdbc:myDataSource" /> 
        <marshal ref="tsvDataFormat" /> 
        <to uri="file:/path/to/my/files/?fileName=out.tsv" /> 
    </route> 
</camel:camelContext> 

... Mais lors du déploiement, le Printemps Ne peut pas trouver la classe [org.apache.à dos de chameau.le spi.Format]".Je peux ajouter à l'interface de l'Import-Package section de mon Bnd instructions, mais il semble superflu d'manuellement la liste de la classe deux fois dans des endroits différents.

Un autre choix est d'étendre l'interface au sein de mon propre projet afin d'Bnd détectera automatiquement, mais c'est à peu près autant de problèmes.

Je crois que je vais attendre le Printemps pour la recherche de services par le nom de l'interface sans avoir à résoudre l'interface de la classe.Est-ce naïf?Ou est-il un moyen d'avoir Bnd importer automatiquement des interfaces dans mon appContext du service de références?Si Bnd peut le faire (p. ex.à l'aide de plugins), est-il un moyen standard d'utiliser le Bnd plugins avec Apache Felix bundle plugin Maven?

Était-ce utile?

La solution

Comme suggère holly, BND trouverait normalement ce paquet référencé de tout bytecode à l'intérieur de votre paquet qui l'invoque.Il devrait également intrusion de fichiers XML Spring-DM si elles sont à droite.Cependant, je ne sais pas si cela prend en charge les fichiers XML de Blueprint XML de la même manière, car ils ne sont pas dans le même endroit.Il peut donc être nécessaire de mettre à niveau votre version de BND ou d'utiliser un plugin prenant en charge le plan directeur.

Cependant, je me méfie de tout cela.S'il n'y a pas de références de bytecode à l'interface, il semble que vous n'utilisez même pas la référence de service?Dans ce cas, pourquoi ne pas simplement l'enlever?

Autres conseils

Comme @Neil Bartlett a indiqué, Bnd doit connaître le fonctionnement de Printemps et le Plan directeur des fichiers dans l'emplacement standard dans le bundle (META-INF/spring et OSGI-INF/blueprint).J'avais remplacé manuellement ces META-INF/spring/*.xml et OSGI-INF/blueprint/*.xml dans mon POMPON.J'ai pensé que c'était très bien depuis le Printemps et le Plan diluants dans ma plate-forme OSGI accepté les en-têtes et bootstraped les containers respectifs.Bnd, cependant, semble s'attendre à une simplification de la tête, sans globs (voir SpringXMLType.java).Je ne veux pas attribuer la faute, puisque c'est un outil formidable, mais celui-ci m'a pris au dépourvu.

De toute façon, depuis mon Printemps et le Plan d'annotations sont déjà dans la norme, j'ai juste enlevé la redondant Bnd instructions de mon POMPON, et tous les Printemps-DM de service référence les interfaces ont été magiquement ramassé et Import-Package'd dans mon bundle:

<plugin>
    <groupId>org.apache.felix</groupId>
    <artifactId>maven-bundle-plugin</artifactId>
    <version>2.3.6</version>
    <extensions>true</extensions>
    <configuration>
        <instructions>
            <Bundle-Version>${project.version}.${buildNumber}</Bundle-Version>
            <Bundle-Activator>com.example.BundleActivator</Bundle-Activator>
            <!-- 
                <Spring-Context>META-INF/spring/*.xml</Spring-Context> 
                <Bundle-Blueprint>OSGI-INF/blueprint*.xml</Bundle-Blueprint> 
            -->
        </instructions>
    </configuration>
</plugin>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top