You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 23:57:15