Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 第三方包导入并使用系统包导出的包的任何版本_Java_Osgi_Equinox - Fatal编程技术网

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

Java 第三方包导入并使用系统包导出的包的任何版本,java,osgi,equinox,Java,Osgi,Equinox,我有两个第三方包,它们都依赖于javax.transaction包。此软件包由系统包导出为版本0.0.0。其中一个捆绑包导入包的任何版本,并将其声明为导出包的uses约束。另一个捆绑包明确要求版本1.1.0。此包由另一个包提供 我自己的捆绑包需要两个第三方捆绑包。但是,由于首先解析系统捆绑包,因此接受任何版本的第三方捆绑包都与版本0.0.0相关联。因此,包使用冲突就产生了 解决此问题的选项有哪些?选项1: 在导入javax.transaction的每个包中向导入包追加一个版本。我不建议这样做。:

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

我自己的捆绑包需要两个第三方捆绑包。但是,由于首先解析系统捆绑包,因此接受任何版本的第三方捆绑包都与版本0.0.0相关联。因此,包使用冲突就产生了


解决此问题的选项有哪些?

选项1:

在导入javax.transaction的每个包中向导入包追加一个版本。我不建议这样做。:)

选项2:

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

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

因为javax.transaction.xa仅从javax.sql使用,而javax.sql不从任何其他数据库使用
JDK包,这些包可以安全地从捆绑包中分离和使用。

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

因此,您可以删除提供包的“其他捆绑包”(如果它提供的不仅仅是这个包,也可以修改它),或者您可以修改框架导出的包列表。规范中有一个名为“org.osgi.framework.system.packages”的属性来执行此操作,它列出了所有这些包,因此您可以创建一个排除此包的新列表


正如Balazs所说,我会远离boot delegation,但从您的描述来看,您没有使用它。

您知道我可以在哪里为Tycho设置此属性吗?还有,有没有一种方法可以让我从一个位置为Tycho和Eclipse配置它?尝试将它设置为系统属性。我不熟悉Tycho(我在Eclipse中使用Bndtools进行OSGi开发),但一般来说,如果您能找到一种设置系统属性的方法,它就会工作。