Java 17环境下如何避免使用--add-opens启动参数?
Java 17规避--add-opens参数配置方案
从Java 17开始,--illegal-access参数已正式失效。
该参数的任何取值(permit、warn、debug、deny)都仅会输出警告信息,不会产生其他效果,后续版本将完全移除--illegal-access参数。
受此影响,在使用OpenJDK 17早期访问版本时会遇到jackson的相关兼容性问题,官方最初建议使用--add-opens参数临时解决,若不想逐环境修改JVM启动参数,可参考以下方案:
- 优先升级所有依赖到支持JDK 17模块化规范的版本
目前jackson从2.13.0版本开始已经完成JDK 17适配,不需要额外添加JVM参数即可正常运行。其余常用开源依赖(如Spring全家桶、Apache Commons系列等)也均已在后续稳定版本中完成适配,升级依赖是最彻底、无副作用的解决方案。 - 通过项目模块化声明访问权限
如果你的项目已经采用Java模块化架构,可直接在项目的module-info.java文件中声明对应的开放权限,无需全局配置JVM参数。以jackson访问项目实体类为例,配置示例如下:module your.project.module { requires com.fasterxml.jackson.databind; // 开放实体类包给jackson反射访问 opens com.your.project.entity to com.fasterxml.jackson.databind; } - 构建工具统一管理JVM参数
如果存在无法升级的老旧依赖,可将--add-opens参数配置在项目的构建文件中,一次配置全链路生效,无需逐环境修改启动脚本:- Maven项目可在
spring-boot-maven-plugin或maven-surefire-plugin的配置项中添加jvmArguments参数,本地运行、测试、打包后启动都会自动加载配置 - Gradle项目可在
application插件配置的applicationDefaultJvmArgs中添加对应参数,全场景自动生效
- Maven项目可在
- 动态修改模块访问权限(仅作为临时过渡方案,不推荐长期使用)
可通过sun.misc.Unsafe的底层API在应用启动时动态开放对应模块的访问权限,该方案不需要修改任何启动参数,但存在安全风险,且后续JDK版本可能禁用相关API。
内容的提问来源于stack exchange,提问作者Robert Bain
相关产品推荐
相关产品推荐

