在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中选择一个吗?
修改
仅添加JDK中真正需要的系统包
在这种情况下,这是不可能的,因为我正在编写框架,而不是应用程序(Drombler FX)。
从default.properties中的org.osgi.framework.system.packages系统属性中排除javax.annotations
实际上,我已经尝试过,因为我在框架中有一个default.properties的副本。它工作,但它似乎更像是一个黑客,并在我需要升级此文件时增加维护工作。此外,如果Maven Bundle Plugin在编译时检查导出的包(我会欢迎),当他们想要使用javax.annotations时,人们将不得不开始向他们的项目添加额外的依赖项,因为该包将由系统导出包裹了。 我希望找到更好的解决方案。
使用背书的机制
这看起来是迄今为止最干净的解决方案,但我仍然希望能够避免这种情况,因为它会增加应用程序的打包复杂性。
现在,我刚刚检查了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中仍然支持它,您对此方法有何看法?
还有其他方法吗?
答案 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软件包不应该是系统软件包配置的一部分)。