有幾天我試圖在Netbeans上運行Drools,但它不能像我想要的那樣工作。我甚至試圖讓它作爲一個maven項目工作,但這並沒有奏效。我描述了我做什麼來創建該項目,希望有人能給我一個提示。如何獲得在Netbeans Web項目(無Maven)中運行的Drools(Kie會話)?
首先我需要它沒有maven的工作,因爲我被限制不使用它。但是在我把它放入真實的項目之前,我想測試它。
所以首先我創建一個新項目
- 文件>新建項目...嚮導
- 之所以選擇 「的Java Web」 Categorie並使用項目類型 「WEBAPPLICATION」
- 選擇一個Tomcat Web服務器8和Java EE 7網絡
- 沒有框架,現在(以後休眠)
創建項目lib文件夾,並把下面的罐子在它:
- 滴料編譯-6.4.0.Final.jar
- 滴料芯-6.4.0.Final.jar
- 滴料-decisiontables-6.4.0.Final.jar
- 滴料-JSR94 -6.4.0.Final.jar
- 滴料-reteoo-6.4.0.Final.jar
- 知識API-6.4.0.Final.jar
- 紀伊-API 6.4.0.Final.jar
- kie-internal-6.4.0.Final.jar
- 紀伊-CI-6.4.0.Final.jar
- mvel2-2.2.6.Final.jar
- ANTLR運行時,3.5.Final.jar
與此設置我創建類(無論是在包: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);
}
}
和上面所用消息類
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;
}
}
我現在可以運行該代碼,並有消息返回。
現在,我想與紀伊嘗試一下......
我只是在評論DroolsMain main()方法的方法。 ,並將Kie方法放入目前的Drools文檔中。 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 申請人。DRL文件:
package Drools "Is of valid age"
import Drools.Applicant
when
$a : Applicant(age < 18)
then
$a.setValid(false);
end;
所以這顯然是行不通的,因爲紀伊有Maven依賴,所以我嘗試這樣做:1。 添加目錄: - DroolsTest /資源/ - DroolsTest /資源/ META-INF - DroolsTest /資源/ META-INF/maven的 - DroolsTest /資源/ Drools的 2.創建DroolsTest /資源/ 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 /資源/ META-INF /行家/ pom.properties 內容:(我的groupId包名稱),(我的artifactId項目名稱)
的groupId = Drools的 的artifactId = DroolsTest 版本= 1個
- 放DRL文件位置:DroolsTest /資源/ 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\8.1\executor-snippets\run.xml:53: Java returned: 1
BUILD FAILED (total time: 3 seconds)
有沒有解決方案讓Kiew無需maven工作,或者我可以在沒有它的文件中讀取?
UPDATE:
我試過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的分佈。現在,編譯並沒有錯誤