首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Xstream - OptaPlanner

Xstream - OptaPlanner
EN

Stack Overflow用户
提问于 2015-04-12 22:04:33
回答 1查看 489关注 0票数 0

我在尝试使用optaplanner OSGI。在Java标准环境中,我对Vehiclerouting示例进行了缓冲,以便在没有UI的情况下运行它,而且一切都很好。之后,我为这个项目做了一个OSGI包,但是当它启动时,我从Xstream获得了这个错误。

代码语言:javascript
复制
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)

此异常是从以下代码段引发的:

代码语言:javascript
复制
     @Override
    protected Solver createSolver() {
       File solver = new File(SOLVER_CONFIG);
       SolverFactory solverFactory =SolverFactory.createFromXmlFile(solver);

       return solverFactory.buildSolver();
}`

谷歌I说这是一个与OSGI上的Xtream和Class加载有关的问题,有人建议将Xstream封装在使用它的包中。但在我的例子中,Xstream metodhs由第三部分包(Optaplanner)调用。

我怎样才能解决这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-20 22:30:10

我想我解决了这个问题。

所以,我有三包:

  • XStream (束A)
  • OptaPlanner,org.optaplanner.core.config.solver.SolverConfig就是(Bundle 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显然不能导入该类,所以我需要在Bundle B的pom.xml中添加<DynamicImport-Package>*</DynamicImport-Package>。通过这种方式,OptaPlanner可以在运行时加载它所需的一切。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29595177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档