我在构建 Maven 项目时遇到了这个错误,我增加了 MAVEN_OPTS 但都是一样的,我发现了一些类似的帖子,但它们指的是别的东西。我该如何解决?
The system is out of resources. Consult the following stack trace for details. java.lang.OutOfMemoryError: PermGen space at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632) at java.lang.ClassLoader.defineClass(ClassLoader.java:616) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141) at java.net.URLClassLoader.defineClass(URLClassLoader.java:283) at java.net.URLClassLoader.access$000(URLClassLoader.java:58) at java.net.URLClassLoader$1.run(URLClassLoader.java:197) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at org.codehaus.plexus.compiler.javac.IsolatedClassLoader.loadClass(IsolatedClassLoader.java:56) at com.sun.tools.javac.comp.Annotate.<init>(Annotate.java:52) at com.sun.tools.javac.comp.Annotate.instance(Annotate.java:36) at com.sun.tools.javac.jvm.ClassReader.<init>(ClassReader.java:215) at com.sun.tools.javac.jvm.ClassReader.instance(ClassReader.java:168) at com.sun.tools.javac.main.JavaCompiler.<init>(JavaCompiler.java:293) at com.sun.tools.javac.main.JavaCompiler.instance(JavaCompiler.java:72) at com.sun.tools.javac.main.Main.compile(Main.java:340) at com.sun.tools.javac.main.Main.compile(Main.java:279) at com.sun.tools.javac.main.Main.compile(Main.java:270) at com.sun.tools.javac.Main.compile(Main.java:87) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.codehaus.plexus.compiler.javac.JavacCompiler.compileInProcess(JavacCompiler.java:420) at org.codehaus.plexus.compiler.javac.JavacCompiler.compile(JavacCompiler.java:141) at org.apache.maven.plugin.AbstractCompilerMojo.execute(AbstractCompilerMojo.java:493) at org.apache.maven.plugin.CompilerMojo.execute(CompilerMojo.java:114) at org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.java:490) at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:694) at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalWithLifecycle(DefaultLifecycleExecutor.java:556) at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(DefaultLifecycleExecutor.java:535)
我并不担心如何 在 Maven 生态系统中修复它
当你说你增加MAVEN_OPTS了,你增加了什么值?您是否增加了MaxPermSize,例如:
MAVEN_OPTS
MaxPermSize
export MAVEN_OPTS="-Xmx512m -XX:MaxPermSize=128m"
(或在 Windows 上:)
set MAVEN_OPTS=-Xmx512m -XX:MaxPermSize=128m
您还可以在每个 maven 项目中分别指定这些 JVM 选项。
回答晚了要提到另一个选项而不是通用MAVEN_OPTS环境变量来传递给 Maven 构建所需的 JVM 选项。
从 Maven 3.3.1开始,您可以将.mvn文件夹作为相关项目的一部分,并将jvm.config文件作为此类选项的理想位置。
.mvn
jvm.config
两个新的可选配置文件.mvn/jvm.config和.mvn/maven.config,位于项目源代码树的基目录中。如果存在,这些文件将提供默认的 jvm 和 maven 选项。因为这些文件是项目源代码树的一部分,所以它们将出现在所有项目签出中,并且会在每次构建项目时自动使用。
.mvn/jvm.config
.mvn/maven.config
作为官方发行说明的一部分
在 Maven 中,在每个项目基础上定义 JVM 配置并不简单。基于环境变量MAVEN_OPTS和使用的现有机制${user.home}/.mavenrc是另一种选择,其缺点是不属于项目的一部分。 从这个版本开始,您可以通过${maven.projectBasedir}/.mvn/jvm.config文件定义 JVM 配置,这意味着您可以在每个项目基础上定义构建选项。该文件将成为您项目的一部分,并将与您的项目一起签入。所以不再需要MAVEN_OPTS,.mavenrc文件。例如,如果您将以下 JVM 选项放入${maven.projectBasedir}/.mvn/jvm.config文件中: xml -Xmx2048m -Xms1024m -XX:MaxPermSize=512m -Djava.awt.headless=true
在 Maven 中,在每个项目基础上定义 JVM 配置并不简单。基于环境变量MAVEN_OPTS和使用的现有机制${user.home}/.mavenrc是另一种选择,其缺点是不属于项目的一部分。
${user.home}/.mavenrc
从这个版本开始,您可以通过${maven.projectBasedir}/.mvn/jvm.config文件定义 JVM 配置,这意味着您可以在每个项目基础上定义构建选项。该文件将成为您项目的一部分,并将与您的项目一起签入。所以不再需要MAVEN_OPTS,.mavenrc文件。例如,如果您将以下 JVM 选项放入${maven.projectBasedir}/.mvn/jvm.config文件中:
${maven.projectBasedir}/.mvn/jvm.config
.mavenrc
xml -Xmx2048m -Xms1024m -XX:MaxPermSize=512m -Djava.awt.headless=true
这种方法的主要优点是配置与相关项目隔离并应用于整个构建,并且比MAVEN_OPTS其他开发同一项目的开发人员更脆弱(忘记设置它)。 此外,如果是多模块项目,这些选项将应用于所有模块。