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

时间:2015-04-12 17:13:09

标签: java osgi apache-felix weld

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

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]通过两个依赖   链。

     

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

     

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

和这个

  

...引起:java.lang.ClassCastException:   org.apache.felix.scr.impl.Activator无法强制转换为   org.osgi.framework.BundleActivator at   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:bundle中未解析的约束   org.ops4j.pax.cdi.extension [8]:无法解决8.0:缺失   要求[8.0] osgi.wiring.package;   (及(osgi.wiring.package = org.ops4j.pax.cdi.spi)(版本> = 0.11.0)((版本>!= 1.0.0)))   [由:无法解决9.0:缺少要求[9.0]   osgi.wiring.package;   (及(osgi.wiring.package = org.apache.xbean.osgi.bundle.util)(版本> = 3.18.0)((版本>!= 5.0.0)))   [由:无法解决16.0:缺少要求[16.0]   osgi.wiring.package;   (及(osgi.wiring.package = org.osgi.service.packageadmin)(版本> = 1.2.0)((版本>!= 2.0.0)))]]     在   org.apache.felix.framework.Felix.resolveBundleRevision(Felix.java:3826)     在org.apache.felix.framework.Felix.startBundle(Felix.java:1868)at   org.apache.felix.framework.BundleImpl.start(BundleImpl.java:944)at at   org.apache.felix.framework.BundleImpl.start(BundleImpl.java:931)at at   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);

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

  

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

如何解决?我安装并开始焊接和焊接se-core,但它没有帮助。

1 个答案:

答案 0 :(得分:3)

问题是安装了org.osgi.core。这个jar提供的包也是由felix框架提供的。所以根本不要安装thecorg.osgi.core jar。

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