maven surefire argLine 是否覆盖 ./mvn/jvm.config?

Does maven surfire argLine override ./mvn/jvm.config?

我有一个包含以下内容的项目。/mvn/jvm.config :

-Xms32g -Xmx64g -XX:MaxDirectMemorySize=20g

我想知道我是否按如下方式配置我的 maven surfire 插件:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.9</version>
    <configuration>
        <argLine>-Xms12g -Xmx30g -XX:MaxDirectMemorySize=30g</argLine>
        <suiteXmlFiles>
            <suiteXmlFile>src/test/resources/RunMmoTests.xml</suiteXmlFile>
        </suiteXmlFiles>
    </configuration>
</plugin> 

我知道我的 jvm.config 将设置 MAVEN_OPTS 环境变量,但我找不到任何说明 MAVEN_OPTS 和 surfire argLine 之间优先级的文档。哪个覆盖另一个?在 运行 一些测试之后,我感觉 surfire argLine 覆盖了 MAVEN_OPTS 中定义的任何参数。我猜对了吗??

非常感谢

If argLine does not define JVM options, will surefire forked jvm inherit the jvm options defined in .mvn/jvm.config?

不会。您对构建项目的要求可能与对 运行 测试的要求完全不同。

这里是maven-surefire the source code中的注释:

For the default, the JVM will be a new instance of the same VM as the one used to run Maven. JVM settings are not inherited from MAVEN_OPTS.

当我们调用 mvn 命令(mvn.cmdbin/mvn)时,Maven 读取并设置不同的环境变量,并且在 Linux 和 Windows 中执行不同的操作。

  • On Linux, mvn 命令 sets MAVEN_OPTS 变量 将现有的 MAVEN_OPTS$MAVEN_PROJECTBASEDIR/.mvn/jvm.config 文件然后调用 java passingMAVEN_OPTS 作为参数。
  • 在 Windows 上,mvn 命令 sets JVM_CONFIG_MAVEN_PROPSjvm.config 的内容然后调用 java passing MAVEN_OPTSJVM_CONFIG_MAVEN_PROPS

surefire 插件通过调用 java 命令分叉一个单独的进程来执行测试,但它不会将 MAVEN_OPTSJVM_CONFIG_MAVEN_PROPS 作为参数传递给 JVM。

如果您想为 运行 测试设置与 运行 maven 相同的 JVM 参数,那么您可以在 argLines 中使用 ${parameters}。例如像这样:

<configuration>
  <argLine>${MAVEN_OPTS}</argLine>
</configuration>