编程语言
首页 > 编程语言> > java – 必须通过使用bundle显式导入Spring OSGI服务引用接口?

java – 必须通过使用bundle显式导入Spring OSGI服务引用接口?

作者:互联网

我正在熟悉Spring OSGI和Blueprint,但我遇到了“类路径”困难(就像许多新手一样).

我有两个OSGI包 – 一个定义各种bean(使用Blueprint,而不是它应该重要)并将它们作为服务导出;和另一个引用服务bean的bundle(使用Spring OSGI)并将它们插入到一些Apache Camel路由中.

服务提供程序包的Blueprint看起来像这样:

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

service-consumer bundle的Spring上下文看起来像这样:

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

…但是在部署时,Spring“无法找到类[org.apache.camel.spi.DataFormat]”.我可以将接口添加到我的Bnd指令的Import-Package部分,但是必须在不同的位置手动列出两次类似乎是多余的.

另一种选择是在我自己的项目中扩展接口,以便Bnd自动接收它,但这几乎同样麻烦.

我想我希望Spring能够通过接口名称查找服务而无需实际解析接口类.这个天真吗?或者有没有办法让Bnd自动导入我的appContext服务引用中的接口?如果Bnd可以做到这一点(例如使用插件),是否有一种标准方法可以将Bnd插件与Maven的Apache Felix捆绑插件一起使用?

解决方法:

正如Holly建议的那样,bnd通常会从包中调用它的任何字节码中找到这个包.如果它们位于正确的位置,它还应该反省Spring-DM XML文件.但是我不知道它是否以相同的方式支持Blueprint XML文件,因为它们不在同一个bundle位置.因此,可能需要升级您的bnd版本或使用支持Blueprint的插件.

但是,我对这一切都很怀疑.如果没有对接口的字节码引用,那么您似乎甚至没有使用服务引用?在那种情况下,为什么不删除它?

标签:java,spring,osgi,spring-dm,bnd
来源: https://codeday.me/bug/20190626/1292319.html