gradle-swagger-generator-plugin在Java 17环境下无法正常工作
问题场景
将Gradle项目的Java版本从11升级到17后,gradle-swagger-generator-plugin执行时抛出反射访问权限错误:
com.github.jknack.handlebars.HandlebarsException: /handlebars/JavaSpring/pojo.mustache:2:6: java.lang.reflect.InaccessibleObjectException: Unable to make public boolean java.util.Collections$EmptyMap.isEmpty() accessible: module java.base does not "opens java.util" to unnamed module @2f465398
现有配置与已尝试方案
当前使用的插件版本为2.19.2,配置片段:
buildscript { dependencies { classpath('gradle.plugin.org.hidetake:gradle-swagger-generator-plugin:2.19.2') } } plugins { ... id 'org.hidetake.swagger.generator' version '2.19.2' }
已尝试的修复动作:
- 强制指定
handlebars版本为4.3.1 - 在
gradle.properties添加JVM参数:org.gradle.jvmargs=--add-opens java.base/java.util=ALL-UNNAMED
有效解决方案
方案1:升级插件到兼容Java 17的版本
2.19.2版本的插件依赖的Swagger Codegen和Handlebars版本未适配Java 17的模块系统限制。建议升级到最新的兼容版本(如3.0.0+,具体版本可参考插件官方发布记录):
plugins { ... id 'org.hidetake.swagger.generator' version '3.0.0' } buildscript { dependencies { classpath('gradle.plugin.org.hidetake:gradle-swagger-generator-plugin:3.0.0') } }
方案2:为代码生成任务单独添加JVM参数
org.gradle.jvmargs仅作用于Gradle守护进程,插件的代码生成任务可能运行在独立进程中,需直接给任务配置参数:
tasks.withType(io.swagger.codegen.v3.GenerateTask) { jvmArgs = [ '--add-opens', 'java.base/java.util=ALL-UNNAMED', '--add-opens', 'java.base/java.util.Collections=ALL-UNNAMED' ] }
方案3:升级Handlebars到适配模块系统的版本
旧版本Handlebars的反射逻辑未兼容Java 17,升级到4.7.7及以上版本(该版本修复了模块系统反射问题),同时排除插件自带的旧版本依赖:
buildscript { dependencies { classpath('gradle.plugin.org.hidetake:gradle-swagger-generator-plugin:2.19.2') { exclude group: 'com.github.jknack', module: 'handlebars' } classpath('com.github.jknack:handlebars:4.7.7') { force = true } } }
原因说明
Java 17强化了模块系统的反射访问控制,旧版本的Handlebars和Swagger Codegen依赖通过反射访问java.util包时,未获得模块的开放权限。升级依赖可解决底层适配问题,或通过--add-opens参数显式开放模块访问权限。
内容的提问来源于stack exchange,提问作者Wladimir Diskowski

