【发布时间】:2015-11-16 09:54:52
【问题描述】:
我正在使用 spring 3.5 + drools 6.3.0
我有一个多模块项目,其中模块 A 包含 drools 定义以及 drl 资源,该模块由具有主类的模块 B 使用。
在开发模式下一切正常,但是在构建和部署包时它一直抛出这个异常:
java.lang.NoClassDefFoundError: 无法初始化类 org.drools.compiler.kie.util.CDIHelper$BeanCreatorHolder 在 org.drools.compiler.kie.util.CDIHelper.wireListnersAndWIHs(CDIHelper.java:45) ~[drools-compiler-6.3.0.Final.jar:6.3.0.Final] 在 org.drools.compiler.kie.builder.impl.KieContainerImpl.newKieSession(KieContainerImpl.java:594) ~[drools-compiler-6.3.0.Final.jar:6.3.0.Final] 在 org.drools.compiler.kie.builder.impl.KieContainerImpl.newKieSession(KieContainerImpl.java:558) ~[drools-compiler-6.3.0.Final.jar:6.3.0.Final] 在 fr.cerner.jango.ui.bi.PostProcessItemsService.getKieSession(PostProcessItemsService.java:49) ~[fr.cerner.questionnaire-1.7.0-20151116.111758-41.jar:na] 在 fr.cerner.fides.dashboard.questionnaire.p2p.handler.ItemsPersistenceProcessor.process(ItemsPersistenceProcessor.java:37) ~[fr.cerner.questionnaire-1.7.0-20151116.111758-41.jar:na] 在 fr.cerner.fides.dashboard.questionnaire.p2p.handler.PersistenceQueue.flush(PersistenceQueue.java:44) ~[fr.cerner.questionnaire-1.7.0-20151116.111758-41.jar:na] 在 fr.cerner.fides.dashboard.questionnaire.p2p.aop.ItemEventsAspect.modify(ItemEventsAspect.java:67) ~[fr.cerner.questionnaire-1.7.0-20151116.111758-41.jar:na] 在 fr.cerner.jango.ui.AMOComposite.handleSaveChanges(AMOComposite.java:474) [fr.cerner.questionnaire-1.7.0-20151116.111758-41.jar:na] 在 fr.cerner.jango.ui.AMOComposite.access$3(AMOComposite.java:446) [fr.cerner.questionnaire-1.7.0-20151116.111758-41.jar:na] 在 fr.cerner.jango.ui.AMOComposite$5.widgetSelected(AMOComposite.java:320) [fr.cerner.questionnaire-1.7.0-20151116.111758-41.jar:na] 在 org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:248) [org.eclipse.swt.win32.win32.x86-3.103.2-SDK-4.4.2.jar:na] 在 org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) [org.eclipse.swt.win32.win32.x86-3.103.2-SDK-4.4.2.jar:na] 在 org.eclipse.swt.widgets.Display.sendEvent(Display.java:4353) [org.eclipse.swt.win32.win32.x86-3.103.2-SDK-4.4.2.jar:na] 在 org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1061) [org.eclipse.swt.win32.win32.x86-3.103.2-SDK-4.4.2.jar:na] 在 org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4172) [org.eclipse.swt.win32.win32.x86-3.103.2-SDK-4.4.2.jar:na] 在 org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3761) [org.eclipse.swt.win32.win32.x86-3.103.2-SDK-4.4.2.jar:na]
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:kie="http://drools.org/schema/kie-spring"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://drools.org/schema/kie-spring http://drools.org/schema/kie-spring-2.0.0.xsd">
<kie:kmodule id="questionnaireBI" >
<kie:kbase name="pre-process" packages="rules.preprocess"
equalsBehavior="equality">
<kie:ksession name="preProcessKSession" type="stateful"
scope="prototype">
<kie:consoleLogger />
</kie:ksession>
</kie:kbase>
.... other kbase definition omitted
<!--pour les @KSession etc .. annotation -->
<bean id="kiePostProcessor"
class="org.kie.spring.annotations.KModuleAnnotationPostProcessor" />
<bean id="handleChangeEventService" class="fr.cerner.jango.ui.bi.ExonerationService" />
<bean id="checkItemsService" class="fr.cerner.jango.ui.bi.CheckItemsService" />
<bean id="itemsValidationService" class="fr.cerner.jango.ui.bi.ItemsValidationService" />
<bean id="postProcessItemsService" class="fr.cerner.jango.ui.bi.PostProcessItemsService" />
</beans>
这是我的进口:
<!-- drools engine -->
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-api</artifactId>
</dependency>
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-spring</artifactId>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-core</artifactId>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-compiler</artifactId>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-verifier</artifactId>
</dependency>
更新
这是我如何初始化 KSession(也尝试过注入)
// placed here to early initialize the engine
@PostConstruct
public void postConstruct() {
factory = org.kie.api.KieServices.Factory.get();
container = factory.getKieClasspathContainer();
//
// container = factory.getKieClasspathContainer(
// ProjectClassLoader.getClassLoader(CDIHelper.class.getClassLoader(),
// ExonerationService.class, true));
Executors.newSingleThreadExecutor().execute(new Runnable() {
@Override
public void run() {
KieSession kieSession = getKieSession();
kieSession.dispose();
}
});
}
private KieSession getKieSession() {
return container.newKieSession("preProcessKSession");// context.getBean("preProcessKSession",
// KieSession.class);
}
非常感谢任何想法或线索。
【问题讨论】:
-
你有错误的完整堆栈跟踪吗?
-
谢谢,我更新了stacktrace
-
您是否使用 app/servlet 容器来部署您的应用程序?哪一个?你得到的例外是隐藏我认为的真实的。您可以调试 CDIHelper 类的任何更改?我会特别注意
lookupBeanManagerfromCDIHelper.BeanCreatorHolder的方法:github.com/droolsjbpm/drools/blob/6.3.x/drools-compiler/src/… -
不,事实上它是一个桌面应用程序,我没有应用程序/servlet 容器,但在这里我更新了完整的堆栈跟踪。谢谢你了