JDK17环境下Maven Postman插件注入错误排查求助
解决JDK17下Maven Postman插件Groovy反射访问权限问题
问题背景
- 环境:Java 17、Maven 3.9.6、Maven Postman插件0.1.6
- 异常现象:JDK11环境下插件运行正常,升级到JDK17后仅本地机器报错,同环境队友无异常
- 预期效果:项目构建完成后发送带附件的邮件
- 已尝试无效操作:执行
mvn dependency:tree(构建成功)、更新项目及依赖 - 核心报错:
注入
ch.fortysix.maven.plugin.postaman.MailSenderMojo时出现com.google.inject.ProvisionException,根源是Groovy反射无法访问java.lang.Object.finalize()方法,提示模块java.base未向未命名模块开放java.lang
解决方案
1. 临时命令行修复
执行构建时直接追加JVM权限开放参数:
mvn clean install --add-opens java.base/java.lang=ALL-UNNAMED
2. 持久化配置(推荐)
方式一:配置到Maven全局settings.xml
在settings.xml的<profiles>节点下添加:
<profile> <id>jdk17-postman-fix</id> <properties> <maven.compiler.fork>true</maven.compiler.fork> <maven.compiler.args>--add-opens java.base/java.lang=ALL-UNNAMED</maven.compiler.args> <maven.exec.args>--add-opens java.base/java.lang=ALL-UNNAMED</maven.exec.args> </properties> </profile>
随后激活该profile(可在settings.xml的<activeProfiles>中添加<activeProfile>jdk17-postman-fix</activeProfile>)。
方式二:配置到项目pom.xml
直接在Postman插件的配置中添加JVM参数:
<build> <plugins> <plugin> <groupId>ch.fortysix</groupId> <artifactId>maven-postman-plugin</artifactId> <version>0.1.6</version> <configuration> <!-- 保留你的原有插件配置 --> <jvmArguments>--add-opens java.base/java.lang=ALL-UNNAMED</jvmArguments> </configuration> <!-- 可选:升级Groovy依赖以适配JDK17 --> <dependencies> <dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy-all</artifactId> <version>3.0.17</version> </dependency> </dependencies> <executions> <execution> <goals> <goal>send-mail</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
问题原因
JDK9及以上的模块系统默认限制了反射对核心模块内部API的访问,旧版本Groovy在JDK17环境下会尝试访问Object.finalize()这个被限制的方法,触发权限异常。本地与队友环境的差异大概率是因为队友的Maven或IDE已提前配置了该权限开放参数,或使用了兼容JDK17的Groovy版本。
内容的提问来源于stack exchange,提问作者jay
相关产品推荐
相关产品推荐

