文章目录开篇一个开发者的血泪踩坑第一部分Build 是什么——IDEA 的私有编译器Build 的本质Build 的 JVM 参数来源全局 Build 参数配置Build 何时使用第二部分Maven 是什么——完整的生命周期编排Maven 的本质Maven 的 JVM 参数来源优先级从高到低Maven 何时使用第三部分Run 是什么——应用启动环境Run 的本质Run 的 JVM 参数来源Run 何时使用第四部分三者的关系及流程图关键关系流程图ASCII三个黑箱的独立性第五部分为什么会有不同的 OOM——三个常见 OOM 场景场景 1Build 时 OOM场景 2Maven 时 OOM场景 3Run 时 OOM第六部分常见问题 FAQQ1为什么我的代码在 IDEA 中 Build 成功但 mvn clean install 失败Q2我的 Spring Boot 应用在 IDEA 中 Run 正常但打包后启动失败OOM / ClassNotFoundQ3为什么 CI/CD 流水线中 Maven 总是超时或 OOM但本地正常Q4什么时候应该用 Build什么时候应该用 Maven总结开篇一个开发者的血泪踩坑你是否遇到过这样的困惑场景你本地在 IDEA 中点击 Build → 编译成功代码跑得好好的。但是到了 CI/CD 流水线上同样的代码运行maven install却抛出[ERROR] OutOfMemoryError: Java heap space [ERROR] BUILD FAILURE或者另一个场景你的 Spring Boot 项目能够通过 IDEA 的 Run 按钮正常启动但是用mvn clean package java -jar app.jar启动后立即 OOM 或出现奇怪的 ClassLoader 错误。你挠头了明明是同一份代码啊为什么结果不一样原因很简单IDEA 的 Build、Maven 和 Run三者使用的编译器、运行时环境、JVM 参数完全不同。每一个都是独立的系统各自有各自的黑箱配置。本文将深入这三个黑箱让你彻底搞懂它们的区别、JVM 参数来源、配置位置以及它们之间的关系。第一部分Build 是什么——IDEA 的私有编译器Build 的本质当你在 IDEA 中按下CtrlF9或 Build → Make Project时你并非在运行 Maven。你在使用的是IDEA 自己的编译器基于 Javac 包装。这意味着不读取pom.xml的build配置不走Maven 的生命周期clean、compile、test、package独立存储编译结果到 IDEA 的缓存目录通常是.idea/out或build/下使用独立的 JVM 进程来完成编译Build 的 JVM 参数来源IDEA Build 使用的 JVM 堆大小由一个特殊参数控制BUILD_PROCESS_HEAP_SIZE这个参数位于.idea/compiler.xml示例来自真实项目?xml version1.0 encodingUTF-8?projectversion4componentnameCompilerConfiguration!-- Build 过程的堆大小单位 MB默认 700 --optionnameBUILD_PROCESS_HEAP_SIZEvalue1500/annotationProcessingprofiledefaulttruenameDefaultenabledtrue/profilenameMaven default annotation processors profileenabledtruesourceOutputDirnametarget/generated-sources/annotations/sourceTestOutputDirnametarget/generated-test-sources/test-annotations/modulenamexsb-base-server-entity/modulenamexsb-base-server-service/!-- 其他模块... --/profile/annotationProcessing/componentcomponentnameJavacSettings!-- javac 编译选项如 -parameters保留方法参数名 --optionnameADDITIONAL_OPTIONS_OVERRIDEmodulenamexsb-base-serveroptions-parameters/!-- 其他模块... --/option/component/project这个文件是项目级配置被版本控制系统追踪。如果你的项目经常在 Build 时 OOM团队成员会一起受影响。全局 Build 参数配置除了项目级的compiler.xmlIDEA 还提供了全局编译参数位于Linux/Mac~/.config/JetBrains/IntelliJIdea*/idea.properties ~/.config/JetBrains/IntelliJIdea*/idea.vmoptionsWindowsC:\Users\username\AppData\Roaming\JetBrains\IntelliJIdea*\idea.properties C:\Users\username\AppData\Roaming\JetBrains\IntelliJIdea*\idea.vmoptions在idea.vmoptions中可以设置全局 JVM 参数-Xmx2048m -Xms512m -XX:UseG1GCBuild 何时使用快速校验语法编写代码时实时编译反馈生成 IDEA 的项目索引和 AST代码提示基础快速运行单个测试CtrlShiftF10输出到out/目录用于本地调试不适合用于生产部署因为编译结果不包含 Maven 依赖处理、资源打包等完整的生命周期操作。第二部分Maven 是什么——完整的生命周期编排Maven 的本质当你执行mvn clean install或在 IDEA 中右键点击 Run Maven → install 时你在运行的是Maven 命令行工具它是一个独立的构建系统。这意味着完整读取pom.xml依赖、插件、生命周期顺序执行清理、编译、测试、打包、安装等阶段管理依赖下载、冲突解决、传递依赖处理启动独立的 JVM 进程运行 Maven 本身Maven 的 JVM 参数来源优先级从高到低优先级 1环境变量MAVEN_OPTS这是最常用的设置方式对所有 Maven 调用全局生效# Linux/MacexportMAVEN_OPTS-Xmx2048m -Xms512m -XX:UseG1GCmvn cleaninstall# Windows (PowerShell)$env:MAVEN_OPTS-Xmx2048m -Xms512m -XX:UseG1GCmvn cleaninstall# Windows (Cmd)setMAVEN_OPTS-Xmx2048m-Xms512m-XX:UseG1GCmvn cleaninstall优先级 2IDEA 的 Maven Runner 配置Settings → Build, Execution, Deployment → Build Tools → Maven → RunnerVM options: -Xmx2048m -Xms512m -XX:UseG1GC这配置被保存在.idea/workspace.xml 或 .idea/*.xml示例片段componentnameMavenRunneroptionnamejreNamevalue11/optionnamevmOptionsvalue-Xmx2048m -Xms512m/optionnamemavenHomevalue$MAVEN_HOME$//component优先级 3~/.m2/settings.xml全局 Maven 配置虽然这个文件主要用于仓库、认证配置但某些 Maven 插件会读取这里的参数。优先级 4pom.xml中的插件配置某些编译插件可以在configuration中设置特定参数例如maven-compiler-pluginplugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-compiler-plugin/artifactIdversion3.8.1/versionconfigurationsource11/sourcetarget11/targetforktrue/forkmeminitial512m/meminitialmaxmem2048m/maxmem/configuration/pluginMaven 何时使用团队构建CI/CD 流水线完整的发布包生成运行单元测试mvn test生成可执行 JAR 或 WAR依赖管理和版本检查第三部分Run 是什么——应用启动环境Run 的本质当你点击 IDEA 中的绿色Run按钮或 ShiftF10时你在做的是启动一个新的 JVM 进程并将应用加载到其中。这与编译无关而是一个独立的运行时环境。关键区别使用编译器的输出无论是 IDEA Build 还是 Maven build 的结果读取 Run Configuration项目级每个 Module 可有多个启动独立的应用 JVM与 Build JVM 无关可以配置热重载、断点调试等开发工具Run 的 JVM 参数来源优先级 1Run Configuration 中的 VM options这是最直接的配置方式。打开 Run → Edit ConfigurationsVM options: -Xmx1024m -Xms256m -Xdebug -agentlib:jdwptransportdt_socket...这配置保存在.idea/runConfigurations/xyz.xml 或 .idea/workspace.xml示例Spring Boot 项目configurationnameXsbBaseServerWebApplicationtypeApplicationfactoryNameApplicationoptionnameMAIN_CLASS_NAMEvaluecn.yiliang.xsb.base.server.web.XsbBaseServerWebApplication/modulenamexsb-base-server-web/optionnameVM_PARAMETERSvalue-Xmx1024m -Xms256m -Dspring.profiles.activelocal/optionnamePROGRAM_PARAMETERSvalue/optionnameWORKING_DIRECTORYvalue$PROJECT_DIR$/methodv2optionnameMakevaluetrue//method/configuration优先级 2环境变量在 Run Configuration 的 Environment variables 中设置JVM_OPTS-Xmx1024m JAVA_OPTS-XX:UseG1GC优先级 3.env或项目根目录的配置文件某些框架如 Spring Boot支持读取本地配置文件。Run 何时使用本地开发调试快速验证功能无需打包实时热重载和快速反馈使用 IDEA 的调试工具断点、监视表达式第四部分三者的关系及流程图关键关系维度BuildMavenRun触发方式CtrlF9 / Build 菜单CLI 或 IDEA Maven 面板ShiftF10 / Run 按钮使用的编译器IDEA 内置编译器JavacMaven 调用无使用已编译输出依赖管理IDEA 索引Maven 生命周期继承自 Build/Maven 结果输出位置out/或build/target/内存或配置的工作目录JVM 参数源.idea/compiler.xmlMAVEN_OPTS或.idea/workspace.xmlRun Configuration典型 OOM 表现BUILD_PROCESS_HEAP_SIZE 不足maven.compiler.maxmem或MAVEN_OPTS不足应用本身内存溢出生产场景✗ 不适用✓ 标准选择✗ 不适用应用运行流程图ASCII┌─────────────────────────────────────────────────────────┐ │ 开发者操作 │ └────────────┬──────────────────┬──────────────────┬──────┘ │ │ │ ▼ ▼ ▼ ┌─────────┐ ┌───────────┐ ┌──────────┐ │ Build │ │ Maven │ │ Run │ │(CtrlF9)│ │(CLI/Panel)│ │(ShiftF10) └────┬────┘ └─────┬─────┘ └────┬─────┘ │ │ │ ▼────┴────────▼ │ ▼────────┴─────▼ .idea/compiler.xml MAVEN_OPTS Run Configuration │ │ │ ▼ ▼ ▼ IDEA 编译器 Maven JVM 应用 JVM (BUILD_PROCESS_ (java -jar (Spring Boot/ HEAP_SIZE) Maven.jar) Java App) │ │ │ ▼ ▼ ▼ out/ target/ 内存运行 /build/ /classes 调试信息 │ │ │ └───────────┬───────────┴──────────────────┘ │ ▼ 用于 Run Configuration 的 classpath 构建三个黑箱的独立性这是关键洞察这三个系统基本是独立的彼此不知道对方的参数设置。例如Build 中 OOM 不会导致 Maven 中 OOMMaven install 成功不代表 Build 也成功Run 启动成功不代表打包时没问题第五部分为什么会有不同的 OOM——三个常见 OOM 场景场景 1Build 时 OOM症状[javac] OutOfMemoryError: Java heap space原因编译源代码时需要加载大量 AST、符号表、注解处理器结果解决方案增大BUILD_PROCESS_HEAP_SIZE编辑.idea/compiler.xmlcomponentnameCompilerConfiguration!-- 从默认 700MB 增加到 2000MB --optionnameBUILD_PROCESS_HEAP_SIZEvalue2000//component或全局编辑idea.vmoptions-Xmx2048m场景 2Maven 时 OOM症状ERROR: Maven out of memory, set MAVEN_OPTS原因Maven 本身在处理大型项目的依赖树、运行单元测试或 annotation processing 时内存不足解决方案设置MAVEN_OPTS或在 IDEA 的 Maven Runner 中配置方法 A设置环境变量推荐全局生效Linux/Mac# 添加到 ~/.bashrc 或 ~/.zshrcexportMAVEN_OPTS-Xmx2048m -Xms512m -XX:UseG1GCWindows PowerShell# 添加到 $PROFILE[Environment]::SetEnvironmentVariable(MAVEN_OPTS,-Xmx2048m -Xms512m -XX:UseG1GC,User)方法 BIDEA 配置Settings → Build, Execution, Deployment → Build Tools → Maven → RunnerVM options: -Xmx2048m -Xms512m方法 Cpom.xml 中配置plugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-compiler-plugin/artifactIdversion3.8.1/versionconfigurationforktrue/forkmeminitial512m/meminitialmaxmem2048m/maxmem/configuration/plugin场景 3Run 时 OOM症状Exception in thread main java.lang.OutOfMemoryError: Java heap space at ...原因应用本身在运行时如加载大量数据、缓存等需要更多堆内存解决方案编辑 Run Configuration在 IDEA 中点击 Run → Edit Configurations找到你的应用如XsbBaseServerWebApplication设置VM options: -Xmx1024m -Xms512m配置文件示例.idea/runConfigurations/MyApp.xmlconfigurationnameMyApptypeApplicationfactoryNameApplicationoptionnameMAIN_CLASS_NAMEvaluecom.example.Application/modulenamemy-app/optionnameVM_PARAMETERSvalue-Xmx1024m -Xms512m -XX:PrintGCDetails/methodv2optionnameMakevaluetrue//method/configuration第六部分常见问题 FAQQ1为什么我的代码在 IDEA 中 Build 成功但mvn clean install失败A两个独立的编译系统参数配置可能不同。检查清单Build 参数.idea/compiler.xml中的BUILD_PROCESS_HEAP_SIZEMaven 参数环境变量MAVEN_OPTS或 IDEA Maven Runner 配置依赖IDEA 可能缓存了本地的第三方库而 Maven 可能下载失败或版本冲突源代码兼容性IDEA 的编译器可能更宽松快速修复# 设置 Maven 环境变量exportMAVEN_OPTS-Xmx2048mmvn cleaninstall-DskipTestsQ2我的 Spring Boot 应用在 IDEA 中 Run 正常但打包后启动失败OOM / ClassNotFoundARun 和打包是两个不同的环节Run 使用的 classpath 是由 IDEA 动态构建的而打包后的 JAR 是静态的。检查清单Classpath 差异IDEA Run 可能引入了某些开发依赖scopeprovidedJAR 中没有资源文件确保src/main/resources被正确打包到 JAR主类配置pom.xml中mainClass是否正确启动内存JAR 启动时需要单独指定-Xmx快速修复# 确保资源被正确打包mvn clean package-DskipTests# 启动时指定 JVM 参数java-Xmx1024m-Xms512m-jarapp.jarQ3为什么 CI/CD 流水线中 Maven 总是超时或 OOM但本地正常ACI 环境的计算资源可能受限或缺少必要的 JVM 参数。检查清单CI 环境的 JVM 版本与本地是否一致java -version容器内存限制Docker 容器是否设置了-m 512m这样的限制Maven 缓存CI 中是否清除了.m2/repository导致每次都重新下载网络速度下载依赖是否超时快速修复在 CI 配置文件中如.github/workflows/build.yml或.gitlab-ci.yml# GitHub Actions 示例-name:Build with Mavenenv:MAVEN_OPTS:-Xmx2048m -XX:UseG1GCrun:mvn clean install-DskipTests# GitLab CI 示例build:script:-export MAVEN_OPTS-Xmx2048m-mvn clean install-DskipTestsQ4什么时候应该用 Build什么时候应该用 MavenA简单原则开发中优先用 Build快速反馈 Run调试提交代码前用 Maven完整校验接近 CI 环境本地验证 CI 流程用 Maven模拟真实构建生产部署只能用 MavenBuild 和 Run 都不是交付物总结Build、Maven、Run 三者各司其职用途工具配置来源何时用快速反馈Build.idea/compiler.xml开发编写代码时完整构建MavenMAVEN_OPTS提交前校验、CI/CD本地调试RunRun Configuration功能测试、单步调试掌握这三个黑箱的独立性你就能彻底避免本地能跑CI 却失败的尴尬。下次碰到 OOM 或编译失败记住从参数来源入手逐一排查——99% 的问题都能解决。
IDEA 中 Build、Maven、Run 三者的本质区别 —— 为什么你的代码在 IDE 能编译却在 CI/CD 失败?
文章目录开篇一个开发者的血泪踩坑第一部分Build 是什么——IDEA 的私有编译器Build 的本质Build 的 JVM 参数来源全局 Build 参数配置Build 何时使用第二部分Maven 是什么——完整的生命周期编排Maven 的本质Maven 的 JVM 参数来源优先级从高到低Maven 何时使用第三部分Run 是什么——应用启动环境Run 的本质Run 的 JVM 参数来源Run 何时使用第四部分三者的关系及流程图关键关系流程图ASCII三个黑箱的独立性第五部分为什么会有不同的 OOM——三个常见 OOM 场景场景 1Build 时 OOM场景 2Maven 时 OOM场景 3Run 时 OOM第六部分常见问题 FAQQ1为什么我的代码在 IDEA 中 Build 成功但 mvn clean install 失败Q2我的 Spring Boot 应用在 IDEA 中 Run 正常但打包后启动失败OOM / ClassNotFoundQ3为什么 CI/CD 流水线中 Maven 总是超时或 OOM但本地正常Q4什么时候应该用 Build什么时候应该用 Maven总结开篇一个开发者的血泪踩坑你是否遇到过这样的困惑场景你本地在 IDEA 中点击 Build → 编译成功代码跑得好好的。但是到了 CI/CD 流水线上同样的代码运行maven install却抛出[ERROR] OutOfMemoryError: Java heap space [ERROR] BUILD FAILURE或者另一个场景你的 Spring Boot 项目能够通过 IDEA 的 Run 按钮正常启动但是用mvn clean package java -jar app.jar启动后立即 OOM 或出现奇怪的 ClassLoader 错误。你挠头了明明是同一份代码啊为什么结果不一样原因很简单IDEA 的 Build、Maven 和 Run三者使用的编译器、运行时环境、JVM 参数完全不同。每一个都是独立的系统各自有各自的黑箱配置。本文将深入这三个黑箱让你彻底搞懂它们的区别、JVM 参数来源、配置位置以及它们之间的关系。第一部分Build 是什么——IDEA 的私有编译器Build 的本质当你在 IDEA 中按下CtrlF9或 Build → Make Project时你并非在运行 Maven。你在使用的是IDEA 自己的编译器基于 Javac 包装。这意味着不读取pom.xml的build配置不走Maven 的生命周期clean、compile、test、package独立存储编译结果到 IDEA 的缓存目录通常是.idea/out或build/下使用独立的 JVM 进程来完成编译Build 的 JVM 参数来源IDEA Build 使用的 JVM 堆大小由一个特殊参数控制BUILD_PROCESS_HEAP_SIZE这个参数位于.idea/compiler.xml示例来自真实项目?xml version1.0 encodingUTF-8?projectversion4componentnameCompilerConfiguration!-- Build 过程的堆大小单位 MB默认 700 --optionnameBUILD_PROCESS_HEAP_SIZEvalue1500/annotationProcessingprofiledefaulttruenameDefaultenabledtrue/profilenameMaven default annotation processors profileenabledtruesourceOutputDirnametarget/generated-sources/annotations/sourceTestOutputDirnametarget/generated-test-sources/test-annotations/modulenamexsb-base-server-entity/modulenamexsb-base-server-service/!-- 其他模块... --/profile/annotationProcessing/componentcomponentnameJavacSettings!-- javac 编译选项如 -parameters保留方法参数名 --optionnameADDITIONAL_OPTIONS_OVERRIDEmodulenamexsb-base-serveroptions-parameters/!-- 其他模块... --/option/component/project这个文件是项目级配置被版本控制系统追踪。如果你的项目经常在 Build 时 OOM团队成员会一起受影响。全局 Build 参数配置除了项目级的compiler.xmlIDEA 还提供了全局编译参数位于Linux/Mac~/.config/JetBrains/IntelliJIdea*/idea.properties ~/.config/JetBrains/IntelliJIdea*/idea.vmoptionsWindowsC:\Users\username\AppData\Roaming\JetBrains\IntelliJIdea*\idea.properties C:\Users\username\AppData\Roaming\JetBrains\IntelliJIdea*\idea.vmoptions在idea.vmoptions中可以设置全局 JVM 参数-Xmx2048m -Xms512m -XX:UseG1GCBuild 何时使用快速校验语法编写代码时实时编译反馈生成 IDEA 的项目索引和 AST代码提示基础快速运行单个测试CtrlShiftF10输出到out/目录用于本地调试不适合用于生产部署因为编译结果不包含 Maven 依赖处理、资源打包等完整的生命周期操作。第二部分Maven 是什么——完整的生命周期编排Maven 的本质当你执行mvn clean install或在 IDEA 中右键点击 Run Maven → install 时你在运行的是Maven 命令行工具它是一个独立的构建系统。这意味着完整读取pom.xml依赖、插件、生命周期顺序执行清理、编译、测试、打包、安装等阶段管理依赖下载、冲突解决、传递依赖处理启动独立的 JVM 进程运行 Maven 本身Maven 的 JVM 参数来源优先级从高到低优先级 1环境变量MAVEN_OPTS这是最常用的设置方式对所有 Maven 调用全局生效# Linux/MacexportMAVEN_OPTS-Xmx2048m -Xms512m -XX:UseG1GCmvn cleaninstall# Windows (PowerShell)$env:MAVEN_OPTS-Xmx2048m -Xms512m -XX:UseG1GCmvn cleaninstall# Windows (Cmd)setMAVEN_OPTS-Xmx2048m-Xms512m-XX:UseG1GCmvn cleaninstall优先级 2IDEA 的 Maven Runner 配置Settings → Build, Execution, Deployment → Build Tools → Maven → RunnerVM options: -Xmx2048m -Xms512m -XX:UseG1GC这配置被保存在.idea/workspace.xml 或 .idea/*.xml示例片段componentnameMavenRunneroptionnamejreNamevalue11/optionnamevmOptionsvalue-Xmx2048m -Xms512m/optionnamemavenHomevalue$MAVEN_HOME$//component优先级 3~/.m2/settings.xml全局 Maven 配置虽然这个文件主要用于仓库、认证配置但某些 Maven 插件会读取这里的参数。优先级 4pom.xml中的插件配置某些编译插件可以在configuration中设置特定参数例如maven-compiler-pluginplugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-compiler-plugin/artifactIdversion3.8.1/versionconfigurationsource11/sourcetarget11/targetforktrue/forkmeminitial512m/meminitialmaxmem2048m/maxmem/configuration/pluginMaven 何时使用团队构建CI/CD 流水线完整的发布包生成运行单元测试mvn test生成可执行 JAR 或 WAR依赖管理和版本检查第三部分Run 是什么——应用启动环境Run 的本质当你点击 IDEA 中的绿色Run按钮或 ShiftF10时你在做的是启动一个新的 JVM 进程并将应用加载到其中。这与编译无关而是一个独立的运行时环境。关键区别使用编译器的输出无论是 IDEA Build 还是 Maven build 的结果读取 Run Configuration项目级每个 Module 可有多个启动独立的应用 JVM与 Build JVM 无关可以配置热重载、断点调试等开发工具Run 的 JVM 参数来源优先级 1Run Configuration 中的 VM options这是最直接的配置方式。打开 Run → Edit ConfigurationsVM options: -Xmx1024m -Xms256m -Xdebug -agentlib:jdwptransportdt_socket...这配置保存在.idea/runConfigurations/xyz.xml 或 .idea/workspace.xml示例Spring Boot 项目configurationnameXsbBaseServerWebApplicationtypeApplicationfactoryNameApplicationoptionnameMAIN_CLASS_NAMEvaluecn.yiliang.xsb.base.server.web.XsbBaseServerWebApplication/modulenamexsb-base-server-web/optionnameVM_PARAMETERSvalue-Xmx1024m -Xms256m -Dspring.profiles.activelocal/optionnamePROGRAM_PARAMETERSvalue/optionnameWORKING_DIRECTORYvalue$PROJECT_DIR$/methodv2optionnameMakevaluetrue//method/configuration优先级 2环境变量在 Run Configuration 的 Environment variables 中设置JVM_OPTS-Xmx1024m JAVA_OPTS-XX:UseG1GC优先级 3.env或项目根目录的配置文件某些框架如 Spring Boot支持读取本地配置文件。Run 何时使用本地开发调试快速验证功能无需打包实时热重载和快速反馈使用 IDEA 的调试工具断点、监视表达式第四部分三者的关系及流程图关键关系维度BuildMavenRun触发方式CtrlF9 / Build 菜单CLI 或 IDEA Maven 面板ShiftF10 / Run 按钮使用的编译器IDEA 内置编译器JavacMaven 调用无使用已编译输出依赖管理IDEA 索引Maven 生命周期继承自 Build/Maven 结果输出位置out/或build/target/内存或配置的工作目录JVM 参数源.idea/compiler.xmlMAVEN_OPTS或.idea/workspace.xmlRun Configuration典型 OOM 表现BUILD_PROCESS_HEAP_SIZE 不足maven.compiler.maxmem或MAVEN_OPTS不足应用本身内存溢出生产场景✗ 不适用✓ 标准选择✗ 不适用应用运行流程图ASCII┌─────────────────────────────────────────────────────────┐ │ 开发者操作 │ └────────────┬──────────────────┬──────────────────┬──────┘ │ │ │ ▼ ▼ ▼ ┌─────────┐ ┌───────────┐ ┌──────────┐ │ Build │ │ Maven │ │ Run │ │(CtrlF9)│ │(CLI/Panel)│ │(ShiftF10) └────┬────┘ └─────┬─────┘ └────┬─────┘ │ │ │ ▼────┴────────▼ │ ▼────────┴─────▼ .idea/compiler.xml MAVEN_OPTS Run Configuration │ │ │ ▼ ▼ ▼ IDEA 编译器 Maven JVM 应用 JVM (BUILD_PROCESS_ (java -jar (Spring Boot/ HEAP_SIZE) Maven.jar) Java App) │ │ │ ▼ ▼ ▼ out/ target/ 内存运行 /build/ /classes 调试信息 │ │ │ └───────────┬───────────┴──────────────────┘ │ ▼ 用于 Run Configuration 的 classpath 构建三个黑箱的独立性这是关键洞察这三个系统基本是独立的彼此不知道对方的参数设置。例如Build 中 OOM 不会导致 Maven 中 OOMMaven install 成功不代表 Build 也成功Run 启动成功不代表打包时没问题第五部分为什么会有不同的 OOM——三个常见 OOM 场景场景 1Build 时 OOM症状[javac] OutOfMemoryError: Java heap space原因编译源代码时需要加载大量 AST、符号表、注解处理器结果解决方案增大BUILD_PROCESS_HEAP_SIZE编辑.idea/compiler.xmlcomponentnameCompilerConfiguration!-- 从默认 700MB 增加到 2000MB --optionnameBUILD_PROCESS_HEAP_SIZEvalue2000//component或全局编辑idea.vmoptions-Xmx2048m场景 2Maven 时 OOM症状ERROR: Maven out of memory, set MAVEN_OPTS原因Maven 本身在处理大型项目的依赖树、运行单元测试或 annotation processing 时内存不足解决方案设置MAVEN_OPTS或在 IDEA 的 Maven Runner 中配置方法 A设置环境变量推荐全局生效Linux/Mac# 添加到 ~/.bashrc 或 ~/.zshrcexportMAVEN_OPTS-Xmx2048m -Xms512m -XX:UseG1GCWindows PowerShell# 添加到 $PROFILE[Environment]::SetEnvironmentVariable(MAVEN_OPTS,-Xmx2048m -Xms512m -XX:UseG1GC,User)方法 BIDEA 配置Settings → Build, Execution, Deployment → Build Tools → Maven → RunnerVM options: -Xmx2048m -Xms512m方法 Cpom.xml 中配置plugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-compiler-plugin/artifactIdversion3.8.1/versionconfigurationforktrue/forkmeminitial512m/meminitialmaxmem2048m/maxmem/configuration/plugin场景 3Run 时 OOM症状Exception in thread main java.lang.OutOfMemoryError: Java heap space at ...原因应用本身在运行时如加载大量数据、缓存等需要更多堆内存解决方案编辑 Run Configuration在 IDEA 中点击 Run → Edit Configurations找到你的应用如XsbBaseServerWebApplication设置VM options: -Xmx1024m -Xms512m配置文件示例.idea/runConfigurations/MyApp.xmlconfigurationnameMyApptypeApplicationfactoryNameApplicationoptionnameMAIN_CLASS_NAMEvaluecom.example.Application/modulenamemy-app/optionnameVM_PARAMETERSvalue-Xmx1024m -Xms512m -XX:PrintGCDetails/methodv2optionnameMakevaluetrue//method/configuration第六部分常见问题 FAQQ1为什么我的代码在 IDEA 中 Build 成功但mvn clean install失败A两个独立的编译系统参数配置可能不同。检查清单Build 参数.idea/compiler.xml中的BUILD_PROCESS_HEAP_SIZEMaven 参数环境变量MAVEN_OPTS或 IDEA Maven Runner 配置依赖IDEA 可能缓存了本地的第三方库而 Maven 可能下载失败或版本冲突源代码兼容性IDEA 的编译器可能更宽松快速修复# 设置 Maven 环境变量exportMAVEN_OPTS-Xmx2048mmvn cleaninstall-DskipTestsQ2我的 Spring Boot 应用在 IDEA 中 Run 正常但打包后启动失败OOM / ClassNotFoundARun 和打包是两个不同的环节Run 使用的 classpath 是由 IDEA 动态构建的而打包后的 JAR 是静态的。检查清单Classpath 差异IDEA Run 可能引入了某些开发依赖scopeprovidedJAR 中没有资源文件确保src/main/resources被正确打包到 JAR主类配置pom.xml中mainClass是否正确启动内存JAR 启动时需要单独指定-Xmx快速修复# 确保资源被正确打包mvn clean package-DskipTests# 启动时指定 JVM 参数java-Xmx1024m-Xms512m-jarapp.jarQ3为什么 CI/CD 流水线中 Maven 总是超时或 OOM但本地正常ACI 环境的计算资源可能受限或缺少必要的 JVM 参数。检查清单CI 环境的 JVM 版本与本地是否一致java -version容器内存限制Docker 容器是否设置了-m 512m这样的限制Maven 缓存CI 中是否清除了.m2/repository导致每次都重新下载网络速度下载依赖是否超时快速修复在 CI 配置文件中如.github/workflows/build.yml或.gitlab-ci.yml# GitHub Actions 示例-name:Build with Mavenenv:MAVEN_OPTS:-Xmx2048m -XX:UseG1GCrun:mvn clean install-DskipTests# GitLab CI 示例build:script:-export MAVEN_OPTS-Xmx2048m-mvn clean install-DskipTestsQ4什么时候应该用 Build什么时候应该用 MavenA简单原则开发中优先用 Build快速反馈 Run调试提交代码前用 Maven完整校验接近 CI 环境本地验证 CI 流程用 Maven模拟真实构建生产部署只能用 MavenBuild 和 Run 都不是交付物总结Build、Maven、Run 三者各司其职用途工具配置来源何时用快速反馈Build.idea/compiler.xml开发编写代码时完整构建MavenMAVEN_OPTS提交前校验、CI/CD本地调试RunRun Configuration功能测试、单步调试掌握这三个黑箱的独立性你就能彻底避免本地能跑CI 却失败的尴尬。下次碰到 OOM 或编译失败记住从参数来源入手逐一排查——99% 的问题都能解决。