在drools中运行helloworld时获取空指针异常

时间:2013-12-01 18:55:20

标签: java eclipse nullpointerexception drools

运行简单的helloworld示例drools项目时出现以下错误。

199 [main] ERROR org.drools.compiler.kie.builder.impl.KieContainerImpl - Unknown KieSession name: ksession-rules
java.lang.NullPointerException
    at com.sample.DroolsTest.main(DroolsTest.java:24)

代码:

package com.sample;

import org.kie.api.KieServices; import
org.kie.api.runtime.KieContainer; import
org.kie.api.runtime.KieSession;

/**  * This is a sample class to launch a rule.  */ public class
DroolsTest {

    public static final void main(String[] args) {
        try {
            // load up the knowledge base
            KieServices ks = KieServices.Factory.get();
            KieContainer kContainer = ks.getKieClasspathContainer();
            KieSession kSession = kContainer.newKieSession("ksession-rules");

            // go !
            Message message = new Message();
            message.setMessage("Hello World");
            message.setStatus(Message.HELLO);
            kSession.insert(message);
            kSession.fireAllRules();
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }

    public static class Message {

        public static final int HELLO = 0;
        public static final int GOODBYE = 1;
        private String message;
        private int status;

        public String getMessage() {
            return this.message;
        }

        public void setMessage(String message) {
            this.message = message;
        }

        public int getStatus() {
            return this.status;
        }

        public void setStatus(int status) {
            this.status = status;
        }

    }

}

drools代码:

package com.sample
import com.sample.DroolsTest.Message;

rule "Hello World"
when
    m : Message( status == Message.HELLO, myMessage : message )
then
    System.out.println( myMessage );
    m.setMessage( "Goodbye cruel world" );
    m.setStatus( Message.GOODBYE );
    update( m );
end

rule "GoodBye"
when
    Message( status == Message.GOODBYE, myMessage : message )
then
    System.out.println( myMessage );
end

8 个答案:

答案 0 :(得分:13)

看起来流口水kie-api /内部库执行在drcols eclipse项目的src \ main \ resources \ META-INF \ maven \ pom.properties文件下查找强制值。

将我的pom.xml或pom.properties更新为以下内容在6.0.0 drools发行版上运行良好。

groupId=com.test.sample.drools
artifactId=DroolsTestProject
version=1

答案 1 :(得分:2)

我最近开始使用JBPM并遇到了类似的问题。我有两个问题需要解决。

首先,我需要创建Another answer in this thread中列出的pom.properties文件。我必须创建src / main / resources / META-INF / maven / pom.properties文件,因为当我通过eclipse创建一个新的JBPM Maven项目时它不会自动生成。该文件应具有以下信息,这些信息应与项目的pom文件匹配:

groupId=com.sample
artifactId=jbpm-example
version=1.0.0-SNAPSHOT

我遇到的另一个问题是有一个空白的kmodule.xml。这应该在src / main / resources / META-INF / kmodule.xml中。您将需要文件中的以下内容:

<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule">
    <kbase name="process" packages="process">
        <ksession name="ksession-process"/>
    </kbase>
</kmodule>

如果查看newKieSession方法参数,则需要匹配ksession元素的“name”属性。 kbase元素的“packages”属性需要与DRL文件所在的包名称相匹配。

答案 2 :(得分:1)

这里的答案稍晚,但是......

我检查了我的pom.properties文件,它只包含这个:

groupId=
artifactId=
version=

没有定义任何内容! 将其更改为:

groupId=DroolsTest
artifactId=DroolsTest
version=0.0.1-SNAPSHOT  

将你拥有的所有内容作为pom.xml中的属性并将它们放在pom.properties中解决了我的问题。现在运行得很好。

答案 3 :(得分:0)

使用Maven配置示例项目依赖项。你需要运行&#34; mvn eclipse:eclipse&#34;在命令行上,或安装m2e Eclipse插件。

答案 4 :(得分:0)

在将.drl文件添加到classpath之后有同样的问题并且工作正常,如下面的线程所述 http://drools.46999.n3.nabble.com/Null-pointer-exception-when-adding-drools-to-existing-project-td4027944.html#a4028011

答案 5 :(得分:0)

关于这个主题进行了非常有建设性的讨论,几乎把它钉在了这里:DISCUSSION

答案 6 :(得分:0)

检查你的kmodule.xml 你必须在那里添加新的ksession。同样,在该文件中定义新的kbase时,请确保每个kbase的名称不同,并且包名称是规则所在的位置。 ksession名称是您在启动ksession时在执行中指定的名称。

答案 7 :(得分:0)

https://www.tutorialspoint.com/drools/index.htm

该教程有效,但是需要更改drl包

请参见下图,了解如何配置项目

enter image description here