如何在项目级别配置--add-opens确保任意方式运行Java17应用均生效
我最近升级到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的
pom.xml配置写入MANIFEST.MF文件
<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运行应用时无法识别该参数,需要手动在已提交到项目的运行配置中添加VM参数。
我希望找到一种能自动保证配置一致性的方案,无需并行维护多处add-opens声明。
补充说明
我在考虑是否可以使用argfile实现,比如在项目内置一个argfile,既可以在jar中引用,也可以在所有运行配置中引用,目前还没有找到太多相关资料,但这是我正在探索的方向。
后续更新
我已经在项目根目录添加了addopens文件,现在可以在所有需要的位置引用它。针对测试场景,我添加了如下配置,同时适配IntelliJ测试和maven测试,可直接生效:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <!-- 该配置会将addopens文件中包含的参数添加到测试JVM启动参数中 --> <argLine>@addopens @{argLine}</argLine> </configuration> </plugin>
我也可以将addopens文件打包到Docker镜像中供生产环境使用,目前仍需要在IntelliJ的运行配置中手动添加@addopens参数。
内容的提问来源于stack exchange,提问作者Crystark
相关产品推荐
相关产品推荐

