我最近迁移到 Java 17,随之而来的一些限制要求我使用--add-opens
因为运行我的应用程序时存在一个依赖项。
当我需要添加这个java -jar
命令已运行。现在我找到了这些解决方案:
- 我可以将其添加到运行该项目的 Dockerfile 中的命令行参数中
java --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/sun.util.calendar=ALL-UNNAMED -jar my.jar
- 我可以通过我的 Maven 将它添加到我的 MANIFEST.MF 中
pom.xml
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifestEntries>
<Add-Opens>java.base/sun.util.calendar java.base/java.util</Add-Opens>
</manifestEntries>
</archive>
</configuration>
</plugin>
显然,两者都适合生产。然而,当通过 IntelliJ 运行我的应用程序时,它没有选择我认为是正常的选项。我必须将它们设置在我的运行配置中(顺便说一下,它也提交给我的项目)作为虚拟机参数。
我正在寻找一种方法来自动确保一致性,而不必在我声明附加打开的两个地方并行维护。
编辑:我想知道 argfiles 是否可行。就像我的项目中有一个 argfile 一样,它将在 jar 中引用,并且可以在 y 运行配置中引用。我还没有找到太多证据,但这就是我目前正在追求的道路。
编辑2:我添加了一个addopens
文件位于我的项目的根目录中,现在可以从我需要它的各个点引用它。对于测试,我添加了这个,并且它与 IntelliJ 测试和 Maven 测试一起开箱即用:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<!-- This adds the options contained in the addopens file to the test JVM arguments -->
<argLine>@addopens @{argLine}</argLine>
</configuration>
</plugin>
我也可以运送addopens
我的 docker 中的文件以在生产中使用。我仍然需要在 IntelliJ 中添加到我的运行配置中@addopens
手动。