OSGi:javax.annotation冲突:JavaSE与JavaEE
在JavaSEOSGi(ApacheFelix)环境中,我尝试使用PaxCDI和Weld 2.2.6.Final集成CDI 我当前遇到以下错误:OSGi:javax.annotation冲突:JavaSE与JavaEE,java,maven,jakarta-ee,osgi,cdi,Java,Maven,Jakarta Ee,Osgi,Cdi,在JavaSEOSGi(ApacheFelix)环境中,我尝试使用PaxCDI和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.Bun
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])
我认为这是因为JavaSE(v8)已经定义了一个包“javax.annotation”,但JavaEE(v7)用更多注释指定了同一个包
然而,“javax.annotation”已经作为系统包由系统包导出(org.apache.felix:org.apache.felix.framework:jar:4.2.1)
在这种情况下,让OSGi从JavaEE中选择的正确方法是什么
编辑
还有其他方法吗?Java的一个大问题是,越来越多的包被放入JDK中,而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核心包。对于Equinox,这些软件包不必列出(我认为这很好,因为osgi核心软件包不应该是系统软件包配置的一部分)。谢谢您的回答。请看我更新的问题。