You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在项目级别配置--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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 08:15:02