drools 6.0中的未知KieSession名称(尝试将drools添加到现有的maven / eclipse项目时)

我正在尝试将drools6.0用于现有的代码库(它是eclipse下的maven项目)。 我以前没有必要学习流口水或者maven(尽管它们是我之前项目的一部分),足以说我迷失了我想做的事情。 根据我的理解(谷歌搜索),java类文件被绑定到基于包名称(?)的规则。 这会解决编译时问题。 但我在运行时看到空指针exception。 为了使drools适应我现有的代码库:I 1)创建了helloworld drools项目,成功运行它2)将java文件复制到我现有的包中,3)在Eclipse中使用正确的包创建规则文件:FIle-> New-> other – >规则资源; 3)通过右键单击项目并将configure-> convert转换为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,并在最后一行抛出空指针exception

 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); 

已经花了一天多的时间试图找出流氓是如何工作的,以及如何解决上述问题。 Pl建议

1)我采取正确的方法将现有项目转换为drools项目。 我想要我的代码库的所有现有function; 但是希望为将来的增强添加基于规则的方法。 遇到以下链接,但不清楚是否有助于我的情况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)解决空指针exception的任何提示(假设我采用正确的方法将现有项目转换为drools项目)

更新 @David:感谢您的详细信息。 我意识到将现有项目转换为maven项目虽然有效,但由于保留了现有的目录结构/命名(很可能与maven默认创建的不同),因此对我没有吸引力。 我发布了替代解决方案,我认为这个问题与类路径问题有关http://drools.46999.n3.nabble.com/Null-pointer-exception-when-adding-drools-to-existing-project-td4027944.html #a4028011

我遇到了类似的问题。

我认为问题的一部分是试图生活在两个世界。 JBoss Drools eclipse插件世界和maven世界。

我安装了Eclipse 4.3.1(Kepler),安装了各种Jboss / Drools插件。

我采用了一个工作的eclipse示例,并确保我可以在maven中运行它。

  1. 创建了一个演示drools项目File-> New-> Other ..-> Drools-> Drools Project
  2. 确保您可以运行测试程序DroolsTest
  3. 将项目转换为maven项目 – 配置 – >转换为Maven项目(这将创建一个包含许多依赖项的pom.xml文件。这些可以是修剪)
  4. 从构建路径中删除了Drools库 – 在项目属性Build Path – > Libraries中 – 选择Drools Library并单击Remove
  5. 禁用Drools构建器 – 在项目属性中构建器 – >取消选中Drools Builder
  6. 从pom.xml中注释掉依赖jsr94(不可检索)
  7. 从命令行“mvm clean install”运行maven。

这应该为您提供一个完全由Maven构建和运行的项目。

添加到您的pom.xml

   org.codehaus.mojo exec-maven-plugin 1.2.1  

  org.slf4j slf4j-simple 1.7.2 runtime  

尝试:

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 ...
... [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。

您将拥有rules-> Sample.drl文件和kmodule.xml文件。

       

“ksession”名称应与创建ksession的代码匹配:

 KieSession kSession = kContainer.newKieSession("ksession-rules"); 

“packages”应该与规则文件所在的目录匹配。

我认为有一个更简单的答案 ……我今天偶然发现了这一点,因为我正在尝试同样的事情,并在跟踪讨论列表中的线索后开始工作:

我试图让Drools从Pure Maven Project中的Spring MVC WEB执行(没有添加任何类型的性质)并首先遇到这个问题:

错误KieContainerImpl – 未知的KieSession名称:ksession-rules

初始RND :(某个方向 – 但没有解决方案)

drools 6.0中的未知KieSession名称(尝试将drools添加到现有的maven / eclipse项目时) 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递归

解:

事实certificate,创建目录WEB-INF / classes并将文件pom.propertiespom.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文件永远不会更改。

这是我的经验 – 希望它可以帮助某人……

我们有很多例子,都记录在案。 让你开始。 每个都可以使用maven从命令行运行,并进行unit testing以显示它们正在运行。 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

我在尝试JBoss示例时遇到了类似的问题:4.2.6.1。 默认KieSession http://docs.jboss.org/drools/release/6.4.0.Final/drools-docs/html/ch04.html#KIEExamplesSection

我在尝试默认的KieSession示例时遇到以下exception:

 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 xmlns="http://jboss.org/kie/6.0.0/kmodule"  

这里的答案不太晚,但这可能对其他人有所帮助。

检查您的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。 现在运行正常。

根据我的经验,我试图在删除这些依赖项后在pom.xml中添加以下maven依赖项。 它对我有用。

   org.drools drools-core ${runtime.version}   org.drools drools-decisiontables ${runtime.version}   org.jbpm jbpm-test ${runtime.version}