Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Can';t在drools上运行hello world-dlr文件不是由KieContainer从类路径中拾取的_Java_Drools - Fatal编程技术网

Java Can';t在drools上运行hello world-dlr文件不是由KieContainer从类路径中拾取的

Java Can';t在drools上运行hello world-dlr文件不是由KieContainer从类路径中拾取的,java,drools,Java,Drools,以下文档:我创建了一个简单的类申请者,应该使用KieContainer从类路径加载的drl文件进行检查 从文档: 此时,可以创建一个从类路径读取要构建的文件的容器 上面的代码片段编译在类路径上找到的所有DRL文件,并将此编译的结果(一个KieModule)放入KieContainer中。如果没有错误,我们现在准备从KieContainer创建会话,并针对一些数据执行:…” 问题是drl(规则文件)没有被容器加载到项目中,也没有应用到我的测试对象 试验方法: 前两行来自旧版本,只是为了检查文件是否

以下文档:我创建了一个简单的类申请者,应该使用KieContainer从类路径加载的drl文件进行检查

从文档:

此时,可以创建一个从类路径读取要构建的文件的容器

上面的代码片段编译在类路径上找到的所有DRL文件,并将此编译的结果(一个KieModule)放入KieContainer中。如果没有错误,我们现在准备从KieContainer创建会话,并针对一些数据执行:…”

问题是drl(规则文件)没有被容器加载到项目中,也没有应用到我的测试对象

试验方法:

前两行来自旧版本,只是为了检查文件是否实际位于类路径上。它确实找到了规则文件。规则文件位于以下位置: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}
[main]INFO org.drools.compiler.kie.builder.impl.ClasspathKieProject-找到的kmodule:file:/Users//drools/target/classes/META-INF/kmodule.xml
[main]WARN org.drools.compiler.kie.builder.impl.ClasspathKieProject-无法在/Users//drools/target/classes中找到pom.properties
[main]INFO org.drools.compiler.kie.builder.impl.ClasspathKieProject-递归文件夹,找到并使用pom.xml/Users//drools/pom.xml
[main]INFO org.drools.compiler.kie.builder.impl.KieRepositoryImpl-KieModule已添加:FileKieModule[ReleaseId=drools:drools测试:6.2.0-SNAPSHOTfile=/Users//drools/target/classes]
[main]WARN org.drools.compiler.kie.builder.impl.AbstractKieModule-未找到KieBase HelloWorldKB的文件,正在搜索文件夹/Users//drools/target/classes
申请人{name='John Smith先生,年龄=16岁,有效期=true}
申请人{name='John Smith先生,年龄=16岁,有效期=true}
申请者对象保持不变,但如果规则文件实际被创建和加载,则在规则调用后应该变得无效。drools社区提供的git测试项目不会出现警告消息

我的pom使用相同的远程jboss远程repo和6.2.0快照依赖项

我错过了什么

(由于我在这里脱发,额外的+50/+100将在回答接受后授予救世主)

(忽略图片中的HelloWorld)

(这句话已经过时了。6.2.0似乎只是一个快照(你最好别管它)。[而且我找不到6.1.0-Final的压缩tar文件,第一次尝试时就找不到了-后来发现了这个。]我不喜欢5.6.0向“社区”提供Drools发行版的晦涩方式.我通过简单的下载获得的上一个版本是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();
}

找到解决方案后,必须在您的: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>

在这之后我开始拿我的DRL


如果5.x代码的“第二行”通过该相对路径名从类路径中的一个目录(但bla/不在类路径上)找到“bla/checkLicense.drl”,那么逻辑上会认为getKieClasspathContainer()将找不到checkLicense.drl,因为该方法被记录为在类路径上查找drl文件,很明显,你没有提供任何额外的信息。(我从未尝试过这种构建技术,所以我不能说这就是答案——我觉得这是值得追求的。)我认为你正朝着正确的方向前进,你能告诉我如何使用6.2.0进行构建吗?即使是bruteforce指向drl文件。请注意。如果在类路径中包含
bla/
,或者将`checkLicense.drl`移动到类路径中的一个目录,会发生什么?任何一个都会立即显示我的猜测是否正确。在atm机上做截图,发现这对我们有帮助吗?我是一名优秀的研究人员,但思考能力差:-)早上。那是jBPM——业务流程模型的东西。它与规则相关,但添加了其他内容。6.2.0似乎要求正确解决jboss repo。(如果您使用的是maven),
“src/main/resources/simple.drl”
代表什么?它不是在操作系统文件资源管理器中的该位置生成的。@AnmolSinghJaggi它是文件系统对象kfs的路径名。与磁盘上的文件等无关。
<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>