我有一个关于OSGI Bundles和“普通”maven jar依赖关系的问题 .
以下场景:
一个多模块maven项目:A
使用A.X,A.M模块:
A.X是一个OSGI捆绑包
A.M是普通的java应用程序,它启动OSGI框架并加载包A.X.
在项目顶级pom(A.pom)中我定义了对commons-logging-1.1.1的依赖关系然后我在OSGI Bundle A.X中使用了commons-logging . maven-bundle-plugin为A.X生成清单,其中包含导入'commons-logging'的导入条目 .
当我启动A.M并在控制台上打印出所有加载的jar(使用getSystemClassLoader ...)时,会列出../../../commons-logging-1.1.1.jar . 由于来自顶级pom的maven依赖性 .
现在我尝试安装我的OSGI包A.X并获得“bundle ..... commons-logging”中的“未解决的约束”异常 .
为什么在安装捆绑包时,可以使用已在内存中的commons-logging lib(在A.M中)来解析commons-logging依赖(来自A.X)?
我很感激任何帮助!!!!
2 回答
那是因为你的一个OSGI包正在使用commons日志中的东西,这不是osgi中的导出包 . 因此,您要么找到捆绑的commons-logging版本并导出您尝试使用的包,要么将jar添加到用户包的bundle-classpath(还有其他更脏的选项) . 第一种选择比第二种选择要好得多,因为它是模块化的;即你可以在不改变任何其他捆绑的情况下更新公共记录 .
就像已经提到的那样,它在app类路径中的事实是无关紧要的
使用getSystemClassLoader打印出加载的jar并不一定告诉你OSGi可用的内容 - 记住OSGi有它自己的类加载机制 .
据我所知,commons-logging必须是来自其他一些bundle的
exported
,这样OSGi就可以将它连接到你的A.X组件 - 可能有公共日志的包或功能,你可以轻松添加为依赖 .我不确定你正在使用哪个OSGi容器(我使用Fuse),但应该有一些方法来查看你正在使用的bundle的导入和导出 . 由于A.X导入commons-logging,另一个bundle需要导出它(具有适当的版本) .
在融合世界中,向系统包添加依赖关系就像将其添加到features.xml文件一样简单 . 但是因为我没有使用,我不知道你怎么能这样做 .
这有帮助吗?