Ant构建成功甚至语法错误
Ant build success even syntaxx error
我正在使用 Drools DroolsCompilerAntTask 构建软件包二进制文件,如下所示
<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
当 drool 编译器失败时,是否有任何解决方案可以使构建失败?
查看您正在使用的org.drools.contrib.DroolsCompilerAntTask的源代码,我想我知道是怎么回事了。不幸的是,这似乎是 class.
中的错误
根据设计(我们可以争论这是好设计还是坏设计),当正在编译的资源之一包含错误时,Drools 编译器不会失败(抛出任何异常)。您在控制台中看到的输出确实是编译器发现的编译错误,但这并不意味着编译器本身失败了。在Drools中,编译一些资源后,需要手动检查是否有错误。
classorg.drools.contrib.DroolsCompilerAntTask使用2种方式编译资源:
- void compileAndAddFiles(KnowledgeBuilder kbuilder)
- void compileAndAddFiles(PackageBuilder pbuilder)(我认为这是你的任务实际使用的那个)
这两种方法,在编译完你指定的资源后,确实会检查错误;这里唯一的问题是,如果有编译错误,它们只会被打印到控制台上,没有别的。在这种情况下永远不会抛出异常。例如,这是 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 invoking compileAndAddFiles()
方法实际上是捕获任何异常并用 BuildException
包装它。我不是 Ant 专家,但我认为这足以使任务失败。
希望对您有所帮助,
我正在使用 Drools DroolsCompilerAntTask 构建软件包二进制文件,如下所示
<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
当 drool 编译器失败时,是否有任何解决方案可以使构建失败?
查看您正在使用的org.drools.contrib.DroolsCompilerAntTask的源代码,我想我知道是怎么回事了。不幸的是,这似乎是 class.
中的错误根据设计(我们可以争论这是好设计还是坏设计),当正在编译的资源之一包含错误时,Drools 编译器不会失败(抛出任何异常)。您在控制台中看到的输出确实是编译器发现的编译错误,但这并不意味着编译器本身失败了。在Drools中,编译一些资源后,需要手动检查是否有错误。
classorg.drools.contrib.DroolsCompilerAntTask使用2种方式编译资源:
- void compileAndAddFiles(KnowledgeBuilder kbuilder)
- void compileAndAddFiles(PackageBuilder pbuilder)(我认为这是你的任务实际使用的那个)
这两种方法,在编译完你指定的资源后,确实会检查错误;这里唯一的问题是,如果有编译错误,它们只会被打印到控制台上,没有别的。在这种情况下永远不会抛出异常。例如,这是 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 invoking compileAndAddFiles()
方法实际上是捕获任何异常并用 BuildException
包装它。我不是 Ant 专家,但我认为这足以使任务失败。
希望对您有所帮助,