【问题标题】:Drools issue at runtime运行时的流口水问题
【发布时间】: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 类的任何更改?我会特别注意 lookupBeanManager from CDIHelper.BeanCreatorHolder 的方法:github.com/droolsjbpm/drools/blob/6.3.x/drools-compiler/src/…
  • 不,事实上它是一个桌面应用程序,我没有应用程序/servlet 容器,但在这里我更新了完整的堆栈跟踪。谢谢你了

标签: java spring drools kie


【解决方案1】:

java.lang.NoClassDefFoundError: 无法在

初始化类 org.drools.compiler.kie.util.CDIHelper$BeanCreatorHolder

以上表示您很可能在类路径中混合了错误版本的 jar。

【讨论】:

    【解决方案2】:

    好的,我想通了:

    事实上,在我的开发环境中,我有一个用于 websphere 的 IBM (com.ibm.ws.webservices.thinclient) 库(应用程序可以根据客户端部署在容器中),尽管我已经添加了一个配置文件,但这种依赖关系仍然是我的 Eclipse。

    在交付品中,我们已为此库中的对象设置了 jndi 上下文,当引擎启动时,它会尝试查找 BeanManager(感谢 @Esteban Aliverti 指向我那里)它启动上下文和异常由于 jar 被配置文件过滤,因此被抛出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-03
      • 2011-12-06
      • 1970-01-01
      相关资源
      最近更新 更多