【发布时间】: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 中选择一个的正确方法是什么?
编辑
-
只添加JDK中真正需要的系统包
在这种情况下这是不可能的,因为我正在编写一个框架,而不是一个应用程序 (Drombler FX)。
-
从 default.properties 中的 org.osgi.framework.system.packages 系统属性中排除 javax.annotations
实际上,我已经尝试过了,因为无论如何我在框架中有一个 default.properties 的副本。它起作用了,但它似乎更像是一种 hack,并且在我需要升级此文件时增加了维护工作。此外,如果 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 仍然支持它,您如何看待这种方法?
还有其他方法吗?
【问题讨论】:
标签: java maven jakarta-ee osgi cdi