OSGI包中的依赖项问题

时间:2017-01-20 11:49:01

标签: java maven osgi apache-servicemix

我有一个完美运行的OSGI包,我添加了S3依赖项,S4一个轻量级maven库,在部署到unirest时,我得到了一个HTTP

serviceMix

当然我在我的包中使用该包,但就serviceMix而言,该库只是我missing requirement中的类,就像我自己的类

我想我在这里错过了什么

我知道filter:="(osgi.wiring.package=com.mashape.unirest.http)" 图书馆是可能的,但我不明白为什么需要额外的操作?如何将该库添加为maven classpath

,这有何不同?

非常感谢任何文章/文档的答案和指示

1 个答案:

答案 0 :(得分:1)

在maven和osgi中处理依赖关系的方式有所不同。 Maven将依赖关系视为单个类路径/类加载器,其中每个jar的类都可以从其他jar访问类。 这是主要应用程序的历史,也是maven运行单元测试的方式。

在osgi运行时环境中,每个bundle都有自己的类加载器,默认情况下,只能访问嵌入在自己的bundle中的类和jar。 除非从一个包中导出包并导入到另一个包中,否则每个包中的类都是隔离的。

maven bundle插件试图填补空白。仅仅向maven添加依赖是不够的,还必须告诉maven bundle插件如何打包和部署它。选项包括:1)将依赖项嵌入到bundle中,或者2)将依赖项作为单独的bundle进行部署。 maven bundle插件默认为选项2:导入所有内容。

为了更好地理解依赖项的导出,我建议查看bundle jar中的manifest文件。 (META-INF / MANIFEST.MF) 我只是查看了maven central上的unirest jar,发现没有在清单中导出的包。实际上unirest没有包头,所以它不是osgi包。

错误消息  缺少要求:filter:="(osgi.wiring.package = com.mashape.unirest.http)" 表示您的包正在尝试导入包,但servicemix没有包导出它。 为了更好地理解这一点,我建议您查看捆绑jar中的清单文件。 (META-INF / manifest.mf)我希望它包含com.mashape.unirest.http的导入。另请查看servicemix以查看是否有任何导出它: 来自try:exports |的命令grep com.mashape.unirest.http 我希望你找不到捆绑导出它。

我建议你配置maven bundle插件来嵌入unirest而不是导入它。像这样:

<Embed-Dependency>unirest-java</Embed-Dependency>

(如果您已经有Embed-Dependency配置,则需要合并它们。)

参考。 http://felix.apache.org/documentation/subprojects/apache-felix-maven-bundle-plugin-bnd.html#detailed-how-to

另一种方法是通过包装将unirest-java部署为bundle。 这可能就像将其复制到deploy文件夹一样简单: https://karaf.apache.org/manual/latest/#_wrap_deployer 这将具有共享unirest-java的优势。

最后,如果unirest自己加载了类,那么这可能会与osgi不兼容。