如何找到 Maven 正在使用哪些 Java 选项(Xmx、Xms、Xss 等)?
我发现设置它们的一种方法是通过环境 MAVEN_OPTS。现在我想要一种方法来确保它得到正确的设置。
编辑:我相信这与这个问题不同,因为我不想看到环境变量的值。我更想看看 Maven 实际使用了哪些设置,无论它来自 env var、settings.xml 还是其他方式。
EDIT2:我也对为 Maven 构建设置 Java 选项的其他方式感兴趣
您可以在不同的点和级别(全局或通过插件配置)为 Maven 设置 Java 选项:
插件配置:仅用于编译
使用Maven Compiler Plugin配置编译应用程序代码和测试代码,您可以通过配置条目设置所需的 Xmx、Xms、Xss 选项compileArgs
,可用于compile和testCompile目标。官方示例可在此处和其他类似的 SO 答案中获得。
下面还显示了第三点的示例。
插件配置:仅用于测试执行
使用Maven Surefire 插件配置执行测试,您可以通过测试目标的argLine
配置条目设置在运行时使用的所需 Java 选项。此处提供了一个官方示例。
下面还显示了第三点的示例。
插件配置:通过属性(和配置文件)
您可以将上面的两个选项(在常见 Java 选项的情况下)组合为属性值以传递给两者compileArgs
和argLine
配置条目,或者每个配置具有不同的属性(根据您的需要)。
<property>
<jvm.options>-Xmx256M</jvm.options>
</property>
[...]
<build>
[...]
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<compilerArgs>
<arg>${jvm.options}</arg>
</compilerArgs>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
<configuration>
<argLine>${jvm.options}</argLine>
</configuration>
</plugin>
</plugins>
[...]
</build>
[...]
使用属性还为您提供了两个额外的优势(在集中化之上):您可以使用配置文件然后根据不同的所需行为(以及此 SO 答案中的示例)对其进行个性化设置,您也可以通过命令行覆盖它们,例如:
mvn clean install -Djvm.options=-Xmx512
全局/项目配置:选项文件
从 Maven 3.3.1 开始,您可以在每个项目的文件中指定选项。.mvn/jvm.config
它是 MAVEN_OPTS 的替代方案,范围更窄(每个项目)。但是,由于它是一个新的 Maven 特性,所以人们应该注意它,否则可能会影响故障排除和维护。
全局/环境配置:MAVEN_OPTS
Maven众所周知的环境变量,用于设置全局执行选项,但适用于共享该环境的所有 Maven 构建(即每个登录用户)。
使用该-X
选项(启用调试)运行 Maven 时,您将在构建过程中获得以下输出:
[DEBUG] properties used {java.vendor=Oracle Corporation, ... , env.MAVEN_OPTS=-Xmx256M, ...
更新
毕竟,执行的mvn
命令是一个 OS 脚本。在 Windows 中查看它,我发现使用该MAVEN_BATCH_ECHO
选项的可能性,如果启用(值设置为on
),将回显脚本执行的任何命令以及java
命令的调用,您可以在其中查看您的选项(MAVEN_OPTS
)与传递给它的完整参数列表一起被正确拾取。
这是我在 Windows 上测试的执行:
set MAVEN_BATCH_ECHO=on
set MAVEN_OPTS=-Xmx256M
mvn compile > output.txt
注意:output.txt
将包含相当多的文本,提供构建输出和额外echo
的 s 执行。作为其中的一部分,它提供了:
>"path_to_\jdk1.7\bin\java.exe" -Xmx256M -classpath "path_to\apache-maven-3.1.1\bin\..\boot\plexus-classworlds-2.5.1.jar" "-Dclassworlds.conf=path_to\apache-maven-3.1.1\bin\..\bin\m2.conf" "-Dmaven.home=path_to\apache-maven-3.1.1\bin\.." org.codehaus.plexus.classworlds.launcher.Launcher compile
如您所见,该-Xmx256M
选项已正确选择。如果其他操作系统的maven脚本没有提供这个选项,那么你可以简单地将它添加到脚本中(执行echo
前简单java
,显示命令也足够了)。
您可以在子文件夹下的 maven 安装文件夹中找到 maven 脚本bin
。
Update2
此外,由于 Maven 毕竟是一个 Java 工具,从它的脚本中可以看出它调用 java 命令,您可以通过稍微更改 Maven 脚本并使用jinfo
应该真的根据this other SO answer给你答案。
也许它有助于以详细的调试输出启动 Maven(我认为是-debug?)。否则只需执行 aps aux | grep java
并检查进程的参数(假设 *nix)。