第三方捆绑包导入并使用系统捆绑包导出的任何版本的包

时间:2014-03-31 20:13:57

标签: java osgi equinox

我有两个第三方捆绑包都依赖于javax.transaction包。该软件包由系统软件包导出为版本0.0.0。其中一个bundle导入任何版本的包,并在其导出的包中将其声明为uses-constraint。另一个捆绑包明确要求版本1.1.0。该软件包由不同的软件包提供。

我自己的捆绑包需要第三方捆绑包。但是,由于首先解析了系统包,因此接受任何版本的第三方软件包将与版本0.0.0连接。结果,一个包使用了冲突。

有哪些方法可以解决这个问题?

2 个答案:

答案 0 :(得分:1)

选项1:

在导入javax.transaction的每个包中将版本附加到Import-Package。我不建议这样做。 :)

选项2:

不要在引导委派中导入javax.transaction包。这也是我们所做的。您可以设置应通过org.osgi.framework.system.packages系统变量导入的软件包。要查看示例,请在this pom文件中的变量中查找名称。有一个felix的例子和一个用于equinox的例子。

使用此选项,您可能遇到javax.sql依赖于javax.transaction.xa包的问题。在这种情况下,您可以从可用的here(JDBC版本4.0.0)的捆绑包中使用javax.sql。当然,您也必须从引导委派中排除javax.sql包(示例将它们排除在外)。

因为javax.transaction.xa仅用于javax.sql而javax.sql不用于任何其他 JDK包,可以安全地分离这些包并从包中使用。

答案 1 :(得分:1)

您基本上有两个捆绑包(系统捆绑包和其他捆绑包)导出此包。如果两种情况下包的内容相同,最简单的解决方案是只提供一次。由于您的某个消费包至少需要1.1.0版,因此您应该确保至少导出该版本,或者更改您的消费者以接受任何版本。

所以你可以删除"其他包"提供包(或在它提供的不仅仅是这个包的情况下修改它),或者你可以修改框架导出的包列表。规范中有一个属性叫做" org.osgi.framework.system.packages"列出了所有这些包,因此您可以创建一个不包含此包的新列表。

就像Balazs所说的那样,我会远离启动委托,但从您的描述来看,您并没有使用它。

相关问题