加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 无法在drools上运行hello world – KieContainer不会从

发布时间:2020-12-15 02:03:21 所属栏目:Java 来源:网络整理
导读:以下文档: 6.1. The Basics我创建了一个简单的类申请人,应该使用KieContainer从类路径加载的drl文件进行检查. 来自doc: “此时,可以创建一个KieContainer,从类路径中读取要构建的文件. KieServices kieServices = KieServices.Factory.get();KieContainer
以下文档: 6.1. The Basics我创建了一个简单的类申请人,应该使用KieContainer从类路径加载的drl文件进行检查.

来自doc:

“此时,可以创建一个KieContainer,从类路径中读取要构建的文件.

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',valid=true}

申请人对象保持不变,如果规则文件实际建立和加载,则应在规则调用后变为无效. drools社区提供的git测试项目没有显示警告消息…

我的pom使用相同的远程jboss远程repo和6.2.0 SNAPSHOT依赖…

我错过了什么?

(因为我在这里失去了我的头发,额外的50/100将被授予救世主,回答接受)

(图中忽略HelloWorld)

解决方法

(这个咆哮已经过时了.似乎6.2.0仅作为SNAPSHOT提供(你最好单独留下).[我在第一次尝试时找不到6.1.0-Final的压缩tarfile – 发现这个我不喜欢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();
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读