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>
四、常见问题解决
类缺失错误:
- 一定不要漏加
drools-compiler依赖,KieBuilder、KieFileSystem这些核心构建类都在这个包里 - 不要混合导入
org.drools旧包和org.kie.api新包的类,全部用org.kie.api下的API
- 一定不要漏加
过时提示:
- 如果你用的是7.x早期版本,可能某些KieAPI方法有过时提示,建议升级到7.x稳定版(比如7.74.x),这些提示大多已经被修复
- 不要用
org.kie.internal包下的内部类,这些是Drools内部用的,随时可能变
XStream依赖问题:
- 7.x稳定版的
drools-core已经包含了必要的序列化依赖,不需要额外添加XStream,除非你自己要用到XStream的序列化功能
- 7.x稳定版的
这样应该就解决你的所有问题了,亲测在Spring Boot项目里也能完美运行,直接把这段代码封装成服务类就行。
内容的提问来源于stack exchange,提问作者Jan
相关产品推荐
相关产品推荐

