我怎样才能通过 "There is an error in a scoreDrl or scoreDrlFile"?

How can I get past "There is an error in a scoreDrl or scoreDrlFile"?

我使用 OpenJDK 11.0.11 和 Optaplanner 8.7.0 编写了一个“最小”应用程序。我正在用 Maven 构建它,运行 它作为一个 jar。

到目前为止一切顺利,因为这适用于 easyScoreCalculatorClass,但一旦我开始使用 Drools,我就无法通过以下错误:

Exception in thread "main" java.lang.IllegalStateException: There is an error in a scoreDrl or scoreDrlFile.
    at org.optaplanner.core.impl.score.director.ScoreDirectorFactoryFactory.buildDroolsScoreDirectorFactory(ScoreDirectorFactoryFactory.java:323)
    at org.optaplanner.core.impl.score.director.ScoreDirectorFactoryFactory.decideMultipleScoreDirectorFactories(ScoreDirectorFactoryFactory.java:108)
    at org.optaplanner.core.impl.score.director.ScoreDirectorFactoryFactory.buildScoreDirectorFactory(ScoreDirectorFactoryFactory.java:73)
    at org.optaplanner.core.impl.solver.DefaultSolverFactory.buildScoreDirectorFactory(DefaultSolverFactory.java:116)
    at org.optaplanner.core.impl.solver.DefaultSolverFactory.buildSolver(DefaultSolverFactory.java:83)
    at ch.twohundredok.compute.App.main(App.java:56)
Caused by: java.lang.NullPointerException
    at org.kie.internal.utils.KieHelper.<init>(KieHelper.java:46)
    at org.optaplanner.core.impl.score.director.ScoreDirectorFactoryFactory.buildDroolsScoreDirectorFactory(ScoreDirectorFactoryFactory.java:290)
    ... 5 more

一调用solverFactory.buildSolver()就出现异常。

这是我尝试使用的最小 drools 文件:

package myapp;
    dialect "java"

import myapp.domain.Employee;

import org.optaplanner.core.api.score.buildin.hardsoft.HardSoftScoreHolder;

global HardSoftScoreHolder scoreHolder;

rule "firstRule"
  when
    Employee()
  then
    scoreHolder.addHardConstraintMatch(kcontext, -1);
end

不幸的是,当出现问题时,Drools 并不擅长异常处理。我在您提供的代码中没有看到任何明显的错误,而且失败来自 KieHelper 的事实很奇怪。也就是说,我没有任何信息可以继续,需要访问您的项目才能找到更多信息。

过去,人们在 Maven 中使用 Drools 构建可执行 JAR 时遇到过几个问题。请参阅 this question 了解其中一个问题,包括。解决方案。

就是说,如果您的项目才刚刚开始,我建议您改用 Constraint Streams。编程模型非常相似,但代码很简单 Java,因此您可以获得所有 IDE 魔法,例如自动完成、编译器检查等