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

标签 java eclipse maven drools

我正在尝试将 drools6.0 改编为现有代码库(它是 eclipse 下的 maven 项目)。 我以前不需要学习 drools 或 maven(尽管它们是我之前项目的一部分),足以说我迷失在我想做的事情中。 根据我的理解(谷歌搜索),Java 类文件会根据包名称(?)与规则 Hook 。这会处理编译时问题。但是我在运行时看到空指针异常。为了使 drools 适应我现有的代码库:我 1)创建了 helloworld drools 项目,成功运行了它 2)将 java 文件复制到我现有的包中,3)在 Eclipse 中使用正确的包创建了规则文件:FIle->New->other ->规则资源; 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);

已经花了一天多的时间试图弄清楚流口水是如何工作的以及如何解决上述问题。请建议

1) 我是否采用了正确的方法将现有项目转换为 drools 项目。我想要我的代码库的所有现有功能;但想为 future 的增强添加基于规则的方法。遇到以下链接,但不清楚它是否对我的情况有帮助 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

最佳答案

我遇到了类似的问题。

我认为部分问题在于试图生活在两个世界中。 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 库 - 在项目属性构建路径 -> 库中 - 选择 Drools 库并单击删除
  5. 禁用 Drools 生成器 - 在项目属性生成器中 -> 取消选中 Drools 生成器
  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>

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

You should now also be able to run DroolsTest from eclipse.

You will have a rules->Sample.drl file and a kmodule.xml file.

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

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

关于java - drools 6.0 中未知的 KieSession 名称(尝试将 drools 添加到现有的 maven/eclipse 项目中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21466716/

相关文章:

java - 异常后更新 Camel 交换体并继续路线

java - 检查样式 : always receive File contains tab characters (this is the first instance)

java - mvn checkstyle :checkstyle uses wrong configuration when using reporting

java - pom.xml 中存在依赖项错误 : Missing artifact org. eclipse.jetty.tests :test-mock-resources:jar:9. 1.0.v20131115

JAVA -AWS 从 Elastic Beanstalk 上的 JAVA 应用程序访问 S3 存储桶

java - 使用java for循环恢复int数组

java - 为什么我的 Thymeleaf 仅显示列表的最后一行

java - 可序列化类 Employee 没有声明 long 类型的静态最终 serialVersionUID 字段

java - Maven/Eclipse 外部 jar 故障排除

java - 为 Maven 将分拆的子 JVM 进程设置 permgen 大小