Drools 5.5.0与knowledge-api是否兼容OpenJDK 17?求兼容方案
Drools 5.5.0.Final 与 OpenJDK 17 兼容性及替代方案
兼容性结论
Drools 5.5.0.Final(含配套的knowledge-api)完全不兼容OpenJDK 17。这个2013年发布的版本仅适配JDK 6/7/8,完全未针对JDK 9+引入的模块化(JPMS)、反射权限收紧、废弃/移除旧API(如JAXB、JAX-WS在JDK 11+被移除)等特性做适配,直接在JDK 17上运行会出现大量ClassNotFound、IllegalAccessError等异常。
不兼容时的核心解决措施
最可靠的方案是升级Drools到支持JDK 17的版本:
- 推荐升级到Drools 8.x系列(长期支持版本,官方明确支持JDK 11至17),或至少升级到Drools 7.74.0.Final及以上(7系列后期版本适配了JDK 17)。
- 升级需注意:Drools 7/8与5.x存在API差异,旧的
KnowledgeBase、StatefulKnowledgeSession等API已被废弃,需调整代码适配新的KieBase、KieSession等核心API。
是否必须升级Drools?
如果要直接在OpenJDK 17环境下运行原有依赖Drools 5.5的业务代码,必须升级Drools。JDK 17的运行时环境对老版本Drools依赖的底层API和反射行为限制极严,无法通过简单配置完全规避所有兼容性问题。
不想升级Drools的可行替代方案
若坚持保留Drools 5.5.0.Final,可考虑以下稳定方案:
运行时隔离
- 将依赖Drools 5.5的规则处理逻辑封装为独立服务(如Spring Boot应用),使用OpenJDK 8运行该服务。
- 升级后的主应用(OpenJDK 17)通过RPC接口、消息队列(如RabbitMQ、Kafka)或HTTP接口与该独立服务通信,实现规则调用。
- 此方案完全规避JDK版本冲突,是规则逻辑复杂、迁移成本高场景下的最优选择。
JDK兼容参数与依赖补全(临时 workaround)
- 手动补全JDK 17中已移除的依赖,示例Maven配置:
<dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.1</version> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> <version>2.3.6</version> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-core</artifactId> <version>2.3.0.1</version> </dependency> - 添加JVM启动参数解除反射封装限制,示例:
--add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.io=ALL-UNNAMED --add-opens java.base/java.net=ALL-UNNAMED - 注意:此方案仅为临时缓解,可能出现隐藏运行时异常,且无法适配JDK后续版本变动,仅适合短期过渡。
- 手动补全JDK 17中已移除的依赖,示例Maven配置:
替换规则引擎
- 若规则逻辑相对简单,可替换为支持JDK 17的轻量规则引擎,如Easy Rules、MVEL等。
- 该方案需迁移原有Drools规则到新引擎语法,成本取决于规则数量与复杂度。
内容的提问来源于stack exchange,提问作者Ankit Khandelwal
相关产品推荐
相关产品推荐

