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

时间:2013-09-13 10:53:30

标签: java maven dependencies osgi osgi-bundle

我有一个关于OSGI Bundles和“普通”maven jar依赖关系的问题。

以下情形:

多模块maven项目:A

使用模块A.X,A.M:

A.X是OSGI Bundle

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 个答案:

答案 0 :(得分:1)

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

据我所知,commons-logging必须是来自其他捆绑包的exported,以便OSGi可以将其连接到您的AX组件 - 可能有公共日志的捆绑或功能,您可以轻松添加为依赖。

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

在融合世界中,向系统包添加依赖关系就像将其添加到 features.xml 文件一样简单。但由于我不知道你正在使用哪个容器,我不知道你怎么能这样做。

这有帮助吗?

答案 1 :(得分:0)

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

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