我是Drools的新手。我想知道是否可以使用某种可以在Windows命令行(shell/cmd)中输入的命令来编译.drl文件。我查看了drools发行版附带的二进制文件,但无法找到编译.drl文件的方法。 我对这样的命令感兴趣的原因是我想编写一个ant编译文件,它将编译我的java类和规则并创建一个jar。这个jar应该是自给自足的,即从命令行运行jar应该运行主程序,它在会话中传递事实,导致对这些事实进行操作的规则被自动执行。如何通过一个ant编译脚本编译.drl文件
回答
DroolsCompilerAntTask
曾经是做这件事的方法。它会把你所有的各种规则文件编译成一个序列化的文件。它似乎有一些5.3中的错误,但我目前正在努力解决这个问题。同时,下面是一个说明性的构建文件,可用于创建基于Drools的可执行JAR。如果规则无法编译,构建将失败。
<project name="DroolsProto" default="dist" basedir=".">
<property name="build.src" location="src"/>
<property name="build.target" location="target"/>
<property name="build.dist" location="dist"/>
<property name="build.artifact" value="droolsproto"/>
<property name="one-jar.dist.dir" value="~/Work/Data/Misc/OneJar"/>
<property name="one-jar.version" value="0.97"/>
<property name="one-jar.ant.jar" value="${one-jar.dist.dir}/one-jar-ant-task-${one-jar.version}.jar"/>
<path id="build.lib.path">
<fileset dir="${build.src}/lib">
<include name="**/*.jar"/>
</fileset>
</path>
<taskdef name="one-jar" classname="com.simontuffs.onejar.ant.OneJarTask"
classpath="${one-jar.ant.jar}" onerror="report"/>
<taskdef name="droolscompiler" classname="org.drools.contrib.DroolsCompilerAntTask">
<classpath refid="build.lib.path"/>
</taskdef>
<target name="clean">
<delete dir="${build.target}"/>
<delete dir="${build.dist}"/>
</target>
<target name="init">
<tstamp/>
<mkdir dir="${build.target}"/>
<mkdir dir="${build.dist}"/>
</target>
<target name="compile" depends="init">
<mkdir dir="${build.target}/classes"/>
<javac srcdir="${build.src}/main/java" destdir="${build.target}/classes">
<classpath refid="build.lib.path"/>
<include name="**/*.java"/>
<exclude name="**/*Test.java"/>
</javac>
</target>
<target name="verify-rules">
<droolscompiler srcDir="${build.src}/main/resources" toFile="${build.target}/classes/foo.foo">
<classpath refid="build.lib.path"/>
</droolscompiler>
</target>
<target name="verify-resources" depends="verify-rules"/>
<target name="bundle-resources" depends="verify-resources">
<copy todir="${build.target}/classes">
<fileset dir="${build.src}/main/resources"/>
</copy>
</target>
<target name="dist" depends="compile, bundle-resources">
<one-jar destfile="${build.dist}/${build.artifact}.jar">
<manifest>
<attribute name="One-Jar-Main-Class" value="org.drools.examples.HelloWorldExample"/>
</manifest>
<main>
<fileset dir="${build.target}/classes"/>
</main>
<lib>
<fileset dir="${build.src}/lib">
<include name="**/*.jar"/>
</fileset>
</lib>
</one-jar>
</target>
</project>
注意,打造以使用One-Jar创建自包含可执行文件,您可能希望与您所选择的“超级罐”工具来替代这次。还有一个DroolsVerifierAntTask
据称可以检查规则中的逻辑错误(而不是语法错误),但我没有经验。
您可以使用这样的事情:
private static void compile(final String srcFile, final String destFile) throws IOException {
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
URL src = FormChecker.class.getResource(srcFile);
Resource r = ResourceFactory.newInputStreamResource(src.openStream());
kbuilder.add(r, ResourceType.DRL);
if (kbuilder.hasErrors()) {
throw new IllegalStateException("Can not initialize Drools: " + kbuilder.getErrors().toString());
}
Collection<KnowledgePackage> kpackages = kbuilder.getKnowledgePackages();
File dest = new File(destFile);
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(dest));
out.writeObject(kpackages);
out.close();
}
我已经通过创建KnowledgeBuilder并调用builder.add(ResourceFactory.newClassPathResource(r),ResourceType.DRL,“my_rule_file.drl”)来做类似的事情。这是否意味着我的规则文件将由包含此代码的类进行编译?这意味着当.drl文件中有错误时,ant会抱怨我的类中有错误,即使这些错误实际上存在于drl文件中?对?另外,这是否意味着我可以告诉ant直接将规则文件复制到build文件夹,因为java类是由ant本身编译的? – CKing
这意味着.drl文件中的任何语法错误将永远不会在编译期间报告,但仅在应用程序实际运行时才报告,即在运行时?如何在编译时检查语法错误? – CKing
如果您想通过编译时检查DRL错误,您需要在编译之前从antscript运行此代码。 DRL文件有错误时的句柄情况。 – AvrDragon
有一个Drools的蚂蚁罐子在droolsjbpm-工具压缩。
您能详细阐述一下我如何使用这个drools-ant.jar文件来构建我的项目(即编译java类,.drl文件并创建一个可运行的可执行jar从命令行? – CKing
- 1. 如何使用ant编译NSIS脚本?
- 2. 通过Ant编译GWT
- 3. 如何通过Ant编译jsoup?
- 4. Eclipse无法编程编译ant脚本
- 5. 如何编译多个Python脚本到一个Python脚本编译
- 6. 编写tclsh脚本通过VCS工具编译SV文件
- 7. Eclipse Ant脚本编译包不存在
- 8. 编译脚本
- 9. 如何编译julia脚本?
- 10. PHP脚本如何编译?
- 11. Ant排除文件编译java文件
- 12. 这个drl应该编译吗?
- 13. 一个zip文件不能包含本身 - Ant编译错误
- 14. Ant构建文件来编译NSIS脚本
- 15. 通过编译加快编译时间
- 16. 通过编译库加速编译
- 17. “编译” Python脚本
- 18. 如何总是编译一个文件?
- 19. 编译一个.ss文件
- 20. Ant编译问题
- 21. ANT编译失败
- 22. 用Ant编译SQLJ
- 23. flex ant编译css
- 24. 使用python脚本编译Latex文件
- 25. 编译脚本文件Lua或Python
- 26. 用ant任务编译Groovy文件
- 27. 如何通过编写python脚本将所有py文件编译到文件夹中的pyc文件?
- 28. 编译器如何编译编译器?
- 29. 通过Flex编译.AS文件4
- 30. 如何通过Matlab使用C++编译器Mex编译工具
这可能是我正在寻找的答案。试着尝试一下,然后在这里很快发布结果。我现在把drools项目放在一边,因为我正在处理另一个项目,并且有严格的截止日期! – CKing