【问题标题】:OSGi: javax.annotation conflict: Java SE vs Java EEOSGi:javax.annotation 冲突:Java SE 与 Java EE
【发布时间】:2015-01-02 09:27:32
【问题描述】:

在 Java SE OSGi (Apache Felix) 环境中,我正在尝试使用 PAX CDI 和 Weld 2.2.6.Final 集成 CDI。

我目前收到以下错误:

ERROR: Bundle org.jboss.weld.osgi-bundle [45] Error starting file:///someDir/org/jboss/weld/weld-osgi-bundle/2.2.6.Final/weld-osgi-bundle-2.2.6.Final.jar (org.osgi.framework.BundleException: Uses constraint violation. Unable to resolve bundle revision org.jboss.weld.osgi-bundle [45.0] because it is exposed to package 'javax.annotation' from bundle revisions org.jboss.spec.javax.annotation.jboss-annotations-api_1.2_spec [39.0] and org.apache.felix.framework [0] via two dependency chains.

Chain 1:
  org.jboss.weld.osgi-bundle [45.0]
    import: (&(osgi.wiring.package=javax.annotation)(version>=1.1.0))
     |
    export: osgi.wiring.package=javax.annotation
  org.jboss.spec.javax.annotation.jboss-annotations-api_1.2_spec [39.0]

Chain 2:
  org.jboss.weld.osgi-bundle [45.0]
    import: (&(osgi.wiring.package=com.google.common.util.concurrent)(version>=13.0.0))
     |
    export: osgi.wiring.package=com.google.common.util.concurrent; uses:=javax.annotation
  com.google.guava [1.0]
    import: (osgi.wiring.package=javax.annotation)
     |
    export: osgi.wiring.package=javax.annotation
  org.apache.felix.framework [0])

我认为这是因为 Java SE (v8) 已经定义了一个包“javax.annotation”,但 Java EE (v7) 指定了具有更多注释的同一个包。

然而,“javax.annotation”已经被系统包导出为系统包(org.apache.felix:org.apache.felix.framework:jar:4.2.1)。

在这种情况下,让 OSGi 从 Java EE 中选择一个的正确方法是什么?

编辑

  1. 只添加JDK中真正需要的系统包

    在这种情况下这是不可能的,因为我正在编写一个框架,而不是一个应用程序 (Drombler FX)。

  2. 从 default.properties 中的 org.osgi.framework.system.packages 系统属性中排除 javax.annotations

    实际上,我已经尝试过了,因为无论如何我在框架中有一个 default.properties 的副本。它起作用了,但它似乎更像是一种 hack,并且在我需要升级此文件时增加了维护工作。此外,如果 Maven Bundle Plugin 在编译时检查导出的包(我会欢迎),当人们想要使用 javax.annotations 时,他们将不得不开始向他们的项目添加额外的依赖项,因为该包将由系统导出包了。 我希望找到更好的解决方案。

  3. 使用认可的机制

    这看起来是迄今为止最干净的解决方案,但我仍然希望我可以避免这种情况,因为它会增加应用程序打包的复杂性。

现在,我刚刚查看了 Java SE 8 文档,很惊讶 JSR 250 不再被列为认可技术!???它在 Java SE 7 中被列为认可技术。他们真的删除了 Java SE 8 中对 JSR 250 的认可支持,还是文档不正确?

Java SE 8:https://docs.oracle.com/javase/8/docs/technotes/guides/standards/

Java SE 7:https://docs.oracle.com/javase/7/docs/technotes/guides/standards/

如果 Java SE 8 仍然支持它,您如何看待这种方法?

还有其他方法吗?

【问题讨论】:

    标签: java maven jakarta-ee osgi cdi


    【解决方案1】:

    Java 的一个大问题是越来越多的包被放入 JDK 中,这些包应该是具有自己版本控制生命周期的独立项目。这不会在整体项目中造成问题,但会给 OSGi 带来麻烦。

    这就是为什么我们只从 JDK 添加真正需要的系统包,而我们从包中获取所有内容。您会惊讶地发现您实际上需要从 JDK 获得多少软件包。

    如果存在 org.osgi.framework.system.packages.exclude 系统属性但遗憾的是它不存在,则可以快速解决。

    一个缓慢的解决方案是,如果您指定 org.osgi.framework.system.packages 没有包,然后您会逐一找到您实际需要的包。您会惊讶地发现您需要的软件包更少。

    一个更快但更脏的解决方案是,如果你进入 felix.jar,找到 default.properties 并复制 org.osgi.framework.system.packages 的内容 em> 系统属性,不包括 javax.annotation.* 类。当您意识到 javax.transaction.* 包也会遇到同样的问题时,您将需要获取 javax.sql.* 包从一个包...

    遗憾的是,在 felix 中,您必须在系统包列表中列出 osgi-core 包。使用 Equinox,不必列出这些包(我认为这很好,因为 osgi-core 包不应该是系统包配置的一部分)。

    【讨论】:

    • 感谢您的回答。请查看我更新的问题。
    猜你喜欢
    • 2017-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多