2014-07-03 114 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