2016-02-12 89 views
0

我使用Drools的DroolsCompilerAntTask建立包二進制文件,如下面Ant構建成功,甚至syntaxx錯誤

<taskdef name="compiler" classname="org.drools.contrib.DroolsCompilerAntTask" classpathref="drools.path" /> 

    <target name="rules" > 
    <compiler 
     binformat="package" 
     srcdir="${path}/src/rules" 
     tofile="${path}/build/rules.pkg" 
     classpathref="compile.classpath" > 
     <include name="*.drl" /> 
     <include name="*.brl" /> 
     <include name="*.xml" /> 
    </compiler> 
    </target> 

但是當我運行的版本。我能夠得到錯誤信息,甚至出現構建仍顯示成功的錯誤。

rule-clean: 
rules: 
[compiler] [8,0]: [ERR 107] Line 8:0 mismatched input 'asdasd' expecting one of the following tokens: '[package, import, global, declare, function, rule, query]'. 
[compiler] [0,0]: Parser returned a null Package 
[compiler] [8,0]: [ERR 107] Line 8:0 mismatched input 'asdasd' expecting one of the following tokens: '[package, import, global, declare, function, rule, query]'. 
[compiler] [0,0]: Parser returned a null Package 

BUILD SUCCESSFUL 
Total time: 41 seconds 

有沒有解決方案讓流水編譯器失敗時生成失敗?

+0

你使用的是什麼版本的流口水? –

+0

5.4.0.Final從drools回購 – logger

回答

2

查看您正在使用的org.drools.contrib.DroolsCompilerAntTask的源代碼,我想我知道發生了什麼。不幸的是,這似乎是這個班的一個錯誤。

通過設計(我們可以爭論這是一個好的設計還是壞的設計),當正在編譯的資源中的一個包含錯誤時,Drools編譯器不會失敗(拋出任何異常)。您在控制檯中看到的輸出確實是編譯器發現的編譯錯誤,但這並不意味着編譯器本身失敗。在Drools中,編譯一些資源後,您需要手動檢查是否有一些錯誤。

org.drools.contrib.DroolsCompilerAntTask使用2種方法來編譯資源:

這兩種方法後,他們完成編譯你指定的資源確實會檢查錯誤;這裏唯一的問題是,如果有編譯錯誤,它們只是打印到控制檯上而沒有其他的東西。在這種情況下不會有任何例外。例如,這是多麼void compileAndAddFiles(PackageBuilder pbuilder)涉及錯誤:

if (pbuilder.hasErrors()) { 
    System.err.println(pbuilder.getErrors().toString()); 
} 

我想,你在這裏最好的選擇是克隆droolsjbpm-tools項目(使用分支5.4.x)和System.err.println報表後的提到的方法添加throw new IllegalStateException()或類似的東西。 code that is actually invokingcompileAndAddFiles()方法實際上捕捉到任何異常並用BuildException包裝它。我不是Ant專家,但我認爲這應該足以讓任務失敗。

希望它有幫助,

+0

感謝您的解釋,我想知道爲什麼錯誤持續時,drools編譯錯誤,仍然使構建通過。 – logger

相關問題