如何为exec-maven-plugin传递Java 17所需VM参数?
解决Java 17下exec-maven-plugin传递--add-opens VM参数的问题
你的配置存在两处核心错误,导致JVM无法正确识别--add-opens参数:
<commandlineArgs>被错误嵌套在<arguments>内部,两者属于互斥的参数配置方式- --add-opens作为JVM参数,未按正确格式拆分为独立参数项传递
修正后的完整配置
删除原配置中的<commandlineArgs>标签,在<mainClass>之前添加独立的<argument>项传递JVM参数,修改后的配置如下:
<profile> <id>smoke</id> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>copy jars for tests</id> <phase>generate-resources</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <includeProjectDependencies>false</includeProjectDependencies> <includePluginDependencies>false</includePluginDependencies> <stripVersion>true</stripVersion> <outputDirectory>${project.build.directory}/lib</outputDirectory> </configuration> </execution> </executions> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>3.0.0</version> <executions> <execution> <phase>package</phase> <goals> <goal>exec</goal> </goals> </execution> </executions> <configuration> <classpathScope>test</classpathScope> <includeProjectDependencies>false</includeProjectDependencies> <includePluginDependencies>false</includePluginDependencies> <executable>${env.HOME}/java/bin/java.exe</executable> <workingDirectory>${project.build.directory}</workingDirectory> <arguments> <argument>-javaagent:${env.HOME}/wildfly/standalone/lib/ext/agent.jar</argument> <argument>-classpath</argument> <argument>lib/*;classes</argument> <argument>-DJBOSS_HOME=${JBOSS_HOME}</argument> <argument>-DJAVA_HOME=${env.HOME}/java</argument> <argument>-Duser.home=${env.USERPROFILE}</argument> <argument>-Djava.library.path=${JBOSS_HOME}/bin</argument> <argument>-DTESTING_FROM_COMMANDLINE=true</argument> <!-- 拆分JVM参数为独立项 --> <argument>--add-opens</argument> <argument>java.base/java.lang=ALL-UNNAMED</argument> <argument>--add-opens</argument> <argument>java.base/java.util=ALL-UNNAMED</argument> <mainClass>com.test.GenerateSmoke</mainClass> </arguments> </configuration> </plugin> </plugins> </build> </profile>
关键注意事项
- JVM参数位置:所有JVM参数必须放在
<mainClass>标签之前,否则会被当作程序运行参数而非JVM参数处理 - 参数拆分规则:包含空格的参数(如
--add-opens java.base/java.lang=ALL-UNNAMED)必须拆分为两个独立的<argument>标签,否则JVM无法正确解析 - 配置方式互斥:
<commandlineArgs>和<arguments>不能混用,前者适合直接编写完整命令行字符串,后者适合结构化拆分参数
内容的提问来源于stack exchange,提问作者emresahin
相关产品推荐
相关产品推荐

