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

时间:2014-11-06 00:43:17

标签: java maven java-ee osgi cdi

在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)指定了带有更多注释的相同包。

然而,

&#34; javax.annotation&#34;由系统包(org.apache.felix:org.apache.felix.framework:jar:4.2.1)作为系统包导出。< / p>

在这种情况下,正确的方法是让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/

  4. 如果在Java SE 8中仍然支持它,您对此方法有何看法?

    还有其他方法吗?

1 个答案:

答案 0 :(得分:2)

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软件包不应该是系统软件包配置的一部分)。