2016-07-14 39 views
1

有幾天我試圖在Netbeans上運行Drools,但它不能像我想要的那樣工作。我甚至試圖讓它作爲一個maven項目工作,但這並沒有奏效。我描述了我做什麼來創建該項目,希望有人能給我一個提示。如何獲得在Netbeans Web項目(無Maven)中運行的Drools(Kie會話)?

首先我需要它沒有maven的工作,因爲我被限制不使用它。但是在我把它放入真實的項目之前,我想測試它。

所以首先我創建一個新項目

  1. 文件>新建項目...嚮導
  2. 之所以選擇 「的Java Web」 Categorie並使用項目類型 「WEBAPPLICATION」
  3. 選擇一個Tomcat Web服務器8和Java EE 7網絡
  4. 沒有框架,現在(以後休眠)
  5. 創建項目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的分佈。現在,編譯並沒有錯誤

    回答

    2

    這就是我如何做到這一點,沒有行家,沒有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) 
    

    因爲從文件中讀取是更靈活。