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