【问题标题】:Third party bundle imports and uses any version of a package exported by system bundle第三方捆绑包导入并使用系统捆绑包导出的任何版本的包
【发布时间】:2014-05-11 08:47:08
【问题描述】:

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

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

有什么办法可以解决这个问题?

【问题讨论】:

    标签: java osgi equinox


    【解决方案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 包,这些包可以安全地从包中分离和使用。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 你知道我可以在哪里为第谷设置这个属性吗?另外,有没有一种方法可以让我从一个位置为 Tycho 和 Eclipse 配置它?
      • 尝试将其设置为系统属性。我不熟悉 Tycho(我在 Eclipse 中使用 Bndtools 进行 OSGi 开发),但总的来说,如果你能找到设置系统属性的方法,它会起作用。
      猜你喜欢
      • 2012-06-29
      • 2018-09-29
      • 2020-07-15
      • 1970-01-01
      • 2018-12-21
      • 1970-01-01
      • 1970-01-01
      • 2017-07-13
      • 2019-07-07
      相关资源
      最近更新 更多