当我运行 Maven 测试时,会发生 java.lang.OutOfMemoryError
。我用谷歌搜索了解决方案并尝试了 export MAVEN_OPTS=-Xmx1024m
,但它不起作用。有人知道这个问题的其他解决方案吗?我正在使用 Maven 3.0
运行 mvn test -e
时在此处粘贴错误消息
Failed tests: warning(junit.framework.TestSuite$1) testDefaultPigJob_1(com.snda.dw.pig.impl.DefaultPigJobLocalTest) testDefaultPigJob_2(com.snda.dw.pig.impl.DefaultPigJobLocalTest) Tests run: 11, Failures: 3, Errors: 0, Skipped: 0 10/11/01 13:37:18 INFO executionengine.HExecutionEngine: Connecting to hadoop fi le system at: file:/// [INFO] ------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ [INFO] Total time: 30.063s [INFO] Finished at: Mon Nov 01 13:37:18 PDT 2010 [INFO] Final Memory: 3M/6M [INFO] ------------------------------------------------------------------------ [ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2. 5:test (default-test) on project dw.pig: There are test failures. [ERROR] [ERROR] Please refer to E:\Code\Java\workspace\dw.pig\target\surefire-reports fo r the individual test results. [ERROR] -> [Help 1] org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal o rg.apache.maven.plugins:maven-surefire-plugin:2.5:test (default-test) on project dw.pig: There are test failures. Please refer to E:\Code\Java\workspace\dw.pig\target\surefire-reports for the in dividual test results. at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor .java:199) at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor .java:148) at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor .java:140) at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProje ct(LifecycleModuleBuilder.java:84) at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProje ct(LifecycleModuleBuilder.java:59) at org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBu ild(LifecycleStarter.java:183) at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(Lifecycl eStarter.java:161) at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:314) at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:151) at org.apache.maven.cli.MavenCli.execute(MavenCli.java:445) at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:168) at org.apache.maven.cli.MavenCli.main(MavenCli.java:132) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl. java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces sorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Laun cher.java:290) at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.jav a:230) at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(La uncher.java:409) at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java: 352) Caused by: org.apache.maven.plugin.MojoFailureException: There are test failures . Please refer to E:\Code\Java\workspace\dw.pig\target\surefire-reports for the in dividual test results. at org.apache.maven.plugin.surefire.SurefirePlugin.execute(SurefirePlugi n.java:629) at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(Default BuildPluginManager.java:107) at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor .java:195) ... 19 more [ERROR] [ERROR] Re-run Maven using the -X switch to enable full debug logging. [ERROR] [ERROR] For more information about the errors and possible solutions, please rea d the following articles: [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureExc
当我运行 maven 测试时,会发生 java.lang.OutOfMemoryError。我在谷歌上搜索解决方案并尝试导出 MAVEN_OPTS=-Xmx1024m,但没有成功。
使用 MAVEN_OPTS
设置 Xmx
选项确实有效,它确实配置了用于启动 Maven 的 JVM。话虽如此,maven-surefire-plugin forks 默认情况下是一个新的 JVM,因此您的 MAVEN_OPTS
不会通过。
要配置 maven-surefire-plugin 使用的 JVM 的大小,您必须:
将 forkMode 更改为 never(这不是一个好主意,因为 Maven 不会与测试隔离)~或者~
使用 argLine 参数(正确的方法):
在后一种情况下,是这样的:
<configuration>
<argLine>-Xmx1024m</argLine>
</configuration>
但我不得不说,我在这里倾向于同意斯蒂芬的观点,你的一项测试很可能有问题,我不确定给予更多的记忆是“解决”(隐藏?)你的问题的正确解决方案。
参考
Maven 2 Surefire 插件
Maven Surefire 中的类加载和分叉
对于那些刚接触 Maven 的人(比如我),这里是 pom.xml 构建部分中的整个配置。干杯。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19</version>
<configuration>
<argLine>-Xmx1024m</argLine>
</configuration>
</plugin>
</plugins>
</build>
JUnitException: TestEngine with ID 'junit-jupiter' failed to discover test
。
问题可能出在您要求 Maven 运行的单元测试之一中。
因此,摆弄堆大小是错误的方法。相反,您应该查看导致 OOME 的单元测试,并尝试找出是单元测试的错误还是它正在测试的代码。
首先查看堆栈跟踪。如果没有,请使用 -e
选项再次运行 mvn ... test
。
为了暂时解决这个问题,我发现以下是最快的方法:
export JAVA_TOOL_OPTIONS="-Xmx1024m -Xms1024m"
我已经通过两种方式解决了这个问题:
在 pom.xml 中添加这个配置
为了解决 java.lang.OutOfMemoryError: Java heap space in Maven,尝试在 pom 中配置以下配置
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${maven-surefire-plugin.version}</version>
<configuration>
<verbose>true</verbose>
<fork>true</fork>
<argLine>-XX:MaxPermSize=500M</argLine>
</configuration>
</plugin>
如最佳答案中所述,由于 Surefire 正在创建一个新的 JVM 来运行您的测试,您希望将该 -Xmx1024m
传递给新的 JVM,而不是您启动 mvn test
的 JVM。
只是想补充一点,您可以在命令中执行此操作,例如
mvn test -DargLine="-Xmx1024m"
在 pom.xml 中将 JVM 选项添加到 Surefire 插件的配置中具有相同的效果:
<configuration>
<argLine>-Xmx1024m</argLine>
</configuration>
不仅是堆内存。还增加 perm 大小以解决 maven 中的异常在环境变量中使用这些变量。
variable name: MAVEN_OPTS
variable value: -Xmx512m -XX:MaxPermSize=256m
例子 :
export MAVEN_OPTS="-Xmx512m -XX:MaxPermSize=500m"
不定期副业成功案例分享
forkMode
已被弃用:maven.apache.org/surefire/maven-surefire-plugin/…forkMode
已被弃用,但我认为只能用具有类似功能的forkCount
替换。您可以使用 MAVEN_OPTS 的一种方法是<argLine>${env.MAVEN_OPTS}</argLine>
,但显然不建议这样做,因为它可能因计算机而异 (stackoverflow.com/a/10463133/32453)。另请注意,如果您使用的是 jacoco,您应该以不同的方式设置 argLine stackoverflow.com/questions/12269558/maven-jacoco-plugin-error