2017-07-05 52 views
0

我想讓optaplanner 6.5.0在osgi環境中工作。 我必須安裝下列軟件包來獲取所有依賴解析:osgi中的optaplanner

OptaPlanner coreorg.optaplanner.core               6.5.0.201610181310 
XStream Corexstream                    1.4.9 
Apache Commons Mathorg.apache.commons.math3              3.4.1 
Drools :: Compilerorg.drools.compiler               6.5.0.201610181300 
Drools :: Coreorg.drools.core                 6.5.0.201610181300 
KIE :: Public APIorg.kie.api                 6.5.0.201610181259 
KIE :: Internalorg.kie.internalapi                6.5.0.201610181259 
Protocol Buffer Java APIcom.google.protobuf              2.6.0 
mvel2org.mvel2                     2.2.8.Final 
Apache ServiceMix :: Bundles :: javax.injectorg.apache.servicemix.bundles.javax-inject   1.0.0.2 
XML Pull Parsing APIorg.xmlpull.v1                1.1.4.redhat-1 
Apache ServiceMix :: Bundles :: xpp3org.apache.servicemix.bundles.xpp3       1.1.4.c 
Apache ServiceMix :: Specs :: Activation API 1.4org.apache.servicemix.specs.activation-api-1.1 2.0.0 
Apache ServiceMix :: Bundles :: jaxb-xjcorg.apache.servicemix.bundles.jaxb-xjc     2.2.4.1 
Apache ServiceMix :: Specs :: JAXB API 2.2org.apache.servicemix.specs.jaxb-api-2.2    2.9.0 
Apache ServiceMix :: Specs :: Stax API 1.0org.apache.servicemix.specs.stax-api-1.0    2.9.0 
Apache ServiceMix :: Bundles :: jaxb-implorg.apache.servicemix.bundles.jaxb-impl    2.2.11.1 
Apache ServiceMix :: Bundles :: reflectionsorg.apache.servicemix.bundles.reflections   0.9.11.1 
OptaPlanner persistence commonorg.optaplanner.persistence.common        6.5.0.201610181310 
Sling Metrics :: CQ Fragmentcom.github.digital-wonderland.sling-metrics.cq-metrics-fragment  0.1.0 
Guava: Google Core Libraries for Javacom.google.guava           18.0.0 

當測試一個簡單的例子,其中有通過JUnit測試工作,我得到以下錯誤:

java.lang.NoClassDefFoundError: com/google/common/base/Predicate 
    at org.optaplanner.core.config.domain.ScanAnnotatedClassesConfig.buildSolutionDescriptor(ScanAnnotatedClassesConfig.java:69) 
    at org.optaplanner.core.config.solver.SolverConfig.buildSolutionDescriptor(SolverConfig.java:278) 
    at org.optaplanner.core.config.solver.SolverConfig.buildSolver(SolverConfig.java:229) 
    at org.optaplanner.core.impl.solver.AbstractSolverFactory.buildSolver(AbstractSolverFactory.java:52) 
    at com.bekaert.handling.allocation.optimizer.impl.OptimizerTest.before(OptimizerTest.java:55) 
    at com.bekaert.handling.allocation.optimizer.impl.TestAllocationOptimizerImpl.activate(TestAllocationOptimizerImpl.java:14) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)[:1.8.0_25] 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)[:1.8.0_25] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)[:1.8.0_25] 
    at java.lang.reflect.Method.invoke(Unknown Source)[:1.8.0_25] 
    at org.apache.felix.scr.impl.helper.BaseMethod.invokeMethod(BaseMethod.java:231)[4:org.apache.felix.scr:1.8.2] 
    at org.apache.felix.scr.impl.helper.BaseMethod.access$500(BaseMethod.java:39)[4:org.apache.felix.scr:1.8.2] 
    at org.apache.felix.scr.impl.helper.BaseMethod$Resolved.invoke(BaseMethod.java:624) 
    at org.apache.felix.scr.impl.helper.BaseMethod.invoke(BaseMethod.java:508)[4:org.apache.felix.scr:1.8.2] 
    at org.apache.felix.scr.impl.helper.ActivateMethod.invoke(ActivateMethod.java:149)[4:org.apache.felix.scr:1.8.2] 
    at org.apache.felix.scr.impl.manager.SingleComponentManager.createImplementationObject(SingleComponentManager.java:315)[4:org.apache.felix.scr:1.8.2] 
    at org.apache.felix.scr.impl.manager.SingleComponentManager.createComponent(SingleComponentManager.java:127)[4:org.apache.felix.scr:1.8.2] 
    at org.apache.felix.scr.impl.manager.SingleComponentManager.getService(SingleComponentManager.java:871)[4:org.apache.felix.scr:1.8.2] 
    at org.apache.felix.scr.impl.manager.SingleComponentManager.getServiceInternal(SingleComponentManager.java:838)[4:org.apache.felix.scr:1.8.2] 
    at org.apache.felix.scr.impl.manager.AbstractComponentManager.activateInternal(AbstractComponentManager.java:850)[4:org.apache.felix.scr:1.8.2] 
    at org.apache.felix.scr.impl.manager.AbstractComponentManager.enable(AbstractComponentManager.java:419)[4:org.apache.felix.scr:1.8.2] 
    at org.apache.felix.scr.impl.config.ConfigurableComponentHolder.enableComponents(ConfigurableComponentHolder.java:376)[4:org.apache.felix.scr:1.8.2] 
    at org.apache.felix.scr.impl.BundleComponentActivator.initialize(BundleComponentActivator.java:172)[4:org.apache.felix.scr:1.8.2] 
    at org.apache.felix.scr.impl.BundleComponentActivator.<init>(BundleComponentActivator.java:120)[4:org.apache.felix.scr:1.8.2] 
    at org.apache.felix.scr.impl.Activator.loadComponents(Activator.java:258)[4:org.apache.felix.scr:1.8.2] 
    at org.apache.felix.scr.impl.Activator.access$000(Activator.java:45)[4:org.apache.felix.scr:1.8.2] 
    at org.apache.felix.scr.impl.Activator$ScrExtension.start(Activator.java:185)[4:org.apache.felix.scr:1.8.2] 
    at org.apache.felix.utils.extender.AbstractExtender.createExtension(AbstractExtender.java:259)[4:org.apache.felix.scr:1.8.2] 
    at org.apache.felix.utils.extender.AbstractExtender.modifiedBundle(AbstractExtender.java:232)[4:org.apache.felix.scr:1.8.2] 
    at org.osgi.util.tracker.BundleTracker$Tracked.customizerModified(BundleTracker.java:479)[4:org.apache.felix.scr:1.8.2] 
    at org.osgi.util.tracker.BundleTracker$Tracked.customizerModified(BundleTracker.java:414)[4:org.apache.felix.scr:1.8.2] 
    at org.osgi.util.tracker.AbstractTracked.track(AbstractTracked.java:232)[4:org.apache.felix.scr:1.8.2] 
    at org.osgi.util.tracker.BundleTracker$Tracked.bundleChanged(BundleTracker.java:443)[4:org.apache.felix.scr:1.8.2] 
    at org.apache.felix.framework.util.EventDispatcher.invokeBundleListenerCallback(EventDispatcher.java:869)[org.apache.felix.framework-4.4.1.jar:] 
    at org.apache.felix.framework.util.EventDispatcher.fireEventImmediately(EventDispatcher.java:790)[org.apache.felix.framework-4.4.1.jar:] 
    at org.apache.felix.framework.util.EventDispatcher.fireBundleEvent(EventDispatcher.java:515)[org.apache.felix.framework-4.4.1.jar:] 
    at org.apache.felix.framework.Felix.fireBundleEvent(Felix.java:4429)[org.apache.felix.framework-4.4.1.jar:] 
    at org.apache.felix.framework.Felix.startBundle(Felix.java:2100)[org.apache.felix.framework-4.4.1.jar:] 
    at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:976)[org.apache.felix.framework-4.4.1.jar:] 
    at aQute.launcher.Launcher.update(Launcher.java:436)[biz.aQute.launcher-latest.jar:] 
    at aQute.launcher.Launcher$1.run(Launcher.java:194)[biz.aQute.launcher-latest.jar:] 
    at java.util.TimerThread.mainLoop(Unknown Source)[:1.8.0_25] 
    at java.util.TimerThread.run(Unknown Source)[:1.8.0_25] 
Caused by: java.lang.ClassNotFoundException: com.google.common.base.Predicate not found by org.apache.servicemix.bundles.reflections [205] 
    at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1556)[org.apache.felix.framework-4.4.1.jar:] 
    at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:77)[org.apache.felix.framework-4.4.1.jar:] 
    at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1993)[org.apache.felix.framework-4.4.1.jar:] 
    at java.lang.ClassLoader.loadClass(Unknown Source)[:1.8.0_25] 
    ... 43 more 

我注意到在org.apache.servicemix.bundles.reflections包中,import-package com.google.common.base是可選的。 這意味着它甚至應該能夠在沒有該包的情況下工作? 我無法刪除com.google.guava包,因爲它是org.optaplanner.core包所必需的。

我還可以嘗試做些什麼其他事情?其他人已經設法讓optaplanner在osgi環境中工作?

最好的問候, 的Sigi

+0

您是否正在使用optaplanner docs章節中介紹的關於OSGi的osgi features.xml? –

回答

1

What I noticed is that in the org.apache.servicemix.bundles.reflections bundle the import-package com.google.common.base is optional. This means it should even be able to work without that package?

從理論上講,這是事實。但是通常當你看到resolution:=optional用於導入的包,它的意思是一個或多個:

  • 這是通過一個工具產生的,我真的沒有檢查什麼它正在做
  • 該包只用於某些代碼路徑,但不是真正的可選。如果你沿着任何這些代碼路徑,它會在運行時爆炸
  • 我只是想讓我的軟件包更容易解決,並不明白軟件包確實是需要的。

從你看到的問題,我猜這是一些只在某些代碼路徑上需要的包。

What other things can I try to make this work? Anyone else already managed to get optaplanner working in an osgi environment?

從堆棧跟蹤它看起來好像這個配置過程中出現故障,所以您可以通過避免這破功能配置解決該問題。您也可以安裝實際提供com.google.common.base的捆綁包,以滿足可選的導入。

另一種方法是完全重新打包庫,確保您獲得正確的OSGi元數據。您還可以將其他庫(或庫的一部分)嵌入到這個重新打包的包中,以限制其導入的包的集合和/或解決反射類加載導致問題的地方。

+0

optaplanner的OSGi配置在這裏定義:https://github.com/kiegroup/optaplanner/blob/master/optaplanner-core/pom。xml#L95 –

0

我得到它爲我們的案件工作。我將所有的二進制文件封裝在一個包中,並使一些導入可選。

我們使用BndTools。 .bnd文件如下所示:

Bundle-Version: 6.5.0.${tstamp} 
Service-Component: \ 
    * 
Export-Package: \ 
    org.optaplanner.core.api.*,\ 
    org.optaplanner.core.impl.*,\ 
    org.optaplanner.core.config.*; 
Include-Resource: \ 
    @binaries/annotations-2.0.1.jar,\ 
    @binaries/antlr-runtime-3.5.jar,\ 
    @binaries/commons-codec-1.4.jar,\ 
    @binaries/commons-io-2.1.jar,\ 
    @binaries/commons-lang3-3.1.jar,\ 
    @binaries/commons-math3-3.4.1.jar,\ 
    @binaries/drools-compiler-6.5.0.Final.jar,\ 
    @binaries/drools-core-6.5.0.Final.jar,\ 
    @binaries/ecj-4.4.2.jar,\ 
    @binaries/freemarker-2.3.19.jar,\ 
    @binaries/guava-13.0.1.jar,\ 
    @binaries/javassist-3.18.1-GA.jar,\ 
    @binaries/jcommon-1.0.23.jar,\ 
    @binaries/jfreechart-1.0.19.jar,\ 
    @binaries/kie-api-6.5.0.Final.jar,\ 
    @binaries/kie-internal-6.5.0.Final.jar,\ 
    @binaries/mvel2-2.2.8.Final.jar,\ 
    @binaries/optaplanner-benchmark-6.5.0.Final.jar,\ 
    @binaries/optaplanner-core-6.5.0.Final.jar,\ 
    @binaries/optaplanner-persistence-common-6.5.0.Final.jar,\ 
    @binaries/optaplanner-persistence-xstream-6.5.0.Final.jar,\ 
    @binaries/protobuf-java-2.6.0.jar,\ 
    @binaries/reflections-0.9.10.jar,\ 
    @binaries/slf4j-api-1.7.2.jar,\ 
    @binaries/xmlpull-1.1.3.1.jar,\ 
    @binaries/xpp3_min-1.1.4c.jar,\ 
    @binaries/xstream-1.4.9.jar 

Import-Package: \ 
    com.bea.xml.stream;resolution:=optional,\ 
    com.google.gson;resolution:=optional,\ 
    com.sun.codemodel;resolution:=optional,\ 
    com.sun.jdi;resolution:=optional,\ 
    com.sun.jdi.connect;resolution:=optional,\ 
    com.sun.jdi.event;resolution:=optional,\ 
    com.sun.jdi.request;resolution:=optional,\ 
    com.sun.org.apache.xml.internal.utils;resolution:=optional,\ 
    com.sun.org.apache.xpath.internal;resolution:=optional,\ 
    com.sun.org.apache.xpath.internal.objects;resolution:=optional,\ 
    com.sun.tools.xjc;resolution:=optional,\ 
    com.sun.tools.xjc.model;resolution:=optional,\ 
    com.sun.tools.xjc.outline;resolution:=optional,\ 
    javax.el;resolution:=optional,\ 
    javax.enterprise.context;resolution:=optional,\ 
    javax.enterprise.context.spi;resolution:=optional,\ 
    javax.enterprise.event;resolution:=optional,\ 
    javax.enterprise.inject;resolution:=optional,\ 
    javax.enterprise.inject.spi;resolution:=optional,\ 
    javax.inject;resolution:=optional,\ 
    javax.enterprise.util;resolution:=optional,\ 
    javax.servlet.jsp;resolution:=optional,\ 
    javax.servlet.jsp.el;resolution:=optional,\ 
    javax.servlet.jsp.tagext;resolution:=optional,\ 
    net.sf.cglib.proxy;resolution:=optional,\ 
    nu.xom;resolution:=optional,\ 
    org.antlr.stringtemplate;resolution:=optional,\ 
    org.apache.commons.vfs2;resolution:=optional,\ 
    org.apache.log;resolution:=optional,\ 
    org.apache.tools.ant;resolution:=optional,\ 
    org.apache.tools.ant.taskdefs;resolution:=optional,\ 
    org.apache.tools.ant.taskdefs.compilers;resolution:=optional,\ 
    org.apache.tools.ant.types;resolution:=optional,\ 
    org.apache.tools.ant.util;resolution:=optional,\ 
    org.apache.xml.utils;resolution:=optional,\ 
    org.apache.xpath;resolution:=optional,\ 
    org.apache.xpath.objects;resolution:=optional,\ 
    org.codehaus.janino;resolution:=optional,\ 
    org.codehaus.janino.util;resolution:=optional,\ 
    org.codehaus.janino.util.enumerator;resolution:=optional,\ 
    org.codehaus.janino.util.resource;resolution:=optional,\ 
    org.codehaus.jettison;resolution:=optional,\ 
    org.codehaus.jettison.mapped;resolution:=optional,\ 
    org.dom4j;resolution:=optional,\ 
    org.dom4j.io;resolution:=optional,\ 
    org.dom4j.tree;resolution:=optional,\ 
    org.eclipse.jdt.core.index;resolution:=optional,\ 
    org.eclipse.jdt.core.util;resolution:=optional,\ 
    org.jaxen;resolution:=optional,\ 
    org.jaxen.dom;resolution:=optional,\ 
    org.jaxen.dom4j;resolution:=optional,\ 
    org.jaxen.jdom;resolution:=optional,\ 
    org.jdom;resolution:=optional,\ 
    org.jdom.input;resolution:=optional,\ 
    org.jdom.output;resolution:=optional,\ 
    org.jdom2;resolution:=optional,\ 
    org.jdom2.input;resolution:=optional,\ 
    org.joda.time;resolution:=optional,\ 
    org.joda.time.format;resolution:=optional,\ 
    org.kxml2.io;resolution:=optional,\ 
    org.mozilla.javascript;resolution:=optional,\ 
    org.python.core;resolution:=optional,\ 
    org.python.util;resolution:=optional,\ 
    org.slf4j.impl;resolution:=optional,\ 
    org.w3c.dom.traversal;resolution:=optional,\ 
    org.zeroturnaround.javarebel;resolution:=optional,\ 
    sun.misc;resolution:=optional,\ 
    * 

也許這不是這樣做的最好方法。但是我們可以在我們的osgi環境中使用這個包,我們的車輛路徑問題正在按照預期得到解決。

+0

這是正確的方法,但通常不建議使用可選的導入數量。您應該查看'-conditionalpackage'指令來僅打包所需的內容,並排除您不需要的導入。這樣你就會得到一些表現更一致的東西。 –