我正在尝试构建一个OSGI包,我遇到了以下问题:
让我们调用我的插件“P”。现在,P依赖于另一个插件“D”;它需要使用它导出的一些接口。同时,我想在插件P中使用库“L”的版本2.但是,D也使用L,除了它取决于库的版本1。版本1由容器提供。
问题是,L的类和接口都没有出现在D的API中(至少没有我正在使用的那些)。也就是说,P和D每个都在内部使用L类,但它们从不交换它们。
因此,据我所知,只要我提供自己的Lv2副本,每个人使用不同版本的L应该是完全安全的。但是,我不能为我的生活弄清楚如何让它发挥作用。
这就是我所拥有的:P的pom.xml对D具有“提供”依赖性,并且具有“编译”依赖性L.我没有D的源代码,但OSGI告诉我它有一个Import-Package对于L;版本= [1,2]。
我试过的捆绑指令的组合可以设法使其工作。无论我做什么,要么得到L的v2,这导致“约束违规”BundleException归咎于D,或者P的类得到L的v1,这导致运行我的代码时出现NoClassDefFoundError。 (顺便说一下,我的代码没有明确地使用缺少的类,它只是作为另一个类在L的不同包中的静态成员使用。)
有什么想法吗?
答案 0 :(得分:0)
规范的答案是build your plugin as an OBR。这意味着您必须首先使用自己的pom.xml
和atlassian-plugin.xm
l将D分成自己的可构建插件(让我们称之为新插件&#34; DP&#34 )。在DP中,您需要创建<component>
(使用public=true
)来导出插件P需要使用的所有服务,然后在P中添加<component-import>
以获取它们。< / p>
由于您没有D的来源,因此您最终会在D中将D包含为.JAR。您可能还需要在其上面编写一个简单的垫片。 (公共组件需要在<component>
定义中指定一个接口,这意味着如果要在D中访问的服务只是类而不是接口,则可能需要编写一个接口。)
在这种情况下,P和DP都可以列出他们自己的正确导入集,他们可以指定他们需要的库的任何版本。