1

我在 Netbeans 8 上构建的 Java 程序(在本例中是 Optaplanner 的变体)中有一个 Drools 文件。运行该程序时,我收到一条错误消息:

Exception in thread "main" java.lang.IllegalArgumentException: The scoreDrl (taskassignment/solver/taskAssignmentScoreRules.drl) does not exist as a classpath resource.
at org.optaplanner.core.config.score.director.ScoreDirectorFactoryConfig.buildKieBase(ScoreDirectorFactoryConfig.java:304)
at org.optaplanner.core.config.score.director.ScoreDirectorFactoryConfig.buildDroolsScoreDirectorFactory(ScoreDirectorFactoryConfig.java:279)
at org.optaplanner.core.config.score.director.ScoreDirectorFactoryConfig.buildScoreDirectorFactory(ScoreDirectorFactoryConfig.java:186)
at org.optaplanner.core.config.score.director.ScoreDirectorFactoryConfig.buildScoreDirectorFactory(ScoreDirectorFactoryConfig.java:174)
at org.optaplanner.core.config.solver.SolverConfig.buildSolver(SolverConfig.java:145)
at org.optaplanner.core.config.solver.XmlSolverFactory.buildSolver(XmlSolverFactory.java:101)
at taskassignment.app.TaskAssignmentHelloWorld.main(TaskAssignmentHelloWorld.java:32)

does not exist as a classpath resource在谷歌上搜索了错误消息后,当 drools 代码中出现错误时,它似乎是从 Optaplanner 抛出的。

我的问题是,没有关于 drools 文件中错误位置的更多信息,调试这段代码的好方法是什么?是否有任何插件可以帮助我缩小问题的范围,就像 Netbeans 通常使用 Java 一样?

这是我的 Drools 代码,可以很好地衡量:

package taskassignment.solver;
dialect "java"

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

import taskassignment.domain.TaskAssignment;
import taskassignment.domain.Task;
import taskassignment.domain.Dev;

global HardSoftScoreHolder scoreHolder;

// ############################################################################
// Hard constraints
// ############################################################################

rule "DevCanOnlyDoOneTask"
when
    $T1:Task
    $T2:Task
    $D:Dev
    (($T1.getAssignedDev()=$D)&&($T2.getAssignedDev()=$D)&&(($T2.getAllottedStartTime()<=$T1.getAllottedStartTime())&&($T1.getAllottedStartTime()<$T2.getAllottedStartTime()+$T2.getDuration()))||(($T1.getAllottedStartTime()<=$T2.getAllottedStartTime())&&($T2.getAllottedStartTime()<$T1.getAllottedStartTime()+$T1.getDuration()))

then
    scoreHolder.addHardConstraintMatch(kcontext,-1000);
end

// ############################################################################
// Soft constraints
// ############################################################################

rule "MaximiseEarliestFinishTime"
when
    $TA: TaskAssignment
    $EFT: $TA.getEFT()

then
    scoreHolder.addSoftConstraintMatch(kcontext,+$EFT);

多谢你们

4

1 回答 1

3

当 drools (DRL) 代码出现错误时,它会抛出一个不同的异常,来自 drools 并说明错误消息在 DRL 中的哪一行。

讯息

The scoreDrl (taskassignment/solver/taskAssignmentScoreRules.drl) does not exist as a classpath resource.

意味着您已经在求解器配置中配置了它

<scoreDrl>taskassignment/solver/taskAssignmentScoreRules.drl</scoreDrl>

这不是有效的类路径资源位置。

在具有 maven 目录结构的典型项目中,类路径资源位于src/main/resources.

陷阱:在 6.0 中,OptaPlanner 使用Class.getResource(String)它来查找它。在 6.1.0.Beta3+ 中,OptaPlanner 用于ClassLoader.getResource(String)查找它。这意味着目前在 6.0 中它需要以 a 开头,/而在 6.1 中它不能以 a 开头/

因此,如果您的项目源中有这样的资源文件(假设您使用的是 maven 目录结构):

PROJECT_DIR/src/main/resources/taskassignment/solver/taskAssignmentScoreRules.drl

在 6.0 中,您需要配置:

<scoreDrl>/taskassignment/solver/taskAssignmentScoreRules.drl</scoreDrl>

在 6.1 中,您需要配置:

<scoreDrl>taskassignment/solver/taskAssignmentScoreRules.drl</scoreDrl>

注意:您可能希望遵循 java 约定并使用反向 url 命名空间。因此taskassignment/solver/...,我会使用com/mycompany/taskassignment/solver/....

于 2014-04-16T06:26:59.880 回答