使用idea打包maven项目的时候因为java文件多导致java.lang.OutOfMemoryError: Java heap space
maven打包java.lang.OutOfMemoryError: Java heap space
- 使用idea打包maven项目的时候因为java文件多导致java.lang.OutOfMemoryError: Java heap space
- ✅ 解决思路
- ✅ 解决方案:为编译器插件设置内存
- ✅ 替代临时方案:命令行添加内存参数
- 🚀 最终建议(组合拳)
- 说明:
- 操作步骤:
- ✅ 步骤 2:保留 `.mvn/maven.config` 或环境变量中的适当 `MAVEN_OPTS`
- 1. **`.mvn/maven.config` 文件**:
- 2. **环境变量 `MAVEN_OPTS`**:
- ✅ 步骤 3:分模块编译(使用 `-pl` 参数)
- 1. **如何使用 `-pl` 参数**:
- 2. **多个模块编译**:
- 3. **跳过模块的编译**:
- 我使用的方法1解决的。
使用idea打包maven项目的时候因为java文件多导致java.lang.OutOfMemoryError: Java heap space
D:\work\dbauditwebserver\project\service\src\main\java;D:\work\dbauditwebserver\project\service\target\generated-sources\annotations; -s D:\work\dbauditwebserver\project\service\target\generated-sources\annotations -g -parameters -nowarn -target 1.8 -source 1.8 -encoding UTF-8 [DEBUG] incrementalBuildHelper#beforeRebuildExecution [INFO] Compiling 899 source files to D:\work\dbauditwebserver\project\service\target\classes 系统资源不足。 有关详细信息, 请参阅以下堆栈跟踪。 java.lang.OutOfMemoryError: Java heap space
现在遇到的是典型的编译期内存不足问题:
java.lang.OutOfMemoryError: Java heap space
这表示编译器(javac
)在编译 899 个 Java 文件时,堆内存用光了,可能是在使用 annotation processor、Lombok、MapStruct 等。
✅ 解决思路
这个错误不是 Maven 自己的内存,而是 Maven 启动的 javac
编译器的内存不够。我们要把内存加给 compiler plugin,不是 MAVEN_OPTS
。
✅ 解决方案:为编译器插件设置内存
在你的项目的根 pom.xml
文件中,找到或添加如下配置(推荐放在 <build>
节点下):
<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><fork>true</fork><meminitial>256m</meminitial> <!-- 初始内存 --><maxmem>1024m</maxmem> <!-- 最大内存 --></configuration></plugin></plugins>
</build>
说明:
fork=true
:让javac
在新进程中运行,才能控制内存。maxmem
:给javac
分配的最大内存(你现在就缺这个)。- 你也可以试试更大的,比如
maxmem=2048m
,如果你系统内存允许。
✅ 替代临时方案:命令行添加内存参数
你也可以临时在命令行运行时加参数(不推荐长期使用):
mvn clean install -Dmaven.compiler.fork=true -Dmaven.compiler.meminitial=256m -Dmaven.compiler.maxmem=1024m
🚀 最终建议(组合拳)
- 在
pom.xml
中配置好maven-compiler-plugin
的内存; - 同时保留
.mvn/maven.config
或环境变量中的适当MAVEN_OPTS
; - 如果你项目特别大,可以考虑分模块编译(用
-pl
参数)。
以下是可以直接粘贴到你的 pom.xml
中的配置段落,用来为 maven-compiler-plugin
设置合适的内存。
<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><fork>true</fork> <!-- 启用独立进程 --><meminitial>256m</meminitial> <!-- 设置初始内存 --><maxmem>1024m</maxmem> <!-- 设置最大内存 --></configuration></plugin></plugins>
</build>
说明:
fork=true
:让javac
在独立的进程中运行,这样才可以通过meminitial
和maxmem
来控制内存。meminitial
:设置给编译器进程的初始内存(可以调整到 256m,或更大)。maxmem
:设置给编译器进程的最大内存(可以设置为 1024m 或更高,如果你的系统支持)。
操作步骤:
- 打开你的项目
pom.xml
。 - 找到
<build>
标签并将上面的配置粘贴进去,确保它在<plugins>
部分下。 - 保存文件,然后重新运行构建命令:
mvn clean install -B -Dmaven.test.skip=true
这样就能有效避免由于内存不足而导致的 OutOfMemoryError
,提高编译效率。
✅ 步骤 2:保留 .mvn/maven.config
或环境变量中的适当 MAVEN_OPTS
1. .mvn/maven.config
文件:
如果你没有设置 MAVEN_OPTS
或 .mvn/maven.config
文件,可以在项目根目录创建一个 .mvn
文件夹,并在其中创建 maven.config
文件,像这样:
.mvn/maven.config
文件内容示例:
-Xms512m -Xmx1024m -DskipTests=true
解释:
-Xms512m
:设置 JVM 初始堆内存为 512MB。-Xmx1024m
:设置 JVM 最大堆内存为 1GB。-DskipTests=true
:跳过测试,节省时间。
这样,Maven 在运行时会自动读取 .mvn/maven.config
中的配置,确保合适的内存设置。
2. 环境变量 MAVEN_OPTS
:
如果你不想使用 .mvn/maven.config
文件,也可以通过设置环境变量来全局配置内存。在 Windows 上,可以在系统环境变量中添加 MAVEN_OPTS
:
set MAVEN_OPTS=-Xms512m -Xmx1024m -DskipTests=true
在 macOS/Linux 上,使用如下命令:
export MAVEN_OPTS="-Xms512m -Xmx1024m -DskipTests=true"
这样每次运行 Maven 时,它都会读取并应用这些内存设置。
✅ 步骤 3:分模块编译(使用 -pl
参数)
如果你的项目特别大,可以考虑分模块编译,避免一次性编译整个项目。Maven 支持通过 -pl
(--projects
)参数只编译指定的模块。
1. 如何使用 -pl
参数:
假设你有多个模块(如 module-a
和 module-b
),并且你只想编译其中一个模块:
mvn clean install -pl module-a
这样,Maven 只会构建 module-a
模块,而不会编译整个项目。
2. 多个模块编译:
如果你想同时编译多个模块,可以这样:
mvn clean install -pl module-a,module-b
3. 跳过模块的编译:
如果你想跳过某些模块的编译(但保留其他模块),可以使用 -pl
并结合 -am
参数:
mvn clean install -pl module-a -am
-pl module-a
:只编译module-a
。-am
:同时构建module-a
的依赖模块。