【问题标题】:Xstream - OSGI - OptaPlannerXstream - OSGI - OptaPlanner
【发布时间】:2015-06-18 03:56:51
【问题描述】:

我正在尝试使用 optaplanner OSGI-core。 在 Java 标准环境中,我自定义了 Vehiclerouting 示例,以便在没有 UI 的情况下运行它并且一切正常。之后我为这个项目制作了一个 OSGI 包,但是当它启动时我从 Xstream 收到这个错误。

com.thoughtworks.xstream.mapper.CannotResolveClassException: org.optaplanner.core.config.solver.SolverConfig
at com.thoughtworks.xstream.mapper.DefaultMapper.realClass(DefaultMapper.java:79)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.DynamicProxyMapper.realClass(DynamicProxyMapper.java:55)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.PackageAliasingMapper.realClass(PackageAliasingMapper.java:88)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.ClassAliasingMapper.realClass(ClassAliasingMapper.java:79)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.ArrayMapper.realClass(ArrayMapper.java:74)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)

从这段代码的 sn-p 引发异常:

     @Override
    protected Solver createSolver() {
       File solver = new File(SOLVER_CONFIG);
       SolverFactory solverFactory =SolverFactory.createFromXmlFile(solver);

       return solverFactory.buildSolver();
}`

谷歌搜索我发现这是与 Xtream 和 OSGI 上的类加载有关的问题,有人建议将 Xstream 包装在使用它的包中。但在我的情况下,Xstream 方法由第 3 部分捆绑包(Optaplanner-core)调用。

我该如何解决这个问题?

【问题讨论】:

标签: osgi xstream optaplanner apache-servicemix


【解决方案1】:

我想我解决了这个问题。

所以,我有 3 个捆绑包:

  • XStream (捆绑 A)
  • OptaPlanner-Core,这是org.optaplanner.core.config.solver.SolverConfig 所在的位置 (捆绑 B)
  • 我的代码使用SolverFactory.createFromXmlResource() (Bundle C)

现在,当 Bundle B 调用 xStream.fromXML (https://github.com/droolsjbpm/optaplanner/blob/2a0c40283c8b8a068d24c40297581ff2c597bf1e/optaplanner-core/src/main/java/org/optaplanner/core/impl/solver/XStreamXmlSolverFactory.java#L117) 时,它需要解析 SolverConfig.class (https://github.com/droolsjbpm/optaplanner/blob/master/optaplanner-core/src/main/java/org/optaplanner/core/impl/solver/XStreamXmlSolverFactory.java#L51)。

但是,在 OSGI 环境中,XStream 存在于隔离的 Classloader 中,因此 Bundle A 无法访问 Bundle B 的组件。也就是说,要使 XStream 工作,我必须在初始化后调用 Xstream.setClassloader(getclass().getClassloader())

最后,XStream 必须解析我在solver.xml 中声明的类,并且这个类在Bundle C 中。但是由于OptaPlanner-Core 显然不能导入该类,我需要在Bundle 中添加<DynamicImport-Package>*</DynamicImport-Package> B 的 pom.xml。通过这种方式,OptaPlanner 可以在运行时加载它需要的所有内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-11
    • 2015-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多