当前位置: 首页 > 面试题库 >

Drools 6.0中未知的KieSession名称(尝试将Drools添加到现有Maven / Eclipse项目时)

施敏达
2023-03-14
问题内容

我正在尝试将drools6.0修改为现有代码库(eclipse下的maven项目)。我以前不需要学习流口水或Maven(尽管它们是我以前的项目的一部分),足以说我迷失了自己想做的事情。根据我的理解(查找),Java类文件被挂接到基于包名(?)的规则上。这样可以解决编译时间问题。但是我在运行时看到空指针异常。为了使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为空,并且在最后一行中抛出空指针异常

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项目。我想要代码库中所有现有的功能;但希望添加基于规则的方法以进行将来的增强。遇到了以下链接,但不清楚它是否对我的情况有帮助
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世界。

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

我以一个日食的例子为例,并确保可以在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构建器-在项目属性Builders中->取消选中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>

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

您将有一个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>

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

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

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



 类似资料:
  • 如何在这个现有项目中使用Maven? 此外,当我尝试添加Maven Project并在步骤“Select a Archetype”时,所有显示的原型都有版本“Release”。当我在这一步中单击Next时,Eclipse变得没有响应。它使用内存甚至没有增加。

  • 如何将eclipse中现有的java项目添加到Git中? 我注意到,在创建项目时,有一个选项可以添加到源代码管理中,但我在现有项目中找不到这个选项。这是否可以从eclipse中的git插件实现,或者必须从命令行完成?(我在用Mac)

  • 使用Eclipse Indigo导入现有的maven项目,得到的工作区项目在构建路径中不包括或。我还希望groovy代码的输出目录设置为。 这是我对这支优秀的队伍的第一个问题,所以我希望我涵盖了所有的基础。 Eclipse Indigo 针对Eclipse 1.2.0.20120903-1050的M2E-Maven集成org.Eclipse.m2e.feature.feature.group Ec

  • 问题内容: 如何在Eclipse中将现有的Java项目添加到git中? 我注意到在创建项目时,有一个选项可以添加到源代码管理中,但是对于现有项目,我找不到此选项。这是可以从Eclipse中的git插件实现的,还是必须从命令行完成?(我使用的是Mac) 问题答案: 另一种方法(我发现内置的Eclipse工具有时很挑剔): 打开您的终端 导航到您的项目目录 键入以创建存储库 假设该文件夹中已经有文件,

  • 问题内容: 对于正在执行的项目,我们正在考虑使用Eclipse的Maven插件来自动化我们的构建。现在,该过程比应该的要复杂得多,并且我们希望Maven可以将事情简化为一键式构建。 我的问题是,是否存在使用Maven插件将现有的Eclipse Java项目转换为Maven项目的向导或自动导入器?或者我应该创建一个新的Maven项目并手动复制所有源文件,库等。 问题答案: 如果您只想创建一个默认的P

  • 问题内容: Eclipse Helios 3.6 Windows XP SP3 我已经使用Eclipse通过以下方式下载了guava SDK: 1)在Eclipse中,转到 帮助 >安装新软件… 2)在“ 使用: ”文本框中,我使用了以下URL http://svn.codespot.com/a/eclipselabs.org/guava- bundle/trunk/repository/ 3)它