升级Drools从7.23.0.Final到7.73.0.Final遇Stream Closed错误求助
Drools升级至7.73.0.Final时BeanInstantiationException问题解决
问题描述
将drools-compiler、drools-core、drools-core-dynamic、drools-decisiontables等组件从7.23.0.Final升级到7.73.0.Final后,启动时出现以下错误:
org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.kie.api.runtime.KieContainer]: Factory method 'kieContainer' threw exception; nested exception is java.lang.RuntimeException: java.io.IOException: Stream Closed
当前使用的Maven依赖配置:
<dependency> <groupId>org.drools</groupId> <artifactId>drools-core</artifactId> <exclusions> <exclusion> <groupId>org.mvel</groupId> <artifactId>mvel2</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.drools</groupId> <artifactId>drools-compiler</artifactId> <exclusions> <exclusion> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.drools</groupId> <artifactId>drools-templates</artifactId> </dependency> <dependency> <groupId>org.drools</groupId> <artifactId>drools-decisiontables</artifactId> <exclusions> <exclusion> <groupId>javax.xml.stream</groupId> <artifactId>stax-api</artifactId> </exclusion> <exclusion> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> </exclusion> <exclusion> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.kie</groupId> <artifactId>kie-api</artifactId> </dependency> <dependency> <groupId>org.drools</groupId> <artifactId>drools-bom</artifactId> <type>pom</type> <version>7.73.0.Final</version> </dependency>
解决方法
修正BOM依赖的引入方式
Drools BOM需要放在<dependencyManagement>节点下才能统一管理所有Drools/Kie组件的版本,否则其他未指定版本的依赖可能拉取旧版或不一致的版本,导致冲突。调整后的配置示例:<dependencyManagement> <dependencies> <dependency> <groupId>org.drools</groupId> <artifactId>drools-bom</artifactId> <type>pom</type> <version>7.73.0.Final</version> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>排查不必要的依赖排除
drools-core排除mvel2:7.73.0.Final版本的Drools依赖特定版本的MVEL2,强行排除会导致规则编译或执行时缺少必要类,进而引发流关闭等异常,建议移除该排除。drools-decisiontables排除POI相关依赖:决策表组件依赖Apache POI解析Excel格式的规则表,排除后无法加载解析决策表资源,导致流操作异常,建议移除这些排除;若项目中已有POI依赖,可通过BOM统一版本避免冲突。
检查KieContainer初始化代码
确认初始化KieContainer时,是否存在资源流提前关闭的情况:- 加载规则文件(如.drl、.xls)时,确保流对象在KieFileSystem处理完成后再关闭,避免资源被提前释放。
- 避免重复使用已关闭的流对象加载规则资源。
清理依赖冲突
执行mvn dependency:tree命令生成依赖树,检查是否存在旧版本的Drools/Kie组件(如7.23.0.Final)被间接依赖引入,或其他与Drools依赖冲突的库,通过排除或统一版本解决冲突。开启DEBUG日志定位问题
开启org.drools、org.kie包的DEBUG级日志,查看初始化KieContainer过程中具体是哪个资源流被关闭,定位到具体的规则文件或决策表加载环节,针对性修复资源加载逻辑。
内容的提问来源于stack exchange,提问作者Rasika Joshi
相关产品推荐
相关产品推荐

