以下文档: 6.1. The Basics 我创建了一个简单的类申请人,应该使用KieContainer从类路径加载的drl文件进行检查。
来自doc:
" 此时,可以创建一个KieContainer,从类路径中读取要构建的文件。
KieServices kieServices = KieServices.Factory.get();
KieContainer kContainer = kieServices.getKieClasspathContainer();
上面的代码片段编译了在类路径中找到的所有DRL文件,并将此编译的结果(KieModule)放在KieContainer中。如果没有错误,我们现在准备从KieContainer创建会话并执行一些数据:.. "
问题是drie(规则文件)没有被KieContainer加载到项目中,也没有应用到我的测试对象。</ p>
测试方法:
前两行来自旧版本只是为了检查文件是否实际在类路径上。它确实找到了规则文件。规则文件位于: 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远程repo和6.2.0 SNAPSHOT依赖...
我错过了什么?
(因为我在这里失去了我的头发,额外的+ 50 / + 100将被授予救世主,回复后接受)
(图片中忽略HelloWorld)
答案 0 :(得分:16)
(这个咆哮已经过时了。似乎6.2.0仅作为SNAPSHOT提供(你最好单独留下)。[我找不到6.1的压缩tarfile .0-第一次尝试的最终结果 - 稍后发现。]我不喜欢Drools发行版自5.6.0以来提供给“社区”的晦涩方式。我通过简单下载得到的最后一个版本是6.0.0-Final。因此...... 咆哮结束。)
从6.0.0开始,以编程方式编译一个或多个drl文件的简单技术是:
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();
}
答案 1 :(得分:7)
找到解决方案,必须在您的: kmodule.xml
中声明包含DLR的包像这样:
<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>
此后开始拿起我的手。