Как скомпилировать файл .drl через скрипт сборки ant - PullRequest
4 голосов
/ 03 ноября 2011

Я новичок в Drools.Я хочу знать, возможно ли скомпилировать файл .drl, используя какую-то команду, которую можно ввести в командной строке Windows (shell / cmd).Я просмотрел двоичные файлы, поставляемые с дистрибутивом drools, но не могу найти способ компилировать файл .drl.Причина, по которой меня интересует такая команда, заключается в том, что я хочу написать файл сборки ant, который скомпилирует мои классы и правила java и создаст jar.Этот jar должен быть самодостаточным, то есть запуск jar из командной строки должен запускать основную программу, которая передает факты в сеансе, вызывая автоматическое выполнение правил, которые работают с этими фактами.

Ответы [ 3 ]

2 голосов
/ 04 ноября 2011

DroolsCompilerAntTask раньше был способ сделать это. Это займет все ваши различные файлы правил и скомпилирует их в сериализованный файл. Кажется, в 5.3 есть ошибки, которые я сейчас пытаюсь решить. А пока вот иллюстративный файл сборки, который можно использовать для создания исполняемого JAR-файла на основе Drools. Сборка не удастся, если правила не могут быть скомпилированы.

<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 , чтобы создать автономный исполняемый файл, вы можете заменить его на свой инструмент Super Jar ™. Существует также DroolsVerifierAntTask, который якобы может проверять логические ошибки в ваших правилах (в отличие от синтаксических), но у меня нет опыта работы с ним.

2 голосов
/ 03 ноября 2011

Вы можете использовать что-то вроде этого:

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();
}
1 голос
/ 03 ноября 2011

В молнии droolsjbpm-tools есть drools-ant банка.

...