2014-07-03 43 views
3

從classpath中挑選下列文件:6.1. The Basics我創建了應該由KieContainer類路徑裝載DRL文件中確認一個簡單的類申請人。無法在滴料運行的hello world - DLR文件不受KieContainer

從DOC:

在這一點上,可以創建一個KieContainer讀取文件,將建成從classpath

KieServices kieServices = KieServices.Factory.get(); 

KieContainer kContainer = kieServices.getKieClasspathContainer(); 

上面的代碼片斷編譯所有在類路徑中找到的DRL文件,並把這個編譯的結果,一個KieModule,放在KieContainer中。如果沒有錯誤,我們現在準備從KieContainer創建我們的會話並執行一些數據:..

問題是drl(規則文件)沒有被KieContainer加載到項目中,也沒有應用到我的測試對象。

測試方法:

前兩行是從舊版本只是爲了檢查該文件實際上是在類路徑上。它確實找到規則文件。規則文件位於:src/main/resources/bla/checkLicense.drl - 在資源下正確。

 KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); 

     kbuilder.add(ResourceFactory.newClassPathResource("bla/checkLicense.drl"), ResourceType.DRL); 

     KieServices kieServices = KieServices.Factory.get(); 

     KieContainer kContainer = kieServices.getKieClasspathContainer(); 

     KieSession kSession = kContainer.newKieSession(); 

     Applicant applicant = new Applicant("Mr John Smith",16); 

     System.out.println(applicant.toString()); 

     assertTrue(applicant.isValid()); 

     kSession.insert(applicant); 

     kSession.fireAllRules(); 

     System.out.printf(applicant.toString()); 
     assertFalse(applicant.isValid()); 

輸出:

[main] INFO org.drools.compiler.kie.builder.impl.ClasspathKieProject - Found kmodule: file:/Users/<MyUserName>/Drools/target/classes/META-INF/kmodule.xml 
[main] WARN org.drools.compiler.kie.builder.impl.ClasspathKieProject - Unable to find pom.properties in /Users/<MyUserName>/Drools/target/classes 
[main] INFO org.drools.compiler.kie.builder.impl.ClasspathKieProject - Recursed up folders, found and used pom.xml /Users/<MyUserName>/Drools/pom.xml 
[main] INFO org.drools.compiler.kie.builder.impl.KieRepositoryImpl - KieModule was added:FileKieModule[ ReleaseId=drools:drools-test:6.2.0-SNAPSHOTfile=/Users/<MyUserName>/Drools/target/classes] 

[main] WARN org.drools.compiler.kie.builder.impl.AbstractKieModule - No files found for KieBase HelloWorldKB, searching folder /Users/<MyUserName>/Drools/target/classes 

Applicant{name='Mr John Smith', age=16, valid=true} 
Applicant{name='Mr John Smith', age=16, valid=true} 

申請人對象保持不變,而如果規則文件實際上是建立和加載應該已經成爲繼規則調用無效。警告消息不會出現由Drools的社會提供的git的測試項目...

我的POM使用相同的遠程JBoss遠程回購和6.2.0快照依賴...

我缺少什麼?

(因爲我在這裏失去了我的頭髮,將額外+ 50/+ 100將被授予救世主,後回答驗收)

(忽略的HelloWorld在圖片)

enter image description here

+0

如果該5.x的代碼的「第二行」從類路徑中的目錄中的一個(但BLA通過此相對路徑名查找「BLA/checkLicense.drl」/*不能*進行在類路徑上),那麼邏輯就會讓getKieClasspathContainer()將*不*找到checkLicense.drl,因爲這個方法被記錄在類路徑中找到DRL文件,顯然你不提供任何額外的信息。 (我從來沒有嘗試過這種構建技術,所以我不能說這就是答案 - - 這只是我值得追求的。) – laune

+0

我認爲你正朝着正確的方向前進,你能告訴我怎麼做它使用6.2.0?即使它是強力指向drl文件。 Thx請注意。 – Aubergine

+0

那麼,如果在類路徑中包含'bla /'或將'checkLicense.drl'移動到類路徑中的其中一個目錄中,會發生什麼?任何一個人都會立即顯示我的猜測是否正確。 – laune

回答

15

這個咆哮已經過時了看來6.2.0只能作爲SNAPSHOT使用(你最好獨自離開)[我在第一次嘗試時找不到6.1.0-Final的壓縮tarfile - 稍後發現。]我不喜歡Drools自5.6.0以來的分發模式提供給「社區」 。我設法通過簡單下載獲得的最後一個版本是6.0.0-Final。因此... 咆哮結束。

一個簡單的技術用於編譯一個或多個文件DRL編程,因爲6.0.0的作品是這樣的:

private KieSession kieSession; 

public void build() throws Exception { 
    KieServices kieServices = KieServices.Factory.get(); 
    KieFileSystem kfs = kieServices.newKieFileSystem(); 

    // for each DRL file, referenced by a plain old path name: 
    FileInputStream fis = new FileInputStream("simple/simple.drl"); 
    kfs.write("src/main/resources/simple.drl", 
       kieServices.getResources().newInputStreamResource(fis)); 

    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 = kieContainer.newKieSession(); 
} 
+0

6.2.0似乎需要正確解析jboss repo。 (如果你正在使用maven) – Aubergine

+0

非常好的解決方案,完美的工作 – Ironluca

+0

''src/main/resources/simple.drl「'代表什麼?它不會在OS文件資源管理器中的該位置生成。 –

7

找到了解決辦法,包帶DLR必須在內部聲明:KMODULE。XML

像這樣:

<kmodule xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://jboss.org/kie/6.0.0/kmodule"> 
    <kbase name="HelloWorldKB" packages="bla" default="true"> 
     <ksession name="HelloWorldKS" default="true"/> 
    </kbase> 

開始後,該拿起我的日間行車燈。

community.jboss.org/thread/242518