这里有一个非常令人困惑的问题。我看到在 Eclipse 中运行项目和将项目作为导出的 JAR 运行的行为有所不同。当项目在 Eclipse 中运行时,它运行良好。当它作为 JAR 运行时,它会崩溃。 newKieSession
方法导致崩溃。
这是代码块:
KieServices ks = KieServices.Factory.get();
KieContainer kContainer = ks.getKieClasspathContainer();
KieSession kSession = kContainer.newKieSession("ksession-rules");
从 Eclipse 运行时,它工作正常。当我导出 JAR 并运行它时,kSession
为 null
。稍后,我访问了导致 NullPointerException
的 kSession
对象。我已经尝试在上面的行之后立即中断,只是为了确认我以后不会以某种方式使它无效。在调用 newKieSession()
之后,我可以立即确认 ksession
为 null
。
有谁知道为什么行为会有所不同?我已确认我正在使用完全相同的运行配置进行导出。当我导出时,我尝试了 “将需要的库提取到生成的 JAR 中”
以及 “将需要的库打包到生成的 jar 中”
。错误同时发生。
更新:
注意到异常发生前控制台返回的大量信息中的另一条错误消息。
[main] ERROR org.drools.compiler.kie.builder.impl.KieContainerImpl - Unknown KieSession name: ksession-rules
当我通过 Eclipse 运行时我没有得到这个。
更新:
附件是Eclipse中的项目结构。我已经扩展了资源文件夹,因为它似乎与情况最相关。
更新:
jar 文件包含一个资源文件夹,其结构与eclipse 屏幕截图相同。因此,在 jar 的根目录中,我们可以找到以下内容:
/resources/rules/*.drl
/resources/META-INF/kmodule.xml
kmodule.xml 的内容:
<?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>
我还尝试了以下 kmodule,结果相同:
<?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>
更新
jar 的根目录似乎有第二个 META-INF 文件夹。所以 jar 有以下内容:
/META-INF
/resources/rules/*.drl
/resources/META-INF/kmodule.xml
我尝试构建一个示例 drools 程序,我注意到当示例 drools 程序运行时,kmodule.xml
文件最终位于 /META-INF/kmodule.xml
导出到 jar 。我不知道为什么我的 jar 导出行为不同。项目中的路径完全相同,我正在使用完全相同的过程导出它。
最佳答案
问题出在 Eclipse 构建路径设置中。资源文件夹的值设置为“包含”。删除它后(因此将“包含”设置为“全部”),构建再次开始工作。
如果有人遇到此问题,您可以通过以下方式找到我描述的设置:
Project Properties > Java Build Path > Source > /src/main/resources > Included > Edit
感谢 Esteban 向我建议类路径可能存在问题。
关于java - 当项目导出到 JAR 时,newKieSession() 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35544815/