我正在尝试为一个也支持 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 参数,我能够毫无错误地部署项目。它生成了与此类似的命令。
java --add-opens java.base/java.lang=ALL-UNNAMED jetty:run
有没有一种方法可以使用 POM.xml 传递参数,而无需手动设置 Java 参数?任何帮助或见解将不胜感激!
这是我正在处理的pom文件:https://github.com/openmrs/openmrs-core/blob/458f9417c1d2ab45c37fbdac8b94ec3a854cb7be/webapp/pom.xml#L100-L129
Jetty 9.x 现已终止社区支持。
参见:https://github.com/jetty/jetty.project/issues/7958
Jetty 9 不支持在 jetty-maven-plugin 上使用 JPMS。
这是在 Jetty 10 中首次以 fork 模式添加的。
查看插件配置选项
deployMode
(在FORK
模式下)和jvmArgs
(仅在fork模式下可用)
https://eclipse.dev/jetty/documentation/jetty-10/programming-guide/index.html#deployment-modes
简而言之,您可以在 jetty-maven-plugin 中使用适当的
<configuration>
部分来指定这些选项,或者使用 <properties>
部分来定义这两种配置的等效属性。 (分别为jetty.deployMode
和jetty.jvmArgs
)
<properties>
<jetty.deployMode>FORK</jetty.deployMode>
<jetty.jvmArgs>--add-opens java.base/java.lang=ALL-UNNAMED</jetty.jvmArgs>
</properties>
<plugin>
<groupId>org.eclipse.jetty.ee8</groupId>
<artifactId>jetty-ee8-maven-plugin</artifactId>
<version>12.0.2</version>
<executions>
<execution>
<id>run-jetty</id>
<phase>process-test-classes</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<deployMode>${jetty.deployMode}</deployMode>
<contextXml>${basedir}/src/main/jetty/jetty-context.xml</contextXml>
<jettyXmls>
<jettyXml>${basedir}/src/main/jetty/jetty.xml</jettyXml>
</jettyXmls>
<stopPort>9898</stopPort>
<stopKey>DEADBEEF</stopKey>
<jvmArgs>${jetty.jvmArgs}</jvmArgs>
</configuration>
</execution>
</executions>
</plugin>
在
<configuration>
和 <properties>
中定义的原因是,您可以在命令行上使用任何其他 jetty-maven-plugin 目标,而无需定义另一个 <execution>
或 <configuration>
部分。 (它也有助于 IT 测试)