运行 模块路径上的 OptaPlanner

Running OptaPlanner on the module path

我想在模块路径上创建我的 OptaPlanner 项目运行。

我根据文档中的云平衡演示创建了一个示例存储库 (mwkroening/optaplanner-modulepath-example)。

示例项目在类路径上 运行 运行良好,但是在尝试使其 运行 在模块路径上时存在一个我无法解决的问题。您可以在 PR #1.

中看到目前的进度

solverConfig.xml 中指定的 scoreDrl 加载失败,出现以下异常:

Exception in thread "main" java.lang.IllegalArgumentException: The scoreDrl (io/github/mwkroening/optaplannermodulepathexample/cloudBalancingScoreRules.drl) does not exist as a classpath resource in the classLoader (jdk.internal.loader.ClassLoaders$AppClassLoader@7c16905e).
    at org.optaplanner.core@7.18.0.Final/org.optaplanner.core.config.score.director.ScoreDirectorFactoryConfig.buildDroolsScoreDirectorFactory(ScoreDirectorFactoryConfig.java:519)
    at org.optaplanner.core@7.18.0.Final/org.optaplanner.core.config.score.director.ScoreDirectorFactoryConfig.buildScoreDirectorFactory(ScoreDirectorFactoryConfig.java:351)
    at org.optaplanner.core@7.18.0.Final/org.optaplanner.core.config.solver.SolverConfig.buildSolver(SolverConfig.java:255)
    at org.optaplanner.core@7.18.0.Final/org.optaplanner.core.impl.solver.AbstractSolverFactory.buildSolver(AbstractSolverFactory.java:61)
    at io.github.mwkroening.optaplannermodulepathexample/io.github.mwkroening.optaplannermodulepathexample.App.main(App.java:14)

我之前调用SolverFactory.createFromXmlResource时遇到过类似的异常。 我解决这个问题的方法是调用:

SolverFactory.createFromXmlInputStream(
  App.class.getResourceAsStream("cloudBalancingSolverConfig.xml"));

我查看了 PLANNER-883 and psiroky/optaplanner-cloudbalancing-jdk9,但我认为在那种情况下使用了类路径资源,而不是模块路径中的资源。

我该如何解决这个问题? 也许我应该打开一个问题而不是在这里发布这个,对吗?

每个 SolverFactory.createFrom*(...) 都有一个接受 classloader 的重载方法:SolverFactory.createFrom*(..., classloader)。 class 加载程序不仅用于加载 XML 资源,还用于加载 DRL 资源。

所以尝试:

SolverFactory.createFromXmlResource("/.../cloudBalancingSolverConfig.xml",
    App.class.getClassLoader())

我自己还没有测试过,但如果它有效,我很乐意看到它添加到 the "jigsaw" section in the manual(欢迎 PR :)。