如何在POM.xml中为Jetty Maven插件传递Java参数?
我正在为一个同时支持Java 8、Java 11的项目添加Java 17支持,项目使用Maven Jetty插件部署。执行jetty:run时出现以下错误:
java.lang.reflect.InaccessibleObjectException: Unable to make protected void java.lang.Object.finalize() throws java.lang.Throwable accessible: module java.base does not "opens java.lang" to an unnamed module
手动在IntelliJ IDEA中添加--add-opens java.base/java.lang=ALL-UNNAMED参数后可正常部署,生成的命令类似:
java --add-opens java.base/java.lang=ALL-UNNAMED jetty:run
请问能否通过POM.xml配置该参数,无需手动设置?
相关版本信息:Java 17、Jetty Maven插件9.4.35.v20201120、Maven 3.11.0
可以通过配置Maven Jetty插件的jvmArgs参数实现,无需手动添加JVM参数。
在项目POM.xml的Jetty插件配置段中,添加<jvmArgs>节点并填入所需参数即可。修改后的配置示例如下:
<plugin> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <version>9.4.35.v20201120</version> <configuration> <!-- 保留原有其他配置 --> <jvmArgs>--add-opens java.base/java.lang=ALL-UNNAMED</jvmArgs> <!-- 保留原有其他配置 --> </configuration> </plugin>
配置完成后,执行mvn jetty:run时,Maven会自动将该JVM参数传递给Jetty运行进程,无需手动设置。
如果要兼顾多Java版本兼容性(项目同时支持Java 8、11、17),可以通过Maven Profile区分配置,避免低版本Java出现无效参数:
<profiles> <profile> <id>java17+</id> <activation> <jdk>[17,)</jdk> </activation> <build> <plugins> <plugin> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <configuration> <jvmArgs>--add-opens java.base/java.lang=ALL-UNNAMED</jvmArgs> </configuration> </plugin> </plugins> </build> </profile> </profiles>
这样只有使用Java 17及以上版本时,才会自动添加该JVM参数,不影响低版本Java的运行。
内容的提问来源于stack exchange,提问作者Wikum Chamith

