我熟悉 Spring OSGI 和 Blueprint,但遇到了“类路径”困难(就像许多新手一样)。
我有两个 OSGI 包——一个定义了各种 bean(使用蓝图,没关系)并将它们作为服务导出;以及另一个引用服务 bean 的包(使用 Spring OSGI)并将它们插入到一些 Apache Camel 路由中。
服务提供者捆绑包的蓝图如下所示:
<service id="camelTsvDataFormat"
interface="org.apache.camel.spi.DataFormat">
<bean class="org.apache.camel.component.flatpack.FlatpackDataFormat"/>
</service>
服务消费者包的 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 捆绑插件一起使用?