#ant #drools
#ant #drools
Вопрос:
Я новичок в Drools. Я хочу знать, возможно ли скомпилировать файл .drl с помощью какой-либо команды, которую можно ввести в командной строке Windows (shell / cmd). Я просмотрел двоичные файлы, поставляемые с дистрибутивом drools, но я не могу найти способ скомпилировать файл .drl. Причина, по которой меня интересует такая команда, заключается в том, что я хочу написать файл сборки ant, который будет компилировать мои классы и правила Java и создавать jar. Этот jar должен быть самодостаточным, т.Е. Запуск jar из командной строки должен запускать основную программу, которая передает факты в сеансе, вызывая автоматическое выполнение правил, которые работают с этими фактами.
Ответ №1:
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
, который, как утверждается, может проверять логические ошибки в ваших правилах (в отличие от синтаксических), но у меня нет практического опыта работы с ним.
Комментарии:
1. Это может быть ответ, который я искал. Собираюсь попробовать это и опубликовать результат здесь в ближайшее время. В настоящее время я отложил проект drools на некоторое время, поскольку работаю над другим проектом со строгими сроками!
Ответ №2:
Вы можете использовать что-то вроде этого:
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. Я уже делал нечто подобное, создав сборщик знаний и вызвав builder.add(ResourceFactory.newClassPathResource(r), ResourceType.DRL,»my_rule_file.drl»). Означает ли это, что мои файлы правил будут скомпилированы классом, который содержит этот код? Это означает, что при наличии ошибок в . файл drl, ant будет жаловаться на наличие ошибок в моем классе, хотя ошибки на самом деле существуют в файле drl? Верно? Кроме того, означает ли это, что я могу сказать ant напрямую копировать файлы правил в папку сборки, поскольку класс java компилируется самим ant?
2. Это означает, что любые синтаксические ошибки в . файлы drl никогда не будут сообщаться во время компиляции, а будут сообщаться только при фактическом запуске приложения, то есть во время выполнения? Как вы проверяете синтаксические ошибки во время самой компиляции?
3. если вы хотите проверить ошибки DRL во время компиляции, вам нужно запустить этот код из antscript, прежде чем ваша программа будет скомпилирована. Ситуация с обработкой, если в DRL-файле есть ошибки.
4. Итак, по сути, я должен написать служебный класс, который будет компилировать все файлы drl. Этот служебный класс должен запускаться из скрипта ant. Если обнаружены какие-либо ошибки, скрипт должен сообщить об этих ошибках, и, согласно моему требованию, сборка должна завершиться неудачно!. Вывод здесь таков . синтаксические ошибки drl могут быть обнаружены только во время выполнения и никогда во время компиляции (учитывая, что вы не используете IDE). Это предположение или факт?
5. я не понимаю вашего вывода: вы запускаете свою утилиту во время компиляции, поэтому любая ошибка drl будет обнаружена во время компиляции (вашей программы). PS Если вы используете какой-либо импорт в своих правилах, утилита, конечно, должна иметь их в пути к классу.
Ответ №3:
В zip-папке droolsjbpm-tools есть jar-файл drools-ant.
Комментарии:
1. Не могли бы вы подробнее рассказать о том, как я могу это использовать drools-ant.jar файл для создания моего проекта (т.е. скомпилировать классы Java, файлы .drl и создать исполняемый файл jar, который можно запустить из командной строки?