
本文详解如何在 spring boot 项目中可靠启用 drools ruleunit,避免 `ruleunitprovider.get()` 报 “cannot find any rule unit” 错误,重点介绍基于 kogito 的现代化集成路径,无需 kjar 打包或 kie-maven-plugin。
在 Spring Boot 环境中直接使用原生 Drools RuleUnitProvider(如 RuleUnitProvider.get().createRuleUnitInstance(...))失败的根本原因在于:Drools 8+ 的 RuleUnit 引擎依赖编译时生成的元数据(RuleUnitData 类型注册、KieBase 自动发现等),而标准 Spring Boot 的类路径扫描与 Drools 的 KieProject 初始化机制不兼容。你看到的 KieProject - No files found for KieBase defaultKieBase 日志正是该问题的典型表现——Drools 无法在运行时自动定位 .drl 或 @RuleUnit 注解类,因其默认依赖 Maven 构建阶段通过 kie-maven-plugin 提取并注册规则元数据,而非 Spring 的 @Component 扫描逻辑。
✅ 正确解法:迁移到 Kogito Runtime API(推荐)
Kogito 是 Red Hat 官方为云原生和 Spring Boot 场景设计的 Drools 下一代运行时,它彻底重构了规则加载机制,原生支持:
- 基于类路径扫描自动发现 @RuleUnit 类;
- 无需 kie-maven-plugin,无需 kjar 打包;
- 与 Spring Boot Lifecycle 深度集成(自动配置 RuleUnitExecutor、RuleUnitRuntime);
- 支持 application.properties 配置规则源位置(如 kogito.rules.directory=src/main/resources/rules)。
? 快速集成步骤:
-
替换依赖(移除 drools-ruleunits-engine,引入 Kogito):
org.kie.kogito kogito-spring-boot-starter-ruleunit 2.4.0.Final -
定义 RuleUnit(保持原有结构):
@RuleUnit public class RequestAccessUnit implements RuleUnit { private final DataStorerequests = DataStoreFactory.buildDataStore(AccessRequest.class); // ... your facts and rules } -
在 Controller 中注入并使用(无需手动调用 RuleUnitProvider):
@RestController public class AccessController { private final RuleUnitRuntime runtime; public AccessController(RuleUnitRuntime runtime) { this.runtime = runtime; } @PostMapping("/access") public ResponseEntityevaluate(@RequestBody AccessRequest request) { // 自动匹配 RequestAccessUnit 并执行 RuleUnitInstance instance = runtime.createRuleUnitInstance(RequestAccessUnit.class); instance.setDataStore("requests", DataStoreFactory.buildDataStore(AccessRequest.class)); instance.insert(request); instance.fire(); return ResponseEntity.ok("Evaluated"); } }
⚠️ 注意事项:
- 确保 .drl 文件位于 src/main/resources/ 下(默认路径),或通过 kogito.rules.directory 显式指定;
- @RuleUnit 类必须是 public 且具有无参构造器;
- 若使用 Kotlin,请添加 kogito-kotlin-support 依赖并启用注解处理器;
- 避免混合使用原生 Drools API(如 KieServices, KieContainer)与 Kogito API,二者初始化机制冲突。
? 总结:放弃 RuleUnitProvider.get() 这一面向传统 KIE 构建流程的 API,拥抱 Kogito 的声明式、Spring-native 集成模型,是 Spring Boot 项目中安全、可维护地使用 RuleUnit 的唯一推荐路径。它不仅解决当前错误,更带来编译期验证、OpenAPI 规则服务暴露、Quarkus 兼容性等长期收益。










