java - 当项目导出到 JAR 时,newKieSession() 返回 null

标签 java eclipse jar drools kie

这里有一个非常令人困惑的问题。我看到在 Eclipse 中运行项目和将项目作为导出的 JAR 运行的行为有所不同。当项目在 Eclipse 中运行时,它运行良好。当它作为 JAR 运行时,它会崩溃。 newKieSession 方法导致崩溃。

这是代码块:

KieServices ks = KieServices.Factory.get();
KieContainer kContainer = ks.getKieClasspathContainer();
KieSession kSession = kContainer.newKieSession("ksession-rules");

从 Eclipse 运行时,它工作正常。当我导出 JAR 并运行它时,kSessionnull。稍后,我访问了导致 NullPointerExceptionkSession 对象。我已经尝试在上面的行之后立即中断,只是为了确认我以后不会以某种方式使它无效。在调用 newKieSession() 之后,我可以立即确认 ksessionnull

有谁知道为什么行为会有所不同?我已确认我正在使用完全相同的运行配置进行导出。当我导出时,我尝试了 “将需要的库提取到生成的 JAR 中” 以及 “将需要的库打包到生成的 jar 中”。错误同时发生。

更新:

注意到异常发生前控制台返回的大量信息中的另一条错误消息。

[main] ERROR org.drools.compiler.kie.builder.impl.KieContainerImpl - Unknown KieSession name: ksession-rules

当我通过 Eclipse 运行时我没有得到这个。

更新:

附件是Eclipse中的项目结构。我已经扩展了资源文件夹,因为它似乎与情况最相关。

enter image description here

更新:

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/

相关文章:

java - 在 SQLiteDatabase 中存储一个具有 List<Object> 和字符串的对象

java - 如何从不是从 ObjectOutputStream 创建的 byte[] 重建对象?

java.lang.NoClassDefFoundError : Failed resolution of: Landroid/support/v4/graphics/drawable/DrawableWrapper; 错误

java - 我怎样才能解决 CLASSPATH 问题并在 OSX 上编译 OpenKinect Java 示例?

java - 能够从 Linux 中的链接运行 jar

java - GWT 资源包找不到类路径

eclipse - 在 Eclipse Kepler 中安装 e(fx)clipse 的问题

java - 我如何知道Eclipse、Android SDK中的异常是什么?

java - Eclipse 错误调试

gradle - 在 nebula/gradle 中,如何将正在发布的版本注入(inject)正在发布的 jar 中?