查找Maven使用的Java选项

12

如何查找Maven正在使用的Java选项(Xmx、Xms、Xss等)?

我已经发现可以通过环境变量MAVEN_OPTS来设置它们。现在我想找到一种方法来确保它正在使用正确的设置。

编辑:我认为这与此问题不同,因为我不想看到环境变量的值。我更想知道Maven实际上正在使用哪些设置,无论是来自env var、settings.xml还是其他方式。

编辑2:我还对用于Maven构建的其他设置Java选项感兴趣。


可能是重复的问题:如何打印正在使用的实际MAVEN_OPTIONS? - Tunaki
你只是想知道如何检查Maven使用了哪些选项,还是对设置相同选项的其他方式也感兴趣? - A_Di-Matteo
是的,我也对其他方法感兴趣,谢谢。 - Victor Basso
我更新了我的答案,请查看底部,我找到了一种方法来检查选项是否被正确选择。希望能帮到你。 - A_Di-Matteo
此外,您可能希望从Java中获取它,该Java由Maven调用(在Java中开发),因此此答案与我提出的方法相结合应该会给您带来更多帮助。我会相应地更新我的答案。 - A_Di-Matteo
而且,正如这个SO答案所描述的那样,jinfo命令也可能派上用场。 - A_Di-Matteo
2个回答

17

您可以在不同的点和级别(全局或通过插件配置)为Maven设置Java选项:

插件配置:仅用于编译
使用Maven编译器插件配置来编译应用程序代码和测试代码,您可以通过compileArgs配置项设置所需的Xmx、Xms、Xss选项,该选项适用于compiletestCompile目标。官方示例可在此处和其他SO答案中找到,例如这个
下面的第三点也提供了一个示例。

插件配置:仅用于测试执行
使用Maven Surefire Plugin配置进行测试执行,您可以通过test目标的argLine配置条目设置要在运行时使用的所需Java选项。这里提供了一个官方示例 here
下面的第三点也展示了一个示例。

插件配置:通过属性(和配置文件)
您可以将上述两个选项(在常见Java选项的情况下)结合为属性值,以传递给compileArgsargLine配置条目,或者根据您的需求为每个配置设置不同的属性。

<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>
[...]

使用属性还有两个额外的优点(除了集中化):您可以使用 profiles 来根据不同的期望行为进行个性化,例如在 this SO answer 中的示例,并且您也可以通过命令行覆盖它们,例如:
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,这应该真正给出您的答案。


1
也许启动 Maven 时使用详细的调试输出 (-debug,我想是这样的吧?) 会有所帮助。否则,只需执行 ps aux | grep java 并检查进程的参数 (假设是 *nix)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接