运行简单的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
答案 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)