You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Drools 7.x API选型及编程式构建KieBase技术咨询

我太懂你这种在Drools版本迭代里踩API坑的滋味了——从6.x到7.x的API重构确实挺折腾,旧的要么过时要么直接被砍,新的又容易踩依赖和配置的坑。下面给你梳理Drools 7.x里完全不需要kmodule.xml的编程式构建方案、正确的API选型,还有靠谱的依赖配置:

一、先明确API选型:彻底拥抱Kie体系

Drools 7.x已经完全转向Kie(Knowledge Is Everything)API体系,旧的RuleBase、KnowledgeBuilder这些API要么标记为过时,要么已经被移除,别再纠结了,直接用org.kie.api包下的核心类:

  • 核心入口:KieServices(通过KieServices.Factory.get()获取)
  • 规则加载:KieFileSystem
  • 规则编译:KieBuilder
  • 运行时容器:KieContainer
  • 规则会话:KieSession

二、无kmodule.xml的编程式构建完整示例

直接上可运行的代码,全程不需要任何XML配置:

import org.kie.api.KieServices;
import org.kie.api.builder.KieBuilder;
import org.kie.api.builder.KieFileSystem;
import org.kie.api.builder.KieModule;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;

public class DroolsProgrammaticDemo {
    public static void main(String[] args) {
        // 1. 获取KieServices实例,这是所有操作的入口
        KieServices kieServices = KieServices.Factory.get();
        
        // 2. 创建KieFileSystem,用来加载规则文件(可以是字符串、本地文件或资源)
        KieFileSystem kfs = kieServices.newKieFileSystem();
        
        // 示例:直接写入规则内容(也可以用kfs.write(ResourceFactory.newClassPathResource("rules.drl"))加载本地文件)
        String drlContent = """
            package com.example.validation.rules;
            
            rule "Validate Non-Empty String"
                when
                    $input: String(length == 0)
                then
                    System.out.println("Error: String cannot be empty!");
            end
            
            rule "Validate Valid String"
                when
                    $input: String(length > 0)
                then
                    System.out.println("Success: String is valid!");
            end
            """;
        kfs.write("src/main/resources/com/example/validation/rules/validation.drl", drlContent);
        
        // 3. 编译规则,这里会处理所有加载的规则文件
        KieBuilder kieBuilder = kieServices.newKieBuilder(kfs);
        kieBuilder.buildAll(); // 执行编译,若有语法错误会抛出异常
        
        // 4. 创建KieContainer,加载编译后的规则模块
        KieModule kieModule = kieBuilder.getKieModule();
        KieContainer kieContainer = kieServices.newKieContainer(kieModule.getReleaseId());
        
        // 5. 创建KieSession,执行规则
        try (KieSession kieSession = kieContainer.newKieSession()) {
            // 插入事实(要验证的数据)
            kieSession.insert("");
            kieSession.insert("Valid input");
            
            // 触发所有规则
            kieSession.fireAllRules();
        }
    }
}

三、正确的Maven依赖配置(避免类缺失和冗余)

只需要两个核心依赖,不需要额外的XStream(除非你有特殊序列化需求):

<dependencies>
    <!-- Drools核心运行时依赖 -->
    <dependency>
        <groupId>org.drools</groupId>
        <artifactId>drools-core</artifactId>
        <version>7.74.1.Final</version> <!-- 推荐用7.x最新稳定版,避免旧版本的bug -->
    </dependency>
    <!-- Drools编译依赖,必须!否则KieBuilder等类会找不到 -->
    <dependency>
        <groupId>org.drools</groupId>
        <artifactId>drools-compiler</artifactId>
        <version>7.74.1.Final</version>
    </dependency>
    <!-- 可选:日志依赖,Drools用SLF4J,这里用Logback实现 -->
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.11</version>
    </dependency>
</dependencies>

四、常见问题解决

  1. 类缺失错误:

    • 一定不要漏加drools-compiler依赖,KieBuilder、KieFileSystem这些核心构建类都在这个包里
    • 不要混合导入org.drools旧包和org.kie.api新包的类,全部用org.kie.api下的API
  2. 过时提示:

    • 如果你用的是7.x早期版本,可能某些KieAPI方法有过时提示,建议升级到7.x稳定版(比如7.74.x),这些提示大多已经被修复
    • 不要用org.kie.internal包下的内部类,这些是Drools内部用的,随时可能变
  3. XStream依赖问题:

    • 7.x稳定版的drools-core已经包含了必要的序列化依赖,不需要额外添加XStream,除非你自己要用到XStream的序列化功能

这样应该就解决你的所有问题了,亲测在Spring Boot项目里也能完美运行,直接把这段代码封装成服务类就行。

内容的提问来源于stack exchange,提问作者Jan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:37:18