2

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

以下场景:

一个多模块maven项目:A

使用模块 AX、AM:

AX 是一个 OSGI 包

AM 是启动 OSGI 框架并加载捆绑包 AX 的普通 java 应用程序

在项目顶级 pom (A.pom) 中,我定义了对 commons-logging-1.1.1 的依赖关系,然后我在我的 OSGI Bundle AX 中使用 commons-logging maven-bundle-plugin 使用导入条目生成 AX 清单'commons-logging' 发生的地方。

当我启动 AM 并在控制台上打印出所有加载的 jars(使用 getSystemClassLoader...)时,会列出 ../../../commons-logging-1.1.1.jar。因为来自顶级 pom 的 maven 依赖。

现在我尝试安装我的 OSGI 捆绑包 AX 并获得“捆绑包中未解决的约束.....commons-logging”异常。

为什么在安装捆绑包时不能使用已经在内存中(在 AM 中)的 commons-logging 库来解决 commons-logging 依赖项(来自 AX)?

我很感激任何帮助!!!!

4

2 回答 2

1

使用 getSystemClassLoader 打印出加载的 jar 并不一定会告诉您可以通过 OSGi 获得什么——请记住,OSGi 有它自己的类加载机制。

据我了解,commons-logging 必须exported来自其他包,以便 OSGi 可以将其连接到您的 AX 组件 - 可能有用于 commons-logging 的包或功能,您可以轻松地将其添加为依赖项。

我不确定您使用的是哪个 OSGi 容器(我使用 Fuse),但应该有一些方法可以查看您正在使用的包的导入和导出。由于 AX 导入 commons-logging,另一个包需要导出它(使用适当的版本)。

在 fuse 世界中,将依赖项添加到系统包就像将其添加到 features.xml文件一样简单。但是由于我不知道您使用的是哪个容器,所以我不确定您如何做到这一点。

这有帮助吗?

于 2013-09-13T11:11:58.073 回答
0

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

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

于 2013-09-13T17:27:50.150 回答