newKieSession() returns 当项目导出到 JAR 时为 null
newKieSession() returns null when project is exported to JAR
这里有一个非常令人困惑的问题。我发现在 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
对象,它导致 NullPointerException
。我已经尝试在上面的行之后立即中断,只是为了确认我以后不会以某种方式使它无效。在调用 newKieSession()
.
之后,我可以确认 ksession
是 null
有谁知道为什么行为会有所不同?我已确认我正在使用完全相同的 运行 配置进行导出。当我导出时,我已经尝试了 "Extract required libraries into generated JAR"
和 "Package required libraries into generated jar"
。两者都会发生错误。
更新:
注意到异常发生前控制台返回的大量信息中的另一条错误消息。
[main] ERROR org.drools.compiler.kie.builder.impl.KieContainerImpl - Unknown KieSession name: ksession-rules
当我通过 Eclipse 运行 时,我没有得到这个。
更新:
附件是项目在Eclipse中的结构。我已经扩展了资源文件夹,因为它似乎与情况最相关。
更新:
jar文件包含一个与eclipse截图结构相同的resources文件夹。因此,在 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 文件夹。所以罐子有以下内容:
/META-INF
/resources/rules/*.drl
/resources/META-INF/kmodule.xml
我尝试构建一个示例 drools 程序,我注意到当示例 drools 程序导出到 jar 时,kmodule.xml
文件最终位于 /META-INF/kmodule.xml
。我不知道为什么我的 jar 导出行为不同。项目中的路径完全相同,我正在使用完全相同的过程导出它。
问题出在 Eclipse 构建路径设置中。资源文件夹的值设置为 "Included"。删除它之后(因此将 "Included" 设置为 "All"),构建再次开始工作。
如果有人遇到此问题,您可以通过以下方式找到我描述的设置:
Project Properties > Java Build Path > Source > /src/main/resources > Included > Edit
感谢 Esteban 向我建议类路径可能有问题。
我有同样的错误信息。我删除了“ksession-rules”参数,它为我解决了这个问题。
更改 => KieSession kSession = kContainer.newKieSession("ksession-rules");
to => KieSession kSession = kContainer.newKieSession();
这里有一个非常令人困惑的问题。我发现在 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
对象,它导致 NullPointerException
。我已经尝试在上面的行之后立即中断,只是为了确认我以后不会以某种方式使它无效。在调用 newKieSession()
.
ksession
是 null
有谁知道为什么行为会有所不同?我已确认我正在使用完全相同的 运行 配置进行导出。当我导出时,我已经尝试了 "Extract required libraries into generated JAR"
和 "Package required libraries into generated jar"
。两者都会发生错误。
更新:
注意到异常发生前控制台返回的大量信息中的另一条错误消息。
[main] ERROR org.drools.compiler.kie.builder.impl.KieContainerImpl - Unknown KieSession name: ksession-rules
当我通过 Eclipse 运行 时,我没有得到这个。
更新:
附件是项目在Eclipse中的结构。我已经扩展了资源文件夹,因为它似乎与情况最相关。
更新:
jar文件包含一个与eclipse截图结构相同的resources文件夹。因此,在 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 文件夹。所以罐子有以下内容:
/META-INF
/resources/rules/*.drl
/resources/META-INF/kmodule.xml
我尝试构建一个示例 drools 程序,我注意到当示例 drools 程序导出到 jar 时,kmodule.xml
文件最终位于 /META-INF/kmodule.xml
。我不知道为什么我的 jar 导出行为不同。项目中的路径完全相同,我正在使用完全相同的过程导出它。
问题出在 Eclipse 构建路径设置中。资源文件夹的值设置为 "Included"。删除它之后(因此将 "Included" 设置为 "All"),构建再次开始工作。
如果有人遇到此问题,您可以通过以下方式找到我描述的设置:
Project Properties > Java Build Path > Source > /src/main/resources > Included > Edit
感谢 Esteban 向我建议类路径可能有问题。
我有同样的错误信息。我删除了“ksession-rules”参数,它为我解决了这个问题。
更改 => KieSession kSession = kContainer.newKieSession("ksession-rules");
to => KieSession kSession = kContainer.newKieSession();