这里非常令人困惑的问题。我看到在Eclipse中运行项目和将项目作为导出的JAR运行之间的行为有所不同。当项目在Eclipse中运行时,它运行正常。当它作为JAR运行时,它会崩溃。崩溃来自newKieSession
方法。
以下是代码块:
KieServices ks = KieServices.Factory.get();
KieContainer kContainer = ks.getKieClasspathContainer();
KieSession kSession = kContainer.newKieSession("ksession-rules");
从Eclipse运行时,它运行正常。当我导出JAR并运行它时,kSession
为null
。稍后我访问导致kSession
的{{1}}对象。我已经尝试在上述行之后立即断开,以确认我以后不会以某种方式使其无效。我可以在调用NullPointerException
之后立即确认ksession
是null
。
有没有人知道为什么行为会有所不同?我已经确认我使用完全相同的运行配置导出。导出时,我同时尝试了newKieSession()
和"Extract required libraries into generated JAR"
。两者都会发生错误。
更新
在异常之前在控制台返回的大量信息中注意到另一条错误消息。
"Package required libraries into generated jar"
当我通过Eclipse运行时,我没有得到这个。
更新
附件是Eclipse中项目的结构。我已经扩展了资源文件夹,因为它似乎与情况最相关。
更新
jar文件包含一个与eclipse截图结构相同的资源文件夹。所以,在jar的根部,我们可以找到以下内容:
[main] ERROR org.drools.compiler.kie.builder.impl.KieContainerImpl - Unknown KieSession name: ksession-rules
kmodule.xml的内容:
/resources/rules/*.drl
/resources/META-INF/kmodule.xml
我也尝试了以下kmodule,结果相同:
<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule">
<kbase name="rules" packages="com.company.project">
<ksession name="ksession-rules"/>
</kbase>
</kmodule>
更新
jar的根似乎有第二个META-INF文件夹。所以jar有以下几点:
<?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>
我尝试构建一个示例drools程序,并且我注意到/META-INF
/resources/rules/*.drl
/resources/META-INF/kmodule.xml
文件在样本drools程序导出到jar时最终在kmodule.xml
。我不知道为什么我的jar导出的行为是不同的。项目中的路径完全相同,我使用完全相同的过程导出它。
答案 0 :(得分:3)
问题出在Eclipses构建路径设置中。 resources文件夹的值为“Included”设置。删除后(将“包含”设置为“全部”),构建再次开始工作。
如果有人遇到此问题,您可以找到我所描述的设置:
Project Properties > Java Build Path > Source > /src/main/resources > Included > Edit
感谢Esteban向我建议,类路径可能存在问题。
答案 1 :(得分:0)
我有同样的错误信息。我删除了“ksession-rules”参数,它为我解决了这个问题。
Change => KieSession kSession = kContainer.newKieSession("ksession-rules");
to => KieSession kSession = kContainer.newKieSession();