2017-07-05 50 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'指令来仅打包所需的内容,并排除您不需要的导入。这样你就会得到一些表现更一致的东西。 –