【问题标题】:Drools Class not found for evaluator definition未找到评估器定义的 Drools 类
【发布时间】:2026-02-08 06:15:01
【问题描述】:

我正在使用 Drools 5.5.0-Final,突然间,我遇到了这个异常

我把所有的库都放到我的项目里了,结果还是一样的

org.drools.RuntimeDroolsException: Class not found for evaluator definition: org.drools.base.evaluators.EqualityEvaluatorsDefinition
    at org.drools.base.evaluators.EvaluatorRegistry.addEvaluatorDefinition(EvaluatorRegistry.java:136)
    at org.drools.compiler.PackageBuilderConfiguration.buildEvaluatorRegistry(PackageBuilderConfiguration.java:550)
    at org.drools.compiler.PackageBuilderConfiguration.init(PackageBuilderConfiguration.java:196)
    at org.drools.compiler.PackageBuilderConfiguration.<init>(PackageBuilderConfiguration.java:170)
    at org.drools.compiler.PackageBuilder.<init>(PackageBuilder.java:300)
    at org.drools.compiler.PackageBuilder.<init>(PackageBuilder.java:228)
    at org.drools.builder.impl.KnowledgeBuilderFactoryServiceImpl.newKnowledgeBuilder(KnowledgeBuilderFactoryServiceImpl.java:34)
    at org.drools.builder.KnowledgeBuilderFactory.newKnowledgeBuilder(KnowledgeBuilderFactory.java:46)
    at com.drools.optimizer.AppExpertSystem.readKnowledgeBase(AppExpertSystem.java:130)
    at com.drools.optimizer.AppExpertSystem.loadKnowledgeBase(AppExpertSystem.java:115)
    at com.drools.optimizer.AppExpertSystem.<init>(AppExpertSystem.java:46)
    at eventlauncher.OptimizerLauncher.NuevoEscenario(OptimizerLauncher.java:57)
    at eventlauncher.DemoPruebas.main(DemoPruebas.java:18)
Caused by: java.lang.ClassNotFoundException: Unable to load class: org.drools.base.evaluators.EqualityEvaluatorsDefinition
    at org.drools.util.CompositeClassLoader.loadClass(CompositeClassLoader.java:92)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    at org.drools.base.evaluators.EvaluatorRegistry.addEvaluatorDefinition(EvaluatorRegistry.java:132)
    ... 12 more
Exception in thread "main" java.lang.RuntimeException: org.drools.RuntimeDroolsException: Class not found for evaluator definition: org.drools.base.evaluators.EqualityEvaluatorsDefinition
    at com.drools.optimizer.AppExpertSystem.loadKnowledgeBase(AppExpertSystem.java:122)
    at com.drools.optimizer.AppExpertSystem.<init>(AppExpertSystem.java:46)
    at eventlauncher.OptimizerLauncher.NuevoEscenario(OptimizerLauncher.java:57)
    at eventlauncher.DemoPruebas.main(DemoPruebas.java:18)
Caused by: org.drools.RuntimeDroolsException: Class not found for evaluator definition: org.drools.base.evaluators.EqualityEvaluatorsDefinition
    at org.drools.base.evaluators.EvaluatorRegistry.addEvaluatorDefinition(EvaluatorRegistry.java:136)
    at org.drools.compiler.PackageBuilderConfiguration.buildEvaluatorRegistry(PackageBuilderConfiguration.java:550)
    at org.drools.compiler.PackageBuilderConfiguration.init(PackageBuilderConfiguration.java:196)
    at org.drools.compiler.PackageBuilderConfiguration.<init>(PackageBuilderConfiguration.java:170)
    at org.drools.compiler.PackageBuilder.<init>(PackageBuilder.java:300)
    at org.drools.compiler.PackageBuilder.<init>(PackageBuilder.java:228)
    at org.drools.builder.impl.KnowledgeBuilderFactoryServiceImpl.newKnowledgeBuilder(KnowledgeBuilderFaorg.drools.RuntimeDroolsException: Class not found for evaluator definition: org.drools.base.evaluators.EqualityEvaluatorsDefinition
    at org.drools.base.evaluators.EvaluatorRegistry.addEvaluatorDefinition(EvaluatorRegistry.java:136)
    at org.drools.compiler.PackageBuilderConfiguration.buildEvaluatorRegistry(PackageBuilderConfiguration.java:550)
    at org.drools.compiler.PackageBuilderConfiguration.init(PackageBuilderConfiguration.java:196)
    at org.drools.compiler.PackageBuilderConfiguration.<init>(PackageBuilderConfiguration.java:170)
    at org.drools.compiler.PackageBuilder.<init>(PackageBuilder.java:300)
    at org.drools.compiler.PackageBuilder.<init>(PackageBuilder.java:228)
    at org.drools.builder.impl.KnowledgeBuilderFactoryServiceImpl.newKnowledgeBuilder(KnowledgeBuilderFactoryServiceImpl.java:34)
    at org.drools.builder.KnowledgeBuilderFactory.newKnowledgeBuilder(KnowledgeBuilderFactory.java:46)
    at com.drools.optimizer.AppExpertSystem.readKnowledgeBase(AppExpertSystem.java:130)
    at com.drools.optimizer.AppExpertSystem.loadKnowledgeBase(AppExpertSystem.java:115)
    at com.drools.optimizer.AppExpertSystem.<init>(AppExpertSystem.java:46)
    at eventlauncher.OptimizerLauncher.NuevoEscenario(OptimizerLauncher.java:57)
    at eventlauncher.DemoPruebas.main(DemoPruebas.java:18)
Caused by: java.lang.ClassNotFoundException: Unable to load class: org.drools.base.evaluators.EqualityEvaluatorsDefinition
    at org.drools.util.CompositeClassLoader.loadClass(CompositeClassLoader.java:92)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    at org.drools.base.evaluators.EvaluatorRegistry.addEvaluatorDefinition(EvaluatorRegistry.java:132)
    ... 12 more
Exception in thread "main" java.lang.RuntimeException: org.drools.RuntimeDroolsException: Class not found for evaluator definition: org.drools.base.evaluators.EqualityEvaluatorsDefinition
    at com.drools.optimizer.AppExpertSystem.loadKnowledgeBase(AppExpertSystem.java:122)
    at com.drools.optimizer.AppExpertSystem.<init>(AppExpertSystem.java:46)
    at eventlauncher.OptimizerLauncher.NuevoEscenario(OptimizerLauncher.java:57)
    at eventlauncher.DemoPruebas.main(DemoPruebas.java:18)
Caused by: org.drools.RuntimeDroolsException: Class not found for evaluator definition: org.drools.base.evaluators.EqualityEvaluatorsDefinition
    at org.drools.base.evaluators.EvaluatorRegistry.addEvaluatorDefinition(EvaluatorRegistry.java:136)
    at org.drools.compiler.PackageBuilderConfiguration.buildEvaluatorRegistry(PackageBuilderConfiguration.java:550)
    at org.drools.compiler.PackageBuilderConfiguration.init(PackageBuilderConfiguration.java:196)
    at org.drools.compiler.PackageBuilderConfiguration.<init>(PackageBuilderConfiguration.java:170)
    at org.drools.compiler.PackageBuilder.<init>(PackageBuilder.java:300)
    at org.drools.compiler.PackageBuilder.<init>(PackageBuilder.java:228)
    at org.drools.builder.impl.KnowledgeBuilderFactoryServiceImpl.newKnowledgeBuilder(KnowledgeBuilderFactoryServiceImpl.java:34)
    at org.drools.builder.KnowledgeBuilderFactory.newKnowledgeBuilder(KnowledgeBuilderFactory.java:46)
    at com.drools.optimizer.AppExpertSystem.readKnowledgeBase(AppExpertSystem.java:130)
    at com.drools.optimizer.AppExpertSystem.loadKnowledgeBase(AppExpertSystem.java:115)
    ... 3 more
Caused by: java.lang.ClassNotFoundException: Unable to load class: org.drools.base.evaluators.EqualityEvaluatorsDefinition
    at org.drools.util.CompositeClassLoader.loadClass(CompositeClassLoader.java:92)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    at org.drools.base.evaluators.EvaluatorRegistry.addEvaluatorDefinition(EvaluatorRegistry.java:132)
    ... 12 morectoryServiceImpl.java:34)
    at org.drools.builder.KnowledgeBuilderFactory.newKnowledgeBuilder(KnowledgeBuilderFactory.java:46)
    at com.drools.optimizer.AppExpertSystem.readKnowledgeBase(AppExpertSystem.java:130)
    at com.drools.optimizer.AppExpertSystem.loadKnowledgeBase(AppExpertSystem.java:115)
    ... 3 more
Caused by: java.lang.ClassNotFoundException: Unable to load class: org.drools.base.evaluators.EqualityEvaluatorsDefinition
    at org.drools.util.CompositeClassLoader.loadClass(CompositeClassLoader.java:92)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    at org.drools.base.evaluators.EvaluatorRegistry.addEvaluatorDefinition(EvaluatorRegistry.java:132)
    ... 12 more

我的代码是:

import com.answare.backendconnection.RESTConnection;
import com.answare.dataModel.ActionANS;
import com.answare.dataModel.CrisisContextANS;
import com.answare.db.QueriesDB;
import com.answare.settings.CTES;
import com.drools.utils.Event;
import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseConfiguration;
import org.drools.KnowledgeBaseFactory;
import org.drools.builder.*;
import org.drools.conf.EventProcessingOption;
import org.drools.io.ResourceFactory;
import org.drools.runtime.StatefulKnowledgeSession;
import java.sql.SQLException;



/**
 * This is the class that launch Expert System.
 */

public class AppExpertSystem {

    StatefulKnowledgeSession ksession;
    DSS_ANS optimizerDSS_ANS;
    Event event;
    RESTConnection restConnection;


    public AppExpertSystem() {
        loadKnowledgeBase();
        optimizerDSS_ANS = new DSS_ANS(ksession);
        event = new Event();
        event.setNewEvent(true);
    }
    public AppExpertSystem(RESTConnection restConnection){
        loadKnowledgeBase();    
        event = new Event();
        event.setNewEvent(true);
        this.restConnection = restConnection;
    }



    private void loadKnowledgeBase() {
        // load up the knowledge base
        KnowledgeBase kbase;
        try {
            kbase = readKnowledgeBase();
            ksession = kbase.newStatefulKnowledgeSession();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }


    private static KnowledgeBase readKnowledgeBase() throws Exception {

        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
        kbuilder.add(ResourceFactory.newClassPathResource(CTES.RULES),
                ResourceType.DRL);
        KnowledgeBuilderErrors errors = kbuilder.getErrors();

        if (errors.size() > 0) {
            for (KnowledgeBuilderError error : errors) {
                System.err.println(error);
            }
            throw new IllegalArgumentException("Could not parse knowledge.");
        }
        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
        kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
        KnowledgeBaseConfiguration config = KnowledgeBaseFactory.newKnowledgeBaseConfiguration();
        config.setOption(EventProcessingOption.STREAM );

        return kbase;
    }


    public String executeMessage(CrisisContextANS crisisContext) {
        try {
            storeInDatabaseCrisis(crisisContext,true);
            ksession.setGlobal("optimizerDSS", optimizerDSS_ANS);
            ksession.insert(crisisContext);
            this.event.setType("CrisisContextANS");
            ksession.insert(this.event);
            int num = ksession.fireAllRules();
            if (num != 0) {
                this.event.setNewEvent(false);
                return ("Run OK from Expert System");
            }
            return ("");
        } catch (Throwable t) {
            t.printStackTrace();
            return ("Run NOT OK Expert System");
        }
    }
}

并且例外是在方法readKnowledgeBase(),在行

KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();

我唯一要做的就是调用 AppExpertSystem 构造函数:( 有什么想法吗?

谢谢!

【问题讨论】:

  • 要么您没有正确地将 JAR 添加到 CLASSPATH 中,要么版本不正确并且该方法签名不再可用。
  • @duffymo 方法签名?哪种方法?

标签: java drools


【解决方案1】:

此类已从 5.5.0.Final 发行版中消失。它存在于 5.3.0 和 5.4.0(jar:drools-core.jar)中,大概也更早。

org.drools.base 和 ...评估器不是 5.3 和 5.4 中稳定 API 的一部分,因此使用它是有风险的。

如果您发布您的代码是如何使用该类的,s.o.可能会想办法解决这个问题。

类 org.drools.base.evaluators.EqualityEvaluatorsDefinition 通常通过包含一行配置到构建器中

drools.evaluator.equality = org.drools.base.evaluators.EqualityEvaluatorsDefinition

在工作目录中的文件“drools.packagebuilder.conf”中,您的主目录或某些 jar 的 META-INF drools.default.packagebuilder.conf,或系统属性“drools.packagebuilder”指向的文件中.conf”。

【讨论】:

  • 那么,我需要做什么?删除drools-core.jar?
  • 这无济于事。您的代码引用了一个不再存在的包。
  • 您确定 5.4(或更早版本)和 5.5 的 jar 没有混淆吗?当您从头开始构建时,必须为构建器定义评估器,我认为不会发生这种情况。
  • 在 5.4.0 发行版中有 drools-core.jar 和 drools-core-5.4.0.Final.jar。当您尝试使用 5.5.0 构建时,请确保类路径中没有任何一个,只有这个:drools-core-5.5.0.Final.jar
  • 您的系统上是否有文件“drools.packagebuilder.conf”?在您的主目录中?您是否使用此键定义了指向文件的系统属性?这个文件上有什么?如果它包含一行drools.evaluator.equality = org.drools.base.evaluators.EqualityEvaluatorsDefinition,那么这就是“毒药”。