用于焊接 cdi 的 Apache felix 和 org.osgi - 违反约束

Posted

技术标签:

【中文标题】用于焊接 cdi 的 Apache felix 和 org.osgi - 违反约束【英文标题】:Apache felix and org.osgi for weld cdi - constraint violation 【发布时间】:2015-06-17 23:42:11 【问题描述】:

我想做以下解决方案:Apache Felix + Weld for Java SE。为此,我想运行焊接档案中的一个示例——weld-osgi-paint。现在我有以下捆绑列表:

cdi-api.jar
ops4j-base-lang-1.5.0.jar
pax-swissbox-core-1.8.0.jar
weld-osgi-paint-core.jar
org.apache.felix.scr-1.8.2.jar
pax-swissbox-lifecycle-1.8.0.jar
weld-osgi-paint-square.jar
javax.annotation-api-1.2.jar
org.apache.servicemix.bundles.javax-inject-1_2.jar
pax-swissbox-tracker-1.8.0.jar
weld-osgi-paint-triangle.jar
javax.el-api-2.2.4.jar
pax-cdi-api-0.11.0.jar
slf4j-api-1.7.6.jar
xbean-bundleutils-4.1.jar
javax.interceptor-api-1.2.jar
pax-cdi-extension-0.11.0.jar
slf4j-log4j12-1.7.2.jar
log4j-1.2.17.jar
pax-cdi-spi-0.11.0.jar
weld-osgi-paint-api.jar
org.osgi.compendium-4.3.1.jar
org.osgi.core-4.3.1.jar

我得到以下信息:

org.osgi.framework.BundleException:使用约束违规。无法 解决捆绑修订 org.ops4j.pax.cdi.extension [9.0] 因为 它从包修订中暴露给包“org.osgi.framework” org.apache.felix.framework [0] 和 osgi.core [2.0] 通过两个依赖 链。

链 1:org.ops4j.pax.cdi.extension [9.0] 导入:(&(osgi.wiring.package=org.osgi.framework)(version>=1.7.0)(!(version>=2.0.0))) | 导出:osgi.wiring.package=org.osgi.framework org.apache.felix.framework [0]

链 2:org.ops4j.pax.cdi.extension [9.0] 导入:(&(osgi.wiring.package=org.osgi.util.tracker)(version>=1.5.0)(!(version>=2.0.0))) | 导出:osgi.wiring.package=org.osgi.util.tracker;用途:=org.osgi.framework osgi.cmpn [3.0] 导入:(osgi.wiring.package=org.osgi.framework) | 导出:osgi.wiring.package=org.osgi.framework osgi.core [2.0]

还有这个

... 引起:java.lang.ClassCastException: org.apache.felix.scr.impl.Activator 不能转换为 org.osgi.framework.BundleActivator 在 org.apache.felix.framework.Felix.createBundleActivator(Felix.java:4177)

据我了解,问题是 pax cdi 需要 org.osgi,它不适用于 apache felix。如何解决这样的问题?

编辑 1 当我不安装 org.osgi.core 我有以下异常,因为 org.osgi.service.packageadmin 在 org.osgi.core 中。

org.osgi.framework.BundleException:捆绑中未解决的约束 org.ops4j.pax.cdi.extension [8]:无法解析 8.0:缺失 要求 [8.0] osgi.wiring.package; (&(osgi.wiring.package=org.ops4j.pax.cdi.spi)(version>=0.11.0)(!(version>=1.0.0))) [原因:无法解决 9.0:缺少要求 [9.0] osgi.wiring.package; (&(osgi.wiring.package=org.apache.xbean.osgi.bundle.util)(version>=3.18.0)(!(version>=5.0.0))) [原因:无法解决 16.0:缺少要求 [16.0] osgi.wiring.package; (&(osgi.wiring.package=org.osgi.service.packageadmin)(version>=1.2.0)(!(version>=2.0.0)))]] 在 org.apache.felix.framework.Felix.resolveBundleRevision(Felix.java:3826) 在 org.apache.felix.framework.Felix.startBundle(Felix.java:1868) 在 org.apache.felix.framework.BundleImpl.start(BundleImpl.java:944) 在 org.apache.felix.framework.BundleImpl.start(BundleImpl.java:931) 在 com.techsenger.launcher.core.se.all.Launcher.startBundles(Launcher.java:146) 在 com.techsenger.launcher.core.se.all.Launcher.main(Launcher.java:60)

编辑 2 我没有说我使用 org.apache.felix.framework-4.0.3.jar。正如 Christian Schneider 所说,我通过删除 org.osgi.core 包解决了这个问题。之后我以这种方式将必要的包添加到系统包中:

 String SYSTEM_PACKAGES = 
        "org.osgi.framework;version=\"1.8\"," + 
        "org.osgi.service.packageadmin;version=\"1.8\","+
        "org.osgi.framework.wiring;version=\"1.8\","+
        "javax.swing,javax.management,javax.naming,javax.xml.parsers,"+
        "org.w3c.dom,org.xml.sax,org.xml.sax.helpers";
        configMap.put(Constants.FRAMEWORK_SYSTEMPACKAGES, SYSTEM_PACKAGES);

此外,我还必须使用 pax-cdi-* 的 0.8.0 版和其他一些版本。这就是我得到的:

org.osgi.framework.BundleException:捆绑中未解决的约束 org.jboss.weld.examples.weld-osgi-paint-core [23]:无法解决 23.0:缺少要求 [23.0] osgi.extender; (osgi.extender=pax.cdi) 在 org.apache.felix.framework.Felix.resolveBundleRevision(Felix.java:3826) 在 org.apache.felix.framework.Felix.startBundle(Felix.java:1868) 在 org.apache.felix.framework.BundleImpl.start(BundleImpl.java:944) 在 org.apache.felix.framework.BundleImpl.start(BundleImpl.java:931)

如何解决?我安装并启动了weld-se和weld-se-core,但没有帮助。

【问题讨论】:

我很惊讶系统包只导出了 10 个包。其余的 JavaSE 包呢? @Neil Bartlett 我不明白你的问题。我需要这些包来运行很好的示例。他们似乎已经足够了。 一开始它们似乎就足够了,但如果你添加更多功能呢?无论如何,我真的不明白你在做什么,因为 Felix 已经提供了你需要的包...... @Neil Bartlett 我现在正在做的是解决这个问题 - 缺少要求 [23.0] osgi.extender; (osgi.extender=pax.cdi)。你知道怎么解决吗?这是什么意思? 这意味着某些包已经声明了对“pax.cdi”扩展器的要求,但是您还没有安装声明它提供此扩展器的包。我不知道你需要安装什么包,对不起。也许在 PAX 邮件列表上询问。也请回去整理一下包裹,因为你以后只会遇到更大的问题。 【参考方案1】:

问题是 org.osgi.core 已安装。这个jar提供的包也是felix框架提供的。所以干脆不要安装corg.osgi.core jar。

您还需要安装 pax cdi 包。 Weld 本身不提供 cdi 所需的 osgi 支持。

【讨论】:

响应编辑...org.osgi.service.packageadmin 由 Felix 导出,因此您不需要从另一个包中获取它。但是,您尚未指定您使用的 Felix 版本。从您的包中导入至少需要该包的 1.2 版。从 4.0 开始的所有版本的 Felix 都提供了 org.osgi.service.packageadmin 的 1.2 版本,所以看起来你使用的是相当老的东西。

以上是关于用于焊接 cdi 的 Apache felix 和 org.osgi - 违反约束的主要内容,如果未能解决你的问题,请参考以下文章

JBoss EAP 6.2 CDI beans.xml

Seam3 和 Weld CDI 是一回事吗?

Apache Felix 和 Apache Tomcat 有啥区别

OSGi:Apache Felix 和 Apache Karaf 有啥区别?

org.apache.felix.framework-5.6.12源码解析——org.apache.felix.framework文件夹最后的部分

Apache Felix 和 Glassfish V2