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

时间:2014-01-30 20:22:37

标签: java eclipse maven drools

我正在尝试将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

有关

6 个答案:

答案 0 :(得分:7)

我遇到了类似的问题。

我认为问题的一部分是试图生活在两个世界。 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中 - >库 - 选择Drools Library并单击Remove
  5. 禁用Drools构建器 - 在项目属性中构建器 - >取消选中Drools Builder
  6. 从pom.xml中注释掉依赖jsr94(不可检索)
  7. 从命令行“mvm clean install”运行maven。
  8. 这应该为您提供一个完全从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>