繁体   English   中英

OSGi:javax.annotation 冲突:Java SE 与 Java EE

[英]OSGi: javax.annotation conflict: Java SE vs Java EE

在 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 的副本。 它起作用了,但它看起来更像是一种黑客行为,并且在我需要升级此文件时增加了维护工作。 此外,如果 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 的一大问题是,越来越多的包被放入 JDK,这些包应该是具有自己版本控制生命周期的独立项目。 这不会在整体项目中引起问题,但会在 OSGi 中造成痛苦。

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

如果有一个 org.osgi.framework.system.packages.exclude 系统属性,但遗憾的是它不存在,可以快速修复。

一个缓慢的解决方案是,如果您指定没有包的org.osgi.framework.system.packages并且您会一一找到您实际需要的包。 您会惊讶地发现您需要的包裹少了。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM