
Maven 这个名字我猜你在 Java 项目里已经见过无数次了。它不是一个框架也不是一门语言而是 Java 生态里最常用的项目构建和依赖管理工具。如果你刚接手一个 Java 项目或者第一次在自己电脑上配开发环境Maven 大概率是你躲不开的一道坎。今天这篇东西我不会只贴一段“下载解压配环境变量”的流水账而是把 Maven 是什么、为什么需要它、安装配置时每一步背后的原理以及我实际踩过的坑一次性聊透。适合看这篇内容的人很明确准备从 IDE 自建项目切换到真正工程化项目的同学以及配置总出问题、想彻底搞明白 settings.xml 和 IDEA 之间关系的人。看完之后你不仅能完成 Win / macOS / Linux 上的 Maven 安装还能独立解决依赖下载失败、IDEA 爆红、Oracle 驱动缺失这类常见问题。1. 先搞清楚 Maven 到底在解决什么问题1.1 没有 Maven 的时候Java 项目有多痛苦很多新手没有经历过“没有 Maven”的时代所以不太理解它的价值。我简单描述一下一个稍微正式点的 Java Web 项目要用 Spring、MyBatis、Log4j、Jackson 这些第三方库。没有 Maven 的时候你得先去各个官网把 jar 包下载下来手动复制进WEB-INF/lib还要自己盯着版本号。比如 Spring 和 Jackson 之间版本不兼容你根本不知道是哪个 jar 的问题。项目换一台电脑所有 jar 包重来一遍靠 U 盘拷贝或者网盘分享版本乱得离谱。更别提打包了没有统一生命周期今天用脚本打 zip明天用 IDE 导出 war团队里每个人产出的包都不一样。Maven 解决的就是这件事它给你一套统一的目录结构、一套依赖坐标体系、一条标准化的构建链路。你只需要在配置文件里声明“我要用哪个库的哪个版本”Maven 会自己下载、缓存、管理依赖传递并在target目录里产出最终可运行的构建结果。1.2 Maven 的核心概念坐标、仓库、生命周期要理解 Maven先记三个词坐标、仓库、生命周期。坐标就是依赖的唯一标识。一个 jar 包对应一个三元组groupId公司域名倒写比如com.google.code.gson、artifactId项目名比如gson、version版本号比如2.10.1。只要给出这三个值Maven 就能在全球唯一的仓库里定位到这个 jar。你在pom.xml里写的dependency其实就是一组坐标。仓库是存放 jar 包的地方。Maven 找依赖的顺序是本地仓库默认~/.m2/repository→ 中央仓库Maven Central→ 你配置的私服或镜像。本地仓库可以理解成电脑里的缓存第一次从远程下载之后构建优先用本地文件所以离线时项目如果依赖都已缓存也能正常编译。生命周期是 Maven 的构建流程核心三段clean清理、default编译打包、site文档站点。default生命周期里包含很多阶段按顺序是validate、compile、test、package、verify、install、deploy。你执行mvn package它会自动把前面的compile、test都跑一遍不是只执行你写的那一个动作。1.3 为什么几乎所有 Java 项目都选 Maven现在提到构建工具其实还有一个名字绕不开Gradle。很多人纠结选 Maven 还是 Gradle我直接给结论传统 Java 项目、企业存量系统、大部分教学文档都围绕 Maven新项目、Android 开发、追求极致构建速度时Gradle 优势更明显。二者核心差异是Maven 基于固定生命周期的约定优于配置pom.xml 结构稳定学习成本低生态历史最久Gradle 基于 Groovy/Kotlin DSL构建脚本更灵活增量构建性能更好但配置自由度高反而更容易被团队写得千奇百怪。我的建议是你是新手第一套工具选 Maven先掌握构建流程的通用逻辑以后换 Gradle 也不会太痛苦。Maven 的插件数量、文档数量在 Java 领域仍然是最全的遇到问题最容易搜到答案。对比项MavenGradle配置文件pom.xmlXMLbuild.gradleGroovy/Kotlin构建模型固定生命周期、阶段绑定任务依赖图更灵活学习曲线较低较高扩展性插件机制成熟脚本能力强自定义容易性能一般增量构建通常更快适用场景传统企业项目、通用 JavaAndroid、多模块大型新项目2. 安装之前必须想明白的几件事2.1 JDK 版本要和 Maven 版本匹配很多人的第一个坑是下载了最新的 Maven结果本机 JDK 太老运行时报UnsupportedClassVersionError。Maven 本身是一个 Java 程序运行它必须依赖 JDK。不同 Maven 版本对 JDK 的最低要求不一样。常见匹配关系我列在下面Maven 版本最低 JDK 版本推荐组合Maven 3.6.3JDK 1.7JDK 8 / JDK 11 项目常用Maven 3.8.xJDK 1.7JDK 8 / JDK 11 项目常用Maven 3.9.xJDK 8新项目建议 JDK 8 / 11 / 17Maven 4.xJDK 17需要较新 JDK 时才用如果你们的项目还在用 JDK 8我建议选 Maven 3.6.3 或 3.8.x。不是越高越好高版本 Maven 在部分老插件上可能有兼容性问题。当然如果你机器上只有 JDK 17那直接用 Maven 3.9 以上更好。安装前先执行java -version确认 JDK 版本再决定下载哪个 Maven 版本这一步能省掉后面很多报错。2.2 下载哪个发行版官网入口怎么找Maven 的官方下载入口是 Apache 官网的 Maven 项目页面一般进maven.apache.org后点Download就能看到。官方提供两种包Binary tar.gz archive和Binary zip archiveWindows 选 zipmacOS / Linux 选 tar.gz。注意别手滑下载Source tar.gz那是源码包需要你自己编译没有任何理由选它。还有一个小建议官网下载速度不稳定的地区可以从阿里云镜像站下载同样版本的二进制包版本号和校验值都一致速度快很多。国内很多教程推荐这种方式核心思路是“下载二进制发行包不是源码”。2.3 安装包还是压缩包本地仓库默认位置要改吗Maven 有安装包形式但绝大多数场景下你只需要解压二进制压缩包然后配置环境变量。安装包做的也只是帮你解压和设置变量手工操作会更清楚每一步在哪里出问题也好排查。关于本地仓库Maven 默认存在你的用户目录下Windows 是C:\Users\你的用户名\.m2\repositorymacOS / Linux 是~/.m2/repository。默认位置最大的问题是 C 盘空间会被各种依赖逐步吃满。一个稍微大点的项目第一次完整构建可能下载几百 MB 到 1GB 以上的依赖。所以我的习惯是在安装 Maven 之后就立刻把本地仓库改到独立分区比如 Windows 的D:\mvn_repoLinux 的/data/mvn_repo。后面会详细说怎么改。2.4 相关工具链检查安装 Maven 之前顺手确认一下本机是否具备完整的 Java 开发环境JDK 安装了没有、JAVA_HOME环境变量配置了没有、java和javac命令能不能在命令行直接执行。Maven 安装完以后会用到java命令如果JAVA_HOME没配好大概率会出现“mvn 不是内部或外部命令”之外的诡异报错比如Error: JAVA_HOME is not defined correctly。3. Windows、macOS、Linux 三平台安装与配置实操3.1 Windows 11 安装与环境变量配置Windows 11 上的 Maven 安装本质上就三步解压、配环境变量、验证。第一步把下载好的apache-maven-3.8.8-bin.zip解压到一个路径中没有中文和空格的目录例如D:\dev\apache-maven-3.8.8。为什么强调这点因为某些老版本工具对中文路径支持不友好依赖下载和编译时容易出现编码或找不到文件的问题。保险起见开发工具全家桶都放纯英文路径。第二步配置环境变量。右键“此电脑” → 属性 → 高级系统设置 → 环境变量在系统变量里新建一个MAVEN_HOME值填D:\dev\apache-maven-3.8.8。然后在Path变量中新增一行%MAVEN_HOME%\bin。添加bin到Path是让系统能在命令行直接找到mvn可执行文件。第三步打开一个全新的命令行窗口执行mvn -v。看到类似下面输出就说明成功了Apache Maven 3.8.8 (4c87b05c9a8b3f9a4e1b2f2d0c1c8b6e7f7a1a2e) Maven home: D:\dev\apache-maven-3.8.8 Java version: 1.8.0_333, vendor: Oracle Corporation Java home: D:\dev\Java\jdk1.8.0_333 Default locale: zh_CN, platform encoding: UTF-8 OS name: windows 11, version: 10.0, arch: amd64, family: windows这里的Maven home和Java home两行很关键。如果 Java home 指向不对说明 JAVA_HOME 配置有问题需要回去检查。3.2 macOS 安装与配置macOS 上有两种常见方式。第一种最简单用 Homebrew 安装。命令是brew install maven装完以后mvn -v直接就能用因为 Homebrew 会自动处理 PATH。如果你想知道 Maven 装到哪里了可以用brew --prefix maven查看。一般来说是在/opt/homebrew/opt/mavenApple Silicon或/usr/local/opt/mavenIntel。第二种是手动安装适合需要固定某个版本的情况。下载 tar.gz 包以后打开终端执行sudo mkdir -p /opt/maven sudo tar -xzf apache-maven-3.9.6-bin.tar.gz -C /opt/maven然后把 Maven 的 bin 目录加入当前用户的 PATH。macOS 新版默认 shell 是 zsh编辑~/.zshrc在末尾加两行export M2_HOME/opt/maven/apache-maven-3.9.6 export PATH$M2_HOME/bin:$PATH保存后执行source ~/.zshrc让配置立即生效。再说一个细节为什么这里用M2_HOME而不是MAVEN_HOME其实两个都能用但M2_HOME是 Maven 3 早期文档里的惯例很多插件也会读取它。为了避免某些老插件找不到 Maven我习惯在 Linux/macOS 上同时设置MAVEN_HOME和M2_HOME指向同一个目录。3.3 Linux 离线安装场景Linux 服务器上安装 Maven如果内网不能访问外网就需要离线安装。过程也不复杂。把apache-maven-3.8.8-bin.tar.gz上传到服务器比如/opt/目录下。然后执行cd /opt tar -xzf apache-maven-3.8.8-bin.tar.gz mv apache-maven-3.8.8 maven接着修改/etc/profile在文件末尾追加export MAVEN_HOME/opt/maven export M2_HOME/opt/maven export PATH$MAVEN_HOME/bin:$PATH执行source /etc/profile刷新然后mvn -v验证。如果服务器只对当前用户开放那就把变量写进~/.bashrc效果一样。离线安装的重点是准备依赖包第一次构建时如果没有本地仓库缓存依然会卡在下载阶段。所以离线环境一般会配合私服 Nexus或者直接拷贝一个已经下载过依赖的repository目录到服务器上。3.4 环境变量配置的核心原理与验证方法很多人配置环境变量总是记不住步骤其实只要理解原理就不会错。操作系统在执行mvn命令时会去PATH环境变量列出的目录里逐个查找名为mvnWindows 上是mvn.cmd的可执行文件。Maven 的bin目录里恰好就是启动脚本所以把bin目录加进PATH命令就能被找到。MAVEN_HOME或M2_HOME又是干什么的呢mvn启动脚本内部会读取这个变量来定位 Maven 安装目录然后找到lib目录下的核心 jar 包。更稳妥的做法是同时确认两个变量指向同一个 Maven 根目录因为某些第三方 IDE 或插件只认其中一个。验证时如果mvn命令找不到优先检查三件事环境变量有没有写对、写好之后有没有新开终端、Windows 上Path里用的是不是%MAVEN_HOME%\bin而不是写死的路径。写死后患无穷换版本就要改Path。4. 设置你的 Maven 中央仓库镜像阿里云与多镜像配置4.1 为什么要换镜像源Maven 中央仓库在国外国内直连时下载依赖经常只有几十 KB/s甚至直接超时。这不是 Maven 本身的问题是网络链路问题。解决办法是配置镜像仓库把默认的下载地址替换成国内访问更快的仓库。最常用的就是阿里云仓库它有多个子仓库比如public、central、spring、google等一个public聚合了绝大多数依赖。在settings.xml里配置镜像本质上就是告诉 Maven当需要去某个仓库下载时先拦截请求换成我指定的地址。镜像不改变依赖坐标只改变下载源。4.2 settings.xml 的核心配置settings.xml是 Maven 的全局配置文件位置在 Maven 安装目录的conf子目录下这是全局配置对本机所有用户生效。另外一份在用户目录的~/.m2/settings.xml这是用户级配置优先级更高。一般建议在用户级目录下创建settings.xml因为升级 Maven 版本时不会覆盖换电脑也方便复制。基础配置示例settings localRepositoryD:/mvn_repo/localRepository mirrors mirror idaliyunmaven/id namealiyun public repository/name urlhttps://maven.aliyun.com/repository/public/url mirrorOfcentral/mirrorOf /mirror /mirrors /settingslocalRepository是本地仓库位置mirrors里配置镜像仓库。注意mirrorOf的值central表示只拦截中央仓库的请求。这样写比较保守其他特殊仓库不会受影响。4.3 多镜像切换与 mirrorOf 规则实际项目中只配一个阿里云镜像通常够了。但有些团队内部会有私服或者某些依赖只存在于特定镜像里这时就需要多镜像。Maven 的mirrors列表会按顺序匹配如果第一个镜像没有对应依赖它不会自动去找第二个镜像而是直接报错。所以多镜像配置时要有明确的分工。常见做法是利用mirrorOf的不同取值做分流mirrors mirror idaliyun-public/id namealiyun public/name urlhttps://maven.aliyun.com/repository/public/url mirrorOf*,!internal.repo/mirrorOf /mirror mirror idinternal-repo/id nameInternal Nexus/name urlhttp://192.168.1.100:8081/repository/maven-public//url mirrorOfinternal.repo/mirrorOf /mirror /mirrors这里*,!internal.repo的含义是“匹配所有仓库但排除 id 为internal.repo的仓库”。如果某个依赖坐标声明时明确使用internal.repo作为仓库 idMaven 就会走第二个镜像。还有external:*的写法意思是仅匹配非本机地址的仓库适合只希望远程下载走镜像、本地文件仓库不拦的情况。注意mirrorOf写得越精确越安全。新手最容易犯的错是配了mirrorOf*/mirrorOf导致所有仓库请求都指向阿里云。如果公司私服里有内部 jar这种配置会让内部依赖找不到。4.4 本地仓库路径修改本地仓库路径修改也是settings.xml里的localRepository。很多教程把它放在配置镜像前顺手就改了我建议单独确认一下。Windows 上我一般写在D:\mvn_repomacOS/Linux 写道/data/mvn_repo。路径不能有中文否则部分插件会报编码问题。改完本地仓库位置记得把原来C:\Users\xxx\.m2\repository或~/.m2/repository目录中已经下载过的依赖直接复制到新目录能省去重新下载的时间。复制完以后打开命令行执行mvn help:effective-settings可以看到 Maven 实际生效的仓库地址这个方法比猜配置文件管用得多。5. 在 IDEA 里配置并使用 Maven5.1 IDEA 默认 Maven 与自选 Maven 的区别IDEA 自带一个捆绑版的 Maven开箱即用不需要安装。但我不建议长期依赖它原因有三第一捆绑版本通常跟上 IDEA 版本你自己的项目可能在别的机器上用不同版本容易出现“本地能编译别人电脑报错”第二捆绑 Maven 的settings.xml默认是 IDEA 自己生成的不容易管理镜像和本地仓库第三版本不可控。正确做法是在 IDEA 的设置里把 Maven home path 切到你手动安装的那个 Maven。路径入口为Settings → Build, Execution, Deployment → Build Tools → Maven。在这里能看到三个关键配置Maven home path、User settings file、Local repository。User settings file默认读取~/.m2/settings.xml但 IDEA 有时候显示的是Override状态你需要勾选并手动选择配置文件。我建议把这三个地方都配成显式值即自己指定 Maven 路径、settings.xml 路径、本地仓库路径这样项目换电脑后配置可复制。5.2 在 IDEA 中新建 Maven 项目archetype 选择IDEA 里新建 Maven 项目时最常见的方式是选New Project → Maven Archetype。Archetype 是 Maven 的项目模板。对普通 Java 项目通常选maven-archetype-quickstart对 Web 项目选maven-archetype-webapp。快捷创建的部分不需要死记。实际操作里你可以直接不选 Archetype新建一个空 Maven 项目再手动补src/main/java等目录结构。Archetype 的价值只是给你生成骨架真正核心的pom.xml还是自己维护更清楚。pom.xml生成后里面至少要有groupId、artifactId、version。再添加依赖时IDE 会让你选择版本。这一步如果依赖列表刷不出来大概率是前面的镜像源没有配好需要先解决第 4 节的内容。5.3 IDEA 中依赖爆红的排查“IDEA 依赖爆红”是出现频率最高的问题。依赖爆红就是pom.xml里某个dependency下面出现红色波浪线常见原因是 Maven 没有成功下载这个 jar 包或下载后的 jar 包损坏。排查顺序我先固定下来第一步看右侧 Maven 窗口展开对应模块如果有小图标报错点开看具体报错信息。第二步执行mvn -U clean compile强制更新快照并重新编译-U的意思是更新远程快照和插件。第三步检查settings.xml的镜像配置很多爆红都源于阿里云 mirrorOf 写错或私服无法访问。第四步在 IDEA 里点击Reload All Maven Projects按钮让 IDEA 重新解析依赖。如果还是爆红可以删除项目本地.idea目录和target目录重新打开项目。这个操作能解决 IDEA 索引错乱导致的问题代价是重新导入项目需要一点时间。5.4 设置默认 Maven 配置避免新建项目重复配置每次新建项目都要重新配置 Maven 路径太麻烦。IDEA 提供了一个“默认配置”入口在新版中叫Settings → Build, Execution, Deployment → Build Tools → Maven → Runner但真正控制新项目的是File → New Projects Setup → Settings for New Projects。在这个界面里把 Maven home path、User settings file、Local repository 全部配好。以后每次新建项目IDEA 都会自动用这套配置。我强烈建议把Runner → VM Options里加上-Xmx1024m之类的 JVM 内存参数防止大项目构建时 OOM。6. 常用命令与依赖管理实操6.1 mvn clean install 到底做了什么很多开发每天敲mvn clean install却不清楚它到底执行了什么。clean是独立生命周期作用是删除target目录install属于 default 生命周期的一个阶段阶段靠后执行它之前会依次完成编译、测试、打包。所以mvn clean install的完整含义是清理旧产物然后重新编译、运行测试、打包并把生成好的 jar/war 安装到本地仓库。这个命令在实际开发中的价值是同一个机器上的多个项目之间可以通过本地仓库传递依赖。比如你有common-utils和business-app两个项目business-app依赖common-utils在common-utils目录执行mvn clean install后business-app的依赖解析就能从本地仓库找到最新版本而不用每次发布到远程仓库。6.2 依赖坐标查找与版本管理需要某个第三方库时最常用的是去mvnrepository.com搜索坐标。比如 JSON 解析库 Gson搜索后能看到dependency groupIdcom.google.code.gson/groupId artifactIdgson/artifactId version2.10.1/version /dependency我建议养成一个习惯优先从 Maven 中央仓库网站复制坐标不要凭记忆写版本号。版本管理有几个原则项目里统一使用一个 BOM比如 Spring Boot 的spring-boot-dependencies或dependencyManagement来集中管理版本不要每个模块各定各的版本升级依赖时关注括号中的兼容性说明。6.3 依赖冲突和排除依赖传输机制让 Maven 能自动引入间接依赖但也带来了冲突问题。比如项目里直接引入 A 库A 又依赖了 B 库 1.0另一个 C 库依赖 B 库 2.0。到底用 B 的哪个版本Maven 默认采用“最短路径优先”和“最先声明优先”的仲裁规则。规则能解决大部分情况但偶尔还是需要手动排除。查看依赖树是一个标准动作mvn dependency:tree mvn dependency:tree -Dverbose如果确定某个间接依赖版本有问题可以在声明直接依赖时排除它dependency groupIdcom.example/groupId artifactIddemo-client/artifactId version1.0.0/version exclusions exclusion groupIdcom.example/groupId artifactIdold-lib/artifactId /exclusion /exclusions /dependency6.4 把 Jar 包安装到本地仓库或上传远程仓库有些 jar 包没法从中央仓库下载比如商业 SDK、公司内部库、Oracle JDBC 驱动。这时候可以用 install 命令手动安装到本地仓库mvn install:install-file -Dfileojdbc8.jar -DgroupIdcom.oracle.database.jdbc -DartifactIdojdbc8 -Dversion19.8.0.0 -Dpackagingjar上传到公司远程仓库一般用mvn deploy前提是在pom.xml中配置了distributionManagement里的 repository 地址并且settings.xml里配置了对应的账号密码。这里不展开细说核心记住一点install只进本地deploy才上远程。7. 常见问题与排查技巧实录7.1 JAVA_HOME 相关问题最典型的报错是Error: JAVA_HOME is not defined correctly. We cannot execute /path/to/jdk出现这个报错说明JAVA_HOME环境变量没有被 Maven 启动脚本读到或者指向的 JDK 目录不对。Windows 上尤其要注意JAVA_HOME的值应该到 JDK 根目录比如D:\dev\Java\jdk1.8.0_333不要带\bin。macOS/Linux 上如果是通过 Homebrew 装的 OpenJDK路径在/Library/Java/JavaVirtualMachines/...或者使用/usr/libexec/java_home动态获取。我的排查路径是先看echo $JAVA_HOME有没有值再看java -version是否正常最后确认mvn -v里显示的 Java home 是否正确。三者对照基本能定位是哪个环节写错了。7.2 镜像源导致下载失败下载依赖时报Transfer failed、Could not transfer artifact、Connection timed out很多时候不是中央仓库挂了而是镜像源不给力。如果你配了多个镜像可以临时把settings.xml里的 mirror 注释掉直接用中央仓库试一次速度虽然慢但能定位是不是镜像本身的问题。还有一类情况是公司内网只能访问私服外网镜像全部不通。此时需要把镜像配置成公司私服地址并把私服依赖的认证信息写进settings.xml的servers节点。记住mirror负责转发server负责认证两个配置要配套。7.3 OutOfMemoryError 构建报错构建大项目时出现java.lang.OutOfMemoryError: Java heap space核心原因是 Maven 运行 JVM 的内存不够。默认MAVEN_OPTS为空JVM 大多使用默认堆上限。解决办法是给 Maven 设置一个较大的 JVM 内存参数。Windows 上设置系统环境变量MAVEN_OPTSMAVEN_OPTS-Xms512m -Xmx1024mmacOS / Linux 上在~/.bashrc或~/.zshrc里追加export MAVEN_OPTS-Xms512m -Xmx2048mIDEA 里使用 Maven 时还可以在Maven Runner → VM Options里单独设置。这里要说明加内存并不能解决所有 OOM有时是依赖解析时元数据过大插件版本过老也会导致优先升级 Maven 插件版本更稳妥。7.4 缺少 Oracle 驱动等特殊依赖有个场景很经典项目要连 Oracle 数据库在pom.xml里写com.oracle.ojdbc:ojdbc8但依赖爆红。原因是 Oracle JDBC 驱动因为许可证原因没有完全上传到中央仓库很多旧版本坐标无法直接下载。解决方案就是第 6.4 节里的手动 install 方式。先从 Oracle 官网下载 ojdbc jar然后安装到本地仓库再在pom.xml里引用对应坐标。如果团队共用则应该把 jar 部署到公司私服。这样其他同事不用各自手动装 jar项目里加依赖坐标就能直接解析。7.5 快速速查表场景推荐命令/操作安装后验证mvn -v编译项目mvn compile跳过测试打包mvn package -DskipTests构建并安装到本地仓库mvn clean install查看依赖树mvn dependency:tree强制更新快照mvn -U clean compile手动安装第三方 jarmvn install:install-file -Dfilexxx.jar -DgroupId... -DartifactId... -Dversion...全局配置位置Maven安装目录/conf/settings.xml用户配置位置~/.m2/settings.xml中央仓库检索mvnrepository.com最后分享一个我个人的习惯拿到一台新电脑我会先把 JDK 装好再下载一个固定版本的 Maven配好MAVEN_HOME和用户级settings.xml然后设置阿里云镜像和独立本地仓库路径最后在 IDEA 里把默认 Maven 指向同一份配置。这套流程走完后面所有 Java 项目都不会再被基础环境卡住。Maven 安装配置这件事真没有什么高深技巧核心就是把每个配置项为什么存在弄明白遇到问题按命令行、配置、IDE 三层的顺序排查基本都能迎刃而解。