Java 第三方包导入并使用系统包导出的包的任何版本
我有两个第三方包,它们都依赖于javax.transaction包。此软件包由系统包导出为版本0.0.0。其中一个捆绑包导入包的任何版本,并将其声明为导出包的uses约束。另一个捆绑包明确要求版本1.1.0。此包由另一个包提供 我自己的捆绑包需要两个第三方捆绑包。但是,由于首先解析系统捆绑包,因此接受任何版本的第三方捆绑包都与版本0.0.0相关联。因此,包使用冲突就产生了Java 第三方包导入并使用系统包导出的包的任何版本,java,osgi,equinox,Java,Osgi,Equinox,我有两个第三方包,它们都依赖于javax.transaction包。此软件包由系统包导出为版本0.0.0。其中一个捆绑包导入包的任何版本,并将其声明为导出包的uses约束。另一个捆绑包明确要求版本1.1.0。此包由另一个包提供 我自己的捆绑包需要两个第三方捆绑包。但是,由于首先解析系统捆绑包,因此接受任何版本的第三方捆绑包都与版本0.0.0相关联。因此,包使用冲突就产生了 解决此问题的选项有哪些?选项1: 在导入javax.transaction的每个包中向导入包追加一个版本。我不建议这样做。:
解决此问题的选项有哪些?选项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开发),但一般来说,如果您能找到一种设置系统属性的方法,它就会工作。