我有一个完美运行的OSGI包,我添加了S3
依赖项,S4
一个轻量级maven
库,在部署到unirest
时,我得到了一个HTTP
:
serviceMix
当然我在我的包中使用该包,但就serviceMix而言,该库只是我missing requirement
中的类,就像我自己的类
我想我在这里错过了什么
我知道filter:="(osgi.wiring.package=com.mashape.unirest.http)"
图书馆是可能的,但我不明白为什么需要额外的操作?如何将该库添加为maven classpath
非常感谢任何文章/文档的答案和指示
答案 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配置,则需要合并它们。)
另一种方法是通过包装将unirest-java部署为bundle。 这可能就像将其复制到deploy文件夹一样简单: https://karaf.apache.org/manual/latest/#_wrap_deployer 这将具有共享unirest-java的优势。
最后,如果unirest自己加载了类,那么这可能会与osgi不兼容。