JDK17下GWT-Maven-Plugin编译报错:无法访问Date.getCalendarDate()
JDK17升级后GWT Maven插件编译报错的解决办法
一、正确的JVM参数配置方式
JVM识别不了--add-opens参数,核心原因是参数没配置到net.ltgt.gwt.maven插件的正确位置。以下是两种有效配置方式:
1. 在pom.xml中配置插件参数
直接在插件的<configuration>节点里添加<jvmArgs>:
<plugin> <groupId>net.ltgt.gwt.maven</groupId> <artifactId>gwt-maven-plugin</artifactId> <version>1.0.1</version> <configuration> <!-- 保留你原有的其他配置 --> <jvmArgs>--add-opens java.base/java.util=ALL-UNNAMED</jvmArgs> </configuration> </plugin>
如果需要多个JVM参数,用空格分隔即可:
<jvmArgs>--add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.text=ALL-UNNAMED</jvmArgs>
2. 命令行临时传递参数
不想修改pom.xml的话,编译时通过-Dgwt.jvmArgs参数传递:
mvn gwt:compile -Dgwt.jvmArgs="--add-opens java.base/java.util=ALL-UNNAMED"
二、其他解决方案
- 升级GWT Maven插件版本:1.0.1版本的插件对JDK17兼容性较差,直接升级到1.1.0及以上的稳定版本,新版本已经适配了JDK16+的模块访问规则,不需要手动加
--add-opens参数就能解决问题。 - 匹配兼容的GWT SDK版本:如果你的GWT SDK版本太老,也会触发这类反射访问错误。确保使用GWT 2.10.0及以上版本,它完全支持JDK17,且减少了对私有API的依赖。
- 替换旧日期API:如果代码里直接或间接调用了
java.util.Date.getCalendarDate()这个私有方法,最好重构代码换成java.time包下的API(比如LocalDate、Instant)。这是Java 8+官方推荐的日期处理方式,既能避免私有API的访问限制,还能获得更好的线程安全和API设计。 - 补充更多模块开放参数:如果后续还出现其他类的私有API访问报错,根据错误提示添加对应的
--add-opens参数,比如涉及java.text包时加--add-opens java.base/java.text=ALL-UNNAMED,按需添加即可。
内容的提问来源于stack exchange,提问作者Marco
相关产品推荐
相关产品推荐

