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

如何在Gradle中配置--add-opens解决Java模块访问限制问题

解决Gson序列化Instant/Date的模块访问错误及Gradle全局配置方案

问题背景

使用Gson序列化Instant和Date时出现以下模块访问错误:

Unable to make field private final long java.time.Instant.seconds accessible: 
module java.base does not "opens java.time" to unnamed module @2e351f37

原因是Java模块系统默认禁止反射访问java.time包下的私有字段,而Gson默认用反射序列化Instant时触发了这个限制。

目前已完成的有效配置:

  • 在IntelliJ IDEA的VM选项中添加--add-opens java.base/java.time=ALL-UNNAMED解决IDE运行问题
  • 在build.gradle.kts中给Test任务配置参数,测试正常运行:
    tasks.withType<Test> {
       useJUnitPlatform()
       jvmArgs("--add-opens", "java.base/java.time=ALL-UNNAMED")
    }
    

但配置JavaExec任务无效,需要实现运行、调试、打包部署全场景自动生效的Gradle配置。

解决方案

1. 全局覆盖所有JVM Fork任务

JavaExec可能没覆盖到所有执行场景(比如Application插件的run任务),改用JavaForkOptions基类配置,一次覆盖所有需要启动新JVM的任务(包括Test、JavaExec、Run等):

tasks.withType<JavaForkOptions> {
    jvmArgs("--add-opens", "java.base/java.time=ALL-UNNAMED")
}

这样IDE调试、命令行运行gradle run、gradle test都会自动带上该参数。

2. 打包部署时的参数配置

如果生成可执行JAR或启动脚本,需要把参数嵌入到打包配置中:

  • 使用Application插件:配置默认JVM参数,生成的启动脚本会自动包含该参数:
    application {
        applicationDefaultJvmArgs = listOf("--add-opens", "java.base/java.time=ALL-UNNAMED")
    }
    
  • 使用Shadow插件:在Manifest中添加JVM参数,或配置启动脚本:
    shadowJar {
        manifest {
            attributes(
                "Main-Class" to "你的主类全路径",
                "JVM-Args" to "--add-opens java.base/java.time=ALL-UNNAMED"
            )
        }
    }
    

3. 根源解决:避免反射(推荐)

既然已经自定义了DateSerializer,不如给Instant也添加自定义序列化器,彻底绕过反射访问私有字段的问题,无需依赖--add-opens参数:

class InstantSerializer : JsonSerializer<Instant> {
    override fun serialize(src: Instant?, typeOfSrc: Type?, context: JsonSerializationContext?): JsonElement {
        return JsonPrimitive(src?.toEpochMilli())
    }
}

注册Gson时同时添加两个序列化器:

val gson = GsonBuilder()
    .registerTypeAdapter(Date::class.java, DateSerializer())
    .registerTypeAdapter(Instant::class.java, InstantSerializer())
    .create()

这种方式更符合Java模块系统的设计,避免后续部署环境的参数配置问题。

内容的提问来源于stack exchange,提问作者Jesser

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 04:10:23