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

kas*_*ili 5 java eclipse drools maven

我正在尝试将drools6.0用于现有的代码库(它是eclipse下的maven项目).我以前没有必要学习流口水或者maven(尽管它们是我之前项目的一部分),足以说我迷失了我想做的事情.根据我的理解(谷歌搜索),java类文件被绑定到基于包名称(?)的规则.这会解决编译时问题.但我在运行时看到空指针异常.为了让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)
Run Code Online (Sandbox Code Playgroud)

这是因为从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);
Run Code Online (Sandbox Code Playgroud)

已经花了一天多的时间试图找出流氓是如何工作的,以及如何解决上述问题.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");
Run Code Online (Sandbox Code Playgroud)

3)解决空指针异常的任何提示(假设我采用正确的方法将现有项目转换为drools项目)

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

小智 8

我遇到了类似的问题.

我认为问题的一部分是试图生活在两个世界.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

 <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>1.2.1</version>
  </plugin>
Run Code Online (Sandbox Code Playgroud)

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-simple</artifactId>
  <version>1.7.2</version>
  <scope>runtime</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)

尝试:

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.

您将拥有rules-> 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>
Run Code Online (Sandbox Code Playgroud)

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

KieSession kSession = kContainer.newKieSession("ksession-rules");
Run Code Online (Sandbox Code Playgroud)

"packages"应该与规则文件所在的目录匹配.