如何在 Netbeans Web 项目(无 Maven)中获取 Drools(Kie Session)运行?
How to get Drools (Kie Session) running in a Netbeans Web-Project (No Maven)?
几天来,我一直在尝试 运行 Netbeans 中的 Drools,但它并没有像我希望的那样工作。我什至试图让它作为一个 Maven 项目工作,但效果不佳。我描述了我为创建项目所做的工作,希望有人能给我提示。
首先我需要它在没有 maven 的情况下工作,因为我被限制不能使用它。但是在我把它放在真正的项目中之前我想测试它。
所以首先我创建一个新项目
- 文件>新建项目..向导
- 选择"Java Web"类别并使用项目类型"Webapplication"
- 选择 tomcat 8 网络服务器和 Java EE 7 Web
- 暂时没有框架(稍后休眠)
在项目中创建 lib 文件夹并将以下 jars 放入其中:
- drools-compiler-6.4.0.Final.jar
- drools-core-6.4.0.Final.jar
- drools-decisiontables-6.4.0.Final.jar
- drools-jsr94-6.4.0.Final.jar
- drools-reteoo-6.4.0.Final.jar
- 知识-api-6.4.0.Final.jar
- kie-api-6.4.0.Final.jar
- kie-internal-6.4.0.Final.jar
- kie-ci-6.4.0.Final.jar
- mvel2-2.2.6.Final.jar
- antlr-运行time-3.5.Final.jar
使用此设置我创建了 classes(均在包中:Drools)
DroolsMain(在没有网络服务器和 gui 的情况下进行测试,以加快调试速度)
public class DroolsMain {
private static KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
private static Collection<KnowledgePackage> pkgs;
private static KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
private static StatefulKnowledgeSession ksession;
public static void main(final String[] args) {
init();
initMessageObject();
fireRules();
}
private static void init() {
String myRule = "import Drools.Message rule \"Hello World 2\" when message:Message (type==\"Test\") then System.out.println(\"Test, Drools!\"); end";
Resource myResource = ResourceFactory.newReaderResource((Reader) new StringReader(myRule));
kbuilder.add(myResource, ResourceType.DRL);
if(kbuilder.hasErrors()) {
System.out.println(kbuilder.getErrors().toString());
throw new RuntimeException("unable to compile dlr");
}
pkgs = kbuilder.getKnowledgePackages();
kbase.addKnowledgePackages(pkgs);
ksession = kbase.newStatefulKnowledgeSession();
}
private static void fireRules() {
ksession.fireAllRules();
}
private static void initMessageObject() {
Message msg = new Message();
msg.setType("Test");
ksession.insert(msg);
}
}
和上面使用的Messageclass
public class Message {
private String type;
private String message;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
我现在可以 运行 该代码并返回消息。
现在我想和 Kie 一起试试...
我只是评论 DroolsMain main() 方法中的方法。
并将 Kie 方法放入当前的 Drools 文档 p。 172-174 那里:
private static void kieTest() {
KieServices kieServices = KieServices.Factory.get();
KieContainer kContainer = kieServices.getKieClasspathContainer();
StatelessKieSession kSession = kContainer.newStatelessKieSession();
Applicant bob = new Applicant("Mr. Bob", 16);
//assertTrue(bob.isValid());
kSession.execute(bob);
//assertFalse(bob.isValid());
}
我没有把 Applicant.class 放在这里,因为它只是一个具有 3 个属性的 bean。
我还创建了 DRL applicant.drl 文件:
package Drools "Is of valid age"
import Drools.Applicant
when
$a : Applicant(age < 18)
then
$a.setValid(false);
end;
所以这显然是行不通的,因为 Kie 有 maven dependencies 所以我尝试了这个:
1.添加目录:
- DroolsTest/resources/
- DroolsTest/resources/元信息
- DroolsTest/resources/META-INF/maven
- DroolsTest/resources/流口水
2.创建DroolsTest/resources/META-INFkmodule.xml
内容:
<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="Drools" packages="Drools">
<ksession name="ksession-drools" />
</kbase>
</kmodule>
创建DroolsTest/resources/META-INF/maven/pom.properties
内容:(groupId我的包名),(artifactId我的项目名)
groupId=流口水
artifactId=DroolsTest
版本=1
- 将 drl 文件放在这里:DroolsTest/resources/Drools/applicant.drl
编译会抛出 RuntimeException:
Exception in thread "main" java.lang.RuntimeException: Cannot find a default KieSession
at org.drools.compiler.kie.builder.impl.KieContainerImpl.findKieSessionModel(KieContainerImpl.java:555)
at org.drools.compiler.kie.builder.impl.KieContainerImpl.newKieSession(KieContainerImpl.java:548)
at org.drools.compiler.kie.builder.impl.KieContainerImpl.newKieSession(KieContainerImpl.java:531)
at Drools.DroolsMain.kieTest(DroolsMain.java:43)
at Drools.DroolsMain.main(DroolsMain.java:52)
C:\Users\...\AppData\Local\NetBeans\Cache.1\executor-snippets\run.xml:53: Java returned: 1
BUILD FAILED (total time: 3 seconds)
是否有解决方案让 Kiew 在没有 maven 的情况下工作,或者我可以在没有它的情况下读取文件?
更新:
我试过 launes 解决方案:
import java.io.File;
import org.kie.api.KieBase;
import org.kie.api.KieServices;
import org.kie.api.builder.KieBuilder;
import org.kie.api.builder.KieFileSystem;
import org.kie.api.builder.Results;
import org.kie.api.io.Resource;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
public class DroolsMain {
private void ntry() {
KieServices kieServices = KieServices.Factory.get();
KieFileSystem kfs = kieServices.newKieFileSystem();
File rule = new File("src/main/resources/Drools/applicant.drl");
Resource res = kieServices.getResources().newFileSystemResource(rule);
kfs.write(res);
KieBuilder kieBuilder = kieServices.newKieBuilder(kfs).buildAll();
Results results = kieBuilder.getResults();
System.out.println("---Messages---");
System.out.println(results.getMessages());
KieContainer kieContainer = kieServices.newKieContainer(kieServices.getRepository().getDefaultReleaseId());
KieBase kieBase = kieContainer.getKieBase();
KieSession kieSession = kieBase.newKieSession();
}
public static void main(final String[] args) {
DroolsMain dm = new DroolsMain();
dm.ntry();
}
}
我还添加了 drools 发行版中的所有 jar。现在它编译并且没有错误
我就是这样做的,没有专家,没有XML:
public void build() throws Exception {
KieServices kieServices = KieServices.Factory.get();
KieFileSystem kfs = kieServices.newKieFileSystem();
//...
Resource res = ...;
kfs.write( "src/main/resources/simple.drl", res );
KieBuilder kieBuilder = kieServices.newKieBuilder( kfs ).buildAll();
Results results = kieBuilder.getResults();
if( results.hasMessages( Message.Level.ERROR ) ){
System.out.println( results.getMessages() );
throw new IllegalStateException( "### errors ###" );
}
KieContainer kieContainer =
kieServices.newKieContainer( kieServices.getRepository().getDefaultReleaseId() );
KieBase kieBase = kieContainer.getKieBase();
kieSession = kieBase.newKieSession();
}
我通常使用
这样的资源
kieServices.getResources().newInputStreamResource( fis )
因为从文件读取更灵活。
几天来,我一直在尝试 运行 Netbeans 中的 Drools,但它并没有像我希望的那样工作。我什至试图让它作为一个 Maven 项目工作,但效果不佳。我描述了我为创建项目所做的工作,希望有人能给我提示。
首先我需要它在没有 maven 的情况下工作,因为我被限制不能使用它。但是在我把它放在真正的项目中之前我想测试它。
所以首先我创建一个新项目
- 文件>新建项目..向导
- 选择"Java Web"类别并使用项目类型"Webapplication"
- 选择 tomcat 8 网络服务器和 Java EE 7 Web
- 暂时没有框架(稍后休眠)
在项目中创建 lib 文件夹并将以下 jars 放入其中:
- drools-compiler-6.4.0.Final.jar
- drools-core-6.4.0.Final.jar
- drools-decisiontables-6.4.0.Final.jar
- drools-jsr94-6.4.0.Final.jar
- drools-reteoo-6.4.0.Final.jar
- 知识-api-6.4.0.Final.jar
- kie-api-6.4.0.Final.jar
- kie-internal-6.4.0.Final.jar
- kie-ci-6.4.0.Final.jar
- mvel2-2.2.6.Final.jar
- antlr-运行time-3.5.Final.jar
使用此设置我创建了 classes(均在包中:Drools) DroolsMain(在没有网络服务器和 gui 的情况下进行测试,以加快调试速度)
public class DroolsMain {
private static KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
private static Collection<KnowledgePackage> pkgs;
private static KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
private static StatefulKnowledgeSession ksession;
public static void main(final String[] args) {
init();
initMessageObject();
fireRules();
}
private static void init() {
String myRule = "import Drools.Message rule \"Hello World 2\" when message:Message (type==\"Test\") then System.out.println(\"Test, Drools!\"); end";
Resource myResource = ResourceFactory.newReaderResource((Reader) new StringReader(myRule));
kbuilder.add(myResource, ResourceType.DRL);
if(kbuilder.hasErrors()) {
System.out.println(kbuilder.getErrors().toString());
throw new RuntimeException("unable to compile dlr");
}
pkgs = kbuilder.getKnowledgePackages();
kbase.addKnowledgePackages(pkgs);
ksession = kbase.newStatefulKnowledgeSession();
}
private static void fireRules() {
ksession.fireAllRules();
}
private static void initMessageObject() {
Message msg = new Message();
msg.setType("Test");
ksession.insert(msg);
}
}
和上面使用的Messageclass
public class Message {
private String type;
private String message;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
我现在可以 运行 该代码并返回消息。
现在我想和 Kie 一起试试...
我只是评论 DroolsMain main() 方法中的方法。 并将 Kie 方法放入当前的 Drools 文档 p。 172-174 那里:
private static void kieTest() {
KieServices kieServices = KieServices.Factory.get();
KieContainer kContainer = kieServices.getKieClasspathContainer();
StatelessKieSession kSession = kContainer.newStatelessKieSession();
Applicant bob = new Applicant("Mr. Bob", 16);
//assertTrue(bob.isValid());
kSession.execute(bob);
//assertFalse(bob.isValid());
}
我没有把 Applicant.class 放在这里,因为它只是一个具有 3 个属性的 bean。 我还创建了 DRL applicant.drl 文件:
package Drools "Is of valid age"
import Drools.Applicant
when
$a : Applicant(age < 18)
then
$a.setValid(false);
end;
所以这显然是行不通的,因为 Kie 有 maven dependencies 所以我尝试了这个: 1.添加目录: - DroolsTest/resources/ - DroolsTest/resources/元信息 - DroolsTest/resources/META-INF/maven - DroolsTest/resources/流口水 2.创建DroolsTest/resources/META-INFkmodule.xml
内容:
<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="Drools" packages="Drools">
<ksession name="ksession-drools" />
</kbase>
</kmodule>
创建DroolsTest/resources/META-INF/maven/pom.properties 内容:(groupId我的包名),(artifactId我的项目名)
groupId=流口水 artifactId=DroolsTest 版本=1
- 将 drl 文件放在这里:DroolsTest/resources/Drools/applicant.drl
编译会抛出 RuntimeException:
Exception in thread "main" java.lang.RuntimeException: Cannot find a default KieSession
at org.drools.compiler.kie.builder.impl.KieContainerImpl.findKieSessionModel(KieContainerImpl.java:555)
at org.drools.compiler.kie.builder.impl.KieContainerImpl.newKieSession(KieContainerImpl.java:548)
at org.drools.compiler.kie.builder.impl.KieContainerImpl.newKieSession(KieContainerImpl.java:531)
at Drools.DroolsMain.kieTest(DroolsMain.java:43)
at Drools.DroolsMain.main(DroolsMain.java:52)
C:\Users\...\AppData\Local\NetBeans\Cache.1\executor-snippets\run.xml:53: Java returned: 1
BUILD FAILED (total time: 3 seconds)
是否有解决方案让 Kiew 在没有 maven 的情况下工作,或者我可以在没有它的情况下读取文件?
更新:
我试过 launes 解决方案:
import java.io.File;
import org.kie.api.KieBase;
import org.kie.api.KieServices;
import org.kie.api.builder.KieBuilder;
import org.kie.api.builder.KieFileSystem;
import org.kie.api.builder.Results;
import org.kie.api.io.Resource;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
public class DroolsMain {
private void ntry() {
KieServices kieServices = KieServices.Factory.get();
KieFileSystem kfs = kieServices.newKieFileSystem();
File rule = new File("src/main/resources/Drools/applicant.drl");
Resource res = kieServices.getResources().newFileSystemResource(rule);
kfs.write(res);
KieBuilder kieBuilder = kieServices.newKieBuilder(kfs).buildAll();
Results results = kieBuilder.getResults();
System.out.println("---Messages---");
System.out.println(results.getMessages());
KieContainer kieContainer = kieServices.newKieContainer(kieServices.getRepository().getDefaultReleaseId());
KieBase kieBase = kieContainer.getKieBase();
KieSession kieSession = kieBase.newKieSession();
}
public static void main(final String[] args) {
DroolsMain dm = new DroolsMain();
dm.ntry();
}
}
我还添加了 drools 发行版中的所有 jar。现在它编译并且没有错误
我就是这样做的,没有专家,没有XML:
public void build() throws Exception {
KieServices kieServices = KieServices.Factory.get();
KieFileSystem kfs = kieServices.newKieFileSystem();
//...
Resource res = ...;
kfs.write( "src/main/resources/simple.drl", res );
KieBuilder kieBuilder = kieServices.newKieBuilder( kfs ).buildAll();
Results results = kieBuilder.getResults();
if( results.hasMessages( Message.Level.ERROR ) ){
System.out.println( results.getMessages() );
throw new IllegalStateException( "### errors ###" );
}
KieContainer kieContainer =
kieServices.newKieContainer( kieServices.getRepository().getDefaultReleaseId() );
KieBase kieBase = kieContainer.getKieBase();
kieSession = kieBase.newKieSession();
}
我通常使用
这样的资源kieServices.getResources().newInputStreamResource( fis )
因为从文件读取更灵活。