Java 17+STS+Gradle环境下sun.security.util.DerEncoder无法访问求助
解决Java 17 Spring Boot应用访问sun.security.util相关类的编译错误
核心原因
Java 16起严格限制了对java.base模块中sun.*内部API的访问,即使这些类仍存在于JAR包中,默认也不允许编译和运行时访问。你之前添加的参数未生效,大概率是因为只配置了运行时参数,遗漏了编译阶段的参数配置。
可行解决方案
1. 同时配置Gradle编译与运行时参数
在项目的build.gradle文件中添加以下配置,确保编译、测试、运行三个阶段都开放对应内部API:
// 配置编译阶段参数 tasks.withType(JavaCompile) { options.compilerArgs += [ '--add-exports', 'java.base/sun.security.util=ALL-UNNAMED', '--add-exports', 'java.base/sun.security.provider=ALL-UNNAMED', '--add-opens', 'java.base/sun.security.util=ALL-UNNAMED', '--add-opens', 'java.base/sun.security.provider=ALL-UNNAMED' ] } // 配置测试阶段参数 tasks.withType(Test) { jvmArgs += [ '--add-exports', 'java.base/sun.security.util=ALL-UNNAMED', '--add-exports', 'java.base/sun.security.provider=ALL-UNNAMED', '--add-opens', 'java.base/sun.security.util=ALL-UNNAMED', '--add-opens', 'java.base/sun.security.provider=ALL-UNNAMED' ] } // 配置Spring Boot运行阶段参数 bootRun { jvmArgs += [ '--add-exports', 'java.base/sun.security.util=ALL-UNNAMED', '--add-exports', 'java.base/sun.security.provider=ALL-UNNAMED', '--add-opens', 'java.base/sun.security.util=ALL-UNNAMED', '--add-opens', 'java.base/sun.security.provider=ALL-UNNAMED' ] }
2. 检查STS运行配置的VM参数
打开STS的Run Configurations,找到你的Spring Boot应用配置:
- 切换到Arguments标签
- 在VM arguments区域添加以下参数(注意不要放到Program arguments里):
--add-exports java.base/sun.security.util=ALL-UNNAMED --add-exports java.base/sun.security.provider=ALL-UNNAMED --add-opens java.base/sun.security.util=ALL-UNNAMED --add-opens java.base/sun.security.provider=ALL-UNNAMED
3. 替换内部API为官方公开类(推荐)
sun.*内部类属于非公开API,后续Java版本可能会直接移除,建议替换为JDK官方提供的公开类:
- 用
javax.security.auth.x500.X500Principal替代sun.security.util.X500Name - 用
java.security.cert.CertificateFactory、java.security.cert.X509Certificate处理证书相关操作 - 用
java.security.spec.ObjectIdentifier替代sun.security.util.ObjectIdentifier
这样可以彻底避免内部API访问限制问题,提升应用的兼容性和稳定性。
内容的提问来源于stack exchange,提问作者suri
相关产品推荐
相关产品推荐

