我正在尝试将drools6.0用于现有的代码库(它是eclipse下的maven项目)。 我以前没有必要学习流口水或者maven(尽管它们是我之前项目的一部分),足以说我迷失了我想做的事情。 根据我的理解(谷歌搜索),java类文件被绑定到基于包名称(?)的规则。这会解决编译时问题。但我在运行时看到空指针异常。为了让drools适应我现有的代码库:I 1)创建了helloworld drools项目,成功运行它2)将java文件复制到我现有的包中,3)在Eclipse中使用正确的包创建规则文件:FIle-> New-&gt ;其他 - >规则资源; 3)通过右键单击项目并配置 - >转换为drools项目将现有项目转换为drools包
这一切都解决了编译问题,但我得到了以下运行时错误
[main] ERROR org.drools.compiler.kie.builder.impl.KieContainerImpl - Unknown KieSession name: ksession-rules
java.lang.NullPointerException
at main.java.com.harmonia.cbm.afloat.dataaquisition.dql.DroolsTest.main(DroolsTest.java:23)
这是因为从kcontainer返回的ksession为null并在最后一行抛出空指针异常
KieServices ks = KieServices.Factory.get();
KieContainer kContainer = ks.getKieClasspathContainer();
KieSession kSession = kContainer.newKieSession("ksession-rules");
// above line is returning null
Message message = new Message();
message.setMessage("Hello World");
message.setStatus(Message.HELLO);
kSession.insert(message);
已经花了一天多的时间试图弄清楚drools是如何工作的,以及如何解决上述问题。 Pl建议
1)我采取正确的方法将现有项目转换为drools项目。我想要我的代码库的所有现有功能;但是希望为将来的增强添加基于规则的方法。遇到以下链接,但不清楚是否有助于我的情况 http://drools.46999.n3.nabble.com/Retrofitting-a-project-with-JBoss-Rules-td48656.html
2)任何有用的drools教程,以便更好地理解3行(除了java文档)
KieServices ks = KieServices.Factory.get();
KieContainer kContainer = ks.getKieClasspathContainer();
KieSession kSession = kContainer.newKieSession("ksession-rules");
3)解决空指针异常的任何提示(假设我采用正确的方法将现有项目转换为drools项目)
更新 @David:谢谢你的详细帖子。我意识到将现有项目转换为maven项目虽然有效,但由于保留了现有的目录结构/命名(很可能与maven默认创建的不同),因此对我没有吸引力。我发布了替代解决方案,我认为这个问题与类路径问题http://drools.46999.n3.nabble.com/Null-pointer-exception-when-adding-drools-to-existing-project-td4027944.html#a4028011
有关答案 0 :(得分:7)
我遇到了类似的问题。
我认为问题的一部分是试图生活在两个世界。 JBoss Drools eclipse插件世界和maven世界。
我安装了Eclipse 4.3.1(Kepler),安装了各种Jboss / Drools插件。
我采用了一个工作的eclipse示例,并确保我可以在maven中运行它。
这应该为您提供一个完全从Maven构建和运行的项目。
添加到您的pom.xml
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
</plugin>
和
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.2</version>
<scope>runtime</scope>
</dependency>
尝试:
mvn -e exec:java -Dexec.mainClass =“com.sample.DroolsTest”
它应该产生:
...
[com.sample.DroolsTest.main()] INFO org.drools.compiler.kie.builder.impl.ClasspathKieProject - Found kmodule: file:/Users/davidbernard/Projects/action-deducing-diff/xx/target/classes/META-INF/kmodule.xml
[com.sample.DroolsTest.main()] INFO org.drools.compiler.kie.builder.impl.KieRepositoryImpl - KieModule was added:FileKieModule[ ReleaseId=x:x:1.0file=/Users/davidbernard/Projects/action-deducing-diff/xx/target/classes]
[com.sample.DroolsTest.main()] INFO org.drools.compiler.kie.builder.impl.ClasspathKieProject - Found kmodule: file:/Users/davidbernard/Projects/action-deducing-diff/xx/target/classes/META-INF/kmodule.xml
[com.sample.DroolsTest.main()] INFO org.drools.compiler.kie.builder.impl.KieRepositoryImpl - KieModule was added:FileKieModule[ ReleaseId=x:x:1.0file=/Users/davidbernard/Projects/action-deducing-diff/xx/target/classes]
Hello World
Goodbye cruel world
...
你现在也应该能够从eclipse运行DroolsTest。
您将拥有规则 - &gt; Sample.drl文件和kmodule.xml文件。
<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule">
<kbase name="rules" packages="rules">
<ksession name="ksession-rules"/>
</kbase>
</kmodule>
“ksession”名称应与创建ksession的代码匹配:
KieSession kSession = kContainer.newKieSession("ksession-rules");
“packages”应该与规则文件所在的目录相匹配。
答案 1 :(得分:2)
我认为有一个更简单的答案 ...我今天偶然发现了这一点,因为我正在尝试同样的事情,并在跟踪讨论列表中的线索后开始工作:
我试图让Drools从Pure Maven Project中的Spring MVC WEB执行(没有添加任何类型的性质)并首先解决这个问题:
错误KieContainerImpl - 未知的KieSession名称:ksession-rules
初始RND :(某个方向 - 但没有解决方案)
Unknown KieSession name in drools 6.0 (while trying to add drools to existing maven/eclipse project) http://drools.46999.n3.nabble.com/Null-pointer-exception-when-adding-drools-to-existing-project-td4027944.html#a4028011
相关问题(...但大线索):
WARN ClasspathKieProject - 无法加载pom.properties尝试从/ Apache-Tomcat7 / webapps / maven-spring-drools / WEB-INF / classes递归下载
解决方案:
事实证明,创建目录 WEB-INF / classes 并将文件 pom.properties 和 pom.xml 放入其中解决了这个问题。线索来自以下链接: http://drools.46999.n3.nabble.com/Drools-6-Unable-to-build-index-of-kmodule-xml-td4026791.html - 其中Mark Proctor表示项目必须是maven项目,并且 需要找到pom.properties 即可。
一旦KIE找到pom.properties文件,它就会找出KieSession名称,问题就解决了。
注意:我怀疑您必须手动保留POM.XML文件,但pom.properties文件永远不会更改。
这是我的经历 - 希望它有助于某人......
答案 2 :(得分:2)
这里的答案很晚,但这可能对其他人有所帮助。
检查您的META-INF / Maven / pom.properties文件,它可能包含以下内容:
groupId=
artifactId=
version=
没有定义任何内容!将其更改为:
groupId=com.sample (package name)
artifactId=DroolsTest (class name)
version=0.0.1-SNAPSHOT
将pom.properties文件中的相同数据复制并粘贴到pom.xml。现在运行得很好。
答案 3 :(得分:1)
我们有很多例子,都记录在案。让你开始。每个都可以使用maven从命令行运行,并进行单元测试以显示它们正在运行。 https://github.com/droolsjbpm/drools/tree/master/drools-examples-api
这里的文件: http://docs.jboss.org/drools/release/6.0.1.Final/drools-docs/html/KIEChapter.html#KIEExamplesSection
答案 4 :(得分:1)
我在尝试JBoss示例时遇到了类似的问题: 4.2.6.1。默认KieSession http://docs.jboss.org/drools/release/6.4.0.Final/drools-docs/html/ch04.html#KIEExamplesSection
我在尝试默认的KieSession示例时遇到以下异常:
org.drools.compiler.kie.builder.impl.ClasspathKieProject - Unable to build index of kmodule.xml url=file:/C:/Repo/Git/temp/drools-examples/drools-examples/drools-examples-service/target/classes/META-INF/kmodule.xml
org.xml.sax.SAXParseException; systemId: file:/C:/Repo/Git/temp/drools-examples/drools-examples/drools-examples-service/target/classes/META-INF/kmodule.xml; lineNumber: 1; columnNumber: 52; cvc-elt.1.a: Cannot find the declaration of element 'kmodule'.
10:29:18.243 [main] ERROR org.drools.compiler.kie.builder.impl.KieContainerImpl - Unknown KieSession name: testsession
我意识到问题是由于Jboss Docs的默认kiession示例中使用的xmlns: 来自JBoss Docs - HAS ISSUE:
kmodule xmlns="http://www.drools.org/xsd/kmodule"
</kmodule>
我用过的东西 - 没有问题的工作:
kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule"
</kmodule>
答案 5 :(得分:0)
根据我的经验,我试图在删除依赖项之后在pom.xml中添加以下maven依赖项。它对我有用。
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-core</artifactId>
<version>${runtime.version}</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-decisiontables</artifactId>
<version>${runtime.version}</version>
</dependency>
<dependency>
<groupId>org.jbpm</groupId>
<artifactId>jbpm-test</artifactId>
<version>${runtime.version}</version>
</dependency>