簡體   English   中英

運行Drools時出錯 - 我該如何調試?

[英]Error with running Drools - how should I debug?

我在Java程序中有一個Drools文件(在本例中是Optaplanner的一個變體),我在Netbeans 8上構建。當我運行程序時,我收到一條錯誤消息:

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)

使用Google搜索錯誤信息時,似乎does not exist as a classpath resource當drools代碼中存在錯誤時,Optaplanner會拋出does not exist as a classpath resource

我的問題是,沒有關於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);

多謝你們

當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中它需要以/開頭,並且在6.1中它不能以/開頭。

因此,如果您的項目源中有一個資源文件(假設您正在使用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/...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM