How to compile a .drl file through an ant build script

我的梦境 提交于 2020-01-11 03:33:09

问题


I am new to Drools. I want to know if it is possible to compile a .drl file using some kind of a command that can be entered in the windows command line (shell/cmd). I looked through the binaries that come with the drools distribution but I am unable to figure out a way to compile a .drl file. The reason I am interested in such a command is that I want to write an ant build file which will compile my java classes and rules and create a jar. This jar should be self sufficient, i.e running the jar from the command line should run the main program, which passes facts in the session causing the rules that operate on these facts to automatically be executed.


回答1:


The DroolsCompilerAntTask used to be the way to do this. It would take all your various rule files and compile them into a serialized file. It appears to have some bugs in 5.3 though which I am currently trying to work out. In the meantime, here is an illustrative build file that can be used for creating an executable JAR based on Drools. The build will fail if the rules cannot be compiled.

<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>

Note that the build uses One-Jar in order to create the self-contained executable, you may wish to substitute this with your 'Super Jar™' tool of choice. There is also a DroolsVerifierAntTask which allegedly can check logical errors in your rules (as opposed to syntactical ones), but I have no hands on experience with it.




回答2:


You can use something like this:

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();
}



回答3:


There's a drools-ant jar in the droolsjbpm-tools zip.



来源:https://stackoverflow.com/questions/7992569/how-to-compile-a-drl-file-through-an-ant-build-script

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!