首页 文章

捆绑包和 jar 之间的OSGI和maven依赖关系

提问于
浏览
2

我有一个关于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 回答

  • 1

    那是因为你的一个OSGI包正在使用commons日志中的东西,这不是osgi中的导出包 . 因此,您要么找到捆绑的commons-logging版本并导出您尝试使用的包,要么将jar添加到用户包的bundle-classpath(还有其他更脏的选项) . 第一种选择比第二种选择要好得多,因为它是模块化的;即你可以在不改变任何其他捆绑的情况下更新公共记录 .

    就像已经提到的那样,它在app类路径中的事实是无关紧要的

  • 0

    使用getSystemClassLoader打印出加载的jar并不一定告诉你OSGi可用的内容 - 记住OSGi有它自己的类加载机制 .

    据我所知,commons-logging必须是来自其他一些bundle的 exported ,这样OSGi就可以将它连接到你的A.X组件 - 可能有公共日志的包或功能,你可以轻松添加为依赖 .

    我不确定你正在使用哪个OSGi容器(我使用Fuse),但应该有一些方法来查看你正在使用的bundle的导入和导出 . 由于A.X导入commons-logging,另一个bundle需要导出它(具有适当的版本) .

    在融合世界中,向系统包添加依赖关系就像将其添加到features.xml文件一样简单 . 但是因为我没有使用,我不知道你怎么能这样做 .

    这有帮助吗?

相关问题