Java 如何使用不同于依赖项所需版本的包?

Java 如何使用不同于依赖项所需版本的包?,java,osgi,jira-plugin,Java,Osgi,Jira Plugin,我试图构建一个OSGI包,但遇到了以下问题: 让我们称我的插件为“p”。现在,P依赖于另一个插件“D”;它需要使用它导出的一些接口。同时,我想在插件P中使用库“L”的版本2。然而,D也使用L,只是它取决于库的版本1。版本1由容器提供 问题是,L的类和接口都没有出现在D的API中,至少我正在使用的类和接口都没有。也就是说,P和D各自在内部使用L中的类,但它们从不交换它们 因此,据我所知,只要我提供我自己的Lv2副本,他们中的每一个人使用不同版本的L应该是完全安全的。然而,我不能为我的生活想出如何使

我试图构建一个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告诉我它有一个L的导入包;版本=[1,2]

我尝试的捆绑指令组合都无法实现这一点。无论我做什么,D都会得到L的v2,这会导致“约束冲突”BundleException归咎于D,或P的类得到了L的v1,这导致运行我的代码时出现NoClassDefFoundError。顺便说一句,我的代码没有显式使用缺少的类,它只是被另一个L包中的类用作静态成员


有什么想法吗?

标准答案是。这意味着您必须首先将D分解为自己的可构建插件,并使用它自己的pom.xml和atlassian-plugin.xml让我们称这个新插件为DP。在DP中,您需要创建一个with来导出插件p需要使用的任何服务,然后添加p来获得它们

由于您没有D的源代码,最终将D作为.JAR包含在DP中。您可能还需要在其上编写一个简单的垫片。公共组件需要在定义中指定一个接口,这意味着您可能需要编写一个接口,如果您想在D中访问的服务只是类而不是接口


在这种情况下,p和DP都可以列出他们自己正确的导入集,他们可以指定他们需要的库的任何版本。

我不确定我是否误解了你的答案,或者你是否误解了我的问题,但这听起来不对。D已经是一个OSGI插件,它有公共组件,我通过组件导入导入t、 我没有试图捆绑D,我只是从中导入包。我正在尝试捆绑L,据我所知我不能,因为D导入了L的不同版本。为了清晰起见,P是我的插件,D是Greenhhopper,L是Guava,OSGI上下文是JIRA。JIRA本身提供Guava v11或10,具体取决于Greenhhopper导入的版本带[10,11]的ts版本绑定。我正在尝试使用Guava v18。它不起作用,即使没有任何Guava对象通过我的插件和Greenhopper之间的接口进行交换。@bogdanb本身也是一个插件吗?我知道你只是想捆绑L,但在最初的描述中,听起来像是D在做OSGi导入L,而ch暗示可能是这样?我看到我们的评论在半空中交叉。谢谢你的澄清。我会看看下一次我回到办公桌时是否可以看这个,因为我知道我以前在类似的背景下捆绑过番石榴。@bogdanb,你提到GH在你的插件中包含番石榴v18时会得到捆绑例外。你什么时候开始请在日志中看到这一点?服务应该只在捆绑激活时匹配GH,这意味着我只希望在系统启动时或en/禁用GH本身时看到这一点,而不是在您的插件中看到这一点。您是否会意外地将GH捆绑到插件中?请检查您的JAR以确保。如果您构建了一次GH依赖项中没有提供,即使你以后添加它,GH仍然会被包含,直到你使用核武器攻击目标/职业。