我在尝试使用optaplanner OSGI。在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)此异常是从以下代码段引发的:
@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)调用。
我怎样才能解决这个问题?
发布于 2015-04-20 22:30:10
我想我解决了这个问题。
所以,我有三包:
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可以在运行时加载它所需的一切。
https://stackoverflow.com/questions/29595177
复制相似问题