我正在使用spring 3.5 + drools 6.3.0
我有一个多模块项目,其中模块A包含drools定义以及drl资源,该模块由具有主类的模块B使用。
在开发模式下,每件事都可以正常工作,但是当构建和部署包时,它会不断抛出这个异常:
java.lang.NoClassDefFoundError:无法初始化类org.drools.compiler.kie.util.CDIHelper $ BeanCreatorHolder at 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] at 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] at fr.cerner.fides.dashboard.questionnaire.p2p.aop.ItemEventsAspect.modify(ItemEventsAspect.java:67)〜[fr.cerner.questionnaire-1.7.0-20151116.111758-41.jar:na] at 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] at fr.cerner.jango.ui.AMOComposite $ 5.widgetSelected(AMOComposite.java:320)[fr.cerner.questionnaire-1.7.0-20151116.111758-41.jar:na] at 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);
}
任何想法或线索都非常感激。
答案 0 :(得分:0)
java.lang.NoClassDefFoundError:无法初始化类org.drools.compiler.kie.util.CDIHelper $ BeanCreatorHolder
以上意味着您很可能在类路径中混合了错误版本的jar。
答案 1 :(得分:0)
好的我明白了:
事实上,在我的开发环境中,我有一个用于websphere的IBM(com.ibm.ws.webservices.thinclient
)lib(应用程序可以根据客户端部署在容器中),尽管我添加了一个配置文件,但这种依赖仍然是我的蚀。
在可交付成果中,我们已经从这个lib中为一个对象设置了一个jndi上下文,当引擎启动它时会尝试查找BeanManager
(感谢@Esteban Aliverti指点我)它启动了上下文抛出异常,因为jar已被配置文件过滤。