当项目导出到JAR

时间:2016-02-22 02:20:15

标签: 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。稍后我访问导致kSession的{​​{1}}对象。我已经尝试在上述行之后立即断开,以确认我以后不会以某种方式使其无效。我可以在调用NullPointerException之后立即确认ksessionnull

有没有人知道为什么行为会有所不同?我已经确认我使用完全相同的运行配置导出。导出时,我同时尝试了newKieSession()"Extract required libraries into generated JAR"。两者都会发生错误。

更新

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

"Package required libraries into generated jar"

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

更新

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

enter image description here

更新

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导出的行为是不同的。项目中的路径完全相同,我使用完全相同的过程导出它。

2 个答案:

答案 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();