如何查找Maven正在使用的Java选项(Xmx、Xms、Xss等)?
我已经发现可以通过环境变量MAVEN_OPTS来设置它们。现在我想找到一种方法来确保它正在使用正确的设置。
编辑:我认为这与此问题不同,因为我不想看到环境变量的值。我更想知道Maven实际上正在使用哪些设置,无论是来自env var、settings.xml还是其他方式。
编辑2:我还对用于Maven构建的其他设置Java选项感兴趣。
如何查找Maven正在使用的Java选项(Xmx、Xms、Xss等)?
我已经发现可以通过环境变量MAVEN_OPTS来设置它们。现在我想找到一种方法来确保它正在使用正确的设置。
编辑:我认为这与此问题不同,因为我不想看到环境变量的值。我更想知道Maven实际上正在使用哪些设置,无论是来自env var、settings.xml还是其他方式。
编辑2:我还对用于Maven构建的其他设置Java选项感兴趣。
您可以在不同的点和级别(全局或通过插件配置)为Maven设置Java选项:
插件配置:仅用于编译
使用Maven编译器插件配置来编译应用程序代码和测试代码,您可以通过compileArgs
配置项设置所需的Xmx、Xms、Xss选项,该选项适用于compile和testCompile目标。官方示例可在此处和其他SO答案中找到,例如这个。
下面的第三点也提供了一个示例。
插件配置:仅用于测试执行
使用Maven Surefire Plugin配置进行测试执行,您可以通过test目标的argLine
配置条目设置要在运行时使用的所需Java选项。这里提供了一个官方示例 here。
下面的第三点也展示了一个示例。
插件配置:通过属性(和配置文件)
您可以将上述两个选项(在常见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>
[...]
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
命令是一个操作系统脚本。在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
执行。其中,它提供了:>"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脚本没有提供此选项,则可以将其添加到脚本中(在 java
执行之前添加一个简单的 echo
,显示命令也足够了)。
您可以在maven安装文件夹下的 bin
子文件夹中找到maven脚本。
更新2
此外,由于Maven是一个Java工具,正如您从其脚本中可以看到它调用了java命令,您可以通过稍微更改Maven脚本并使用jinfo
命令来查看所有可用选项,根据这个SO answer建议。根据另一个SO answer,这应该真正给出您的答案。
ps aux | grep java
并检查进程的参数 (假设是 *nix)。