1. 还在手动下载jar包?先搞清楚Maven帮你省了什么
我先说一个最常见的场景:很多初学者第一次接触Spring的时候,被要求"导入框架",第一反应就是去网上搜索spring.jar、spring-core.jar、spring-beans.jar,然后挨个下载、挨个复制到项目里、挨个Add as Library。
这个流程在十年前还勉强能跑通,放到现在就真的走不通了,原因很简单:Spring 5.x之后拆分的模块太多了,你光是完整跑起来最基础的IoC容器,至少需要spring-core、spring-beans、spring-context、spring-aop、spring-expression这五个核心模块,而这五个模块又各自依赖第三方库,比如commons-logging、spring-jcl。我算过一笔账,一个最最简单的Spring项目,手动下载的jar包数量不会少于10个,而如果你用的是Spring Boot,那这个数字会膨胀到几十个。
更麻烦的是版本兼容。Spring 5.3用的javax命名空间,Spring 6.0换成jakarta命名空间,你手动下一个版本不匹配的jar塞进classpath,编译期可能一切正常,运行期给你抛个NoSuchMethodError或者ClassNotFoundException,排查起来极其痛苦。
1.1 手动管理依赖的痛点
手动管理依赖的核心痛点有三个:
第一是传递性依赖。你用到的库A本身又依赖库B和库C,这些间接依赖不会自己出现在你的文件夹里,你只能一个个手工补齐。Spring的很多问题恰恰出在传递依赖上,比如spring-context依赖spring-aop,spring-aop又依赖aspectjweaver,少一个就启动失败。
第二是版本冲突。同一个库的不同版本同时出现在classpath里,JVM加载类的时候遵循"先到先得"或者按classpath顺序加载的规则,一不小心就加载了错误的版本。手动管理jar包时,你根本不知道两个长得差不多的jar文件到底哪个生效。
第三是环境不一致。你本机能跑,换一台机器连jar包都不全;或者说你电脑上是这么一套jar,同事电脑上是另一套jar,最后联调的时候冒出一堆诡异的问题。
1.2 Maven的坐标系统与依赖传递
Maven解决这些问题的核心机制是"坐标系统"。每一个构件(jar包)在Maven仓库中都有唯一的三元组坐标:groupId、artifactId、version。groupId一般是组织名,比如org.springframework;artifactId是模块名,比如spring-context;version是版本号,比如5.3.30。三个坐标组合起来,就能唯一定位到一个jar包。
你在pom.xml里声明一个依赖之后,Maven会根据坐标从仓库下载jar包。关键是它的依赖传递机制——你引入spring-context,Maven会自动读取spring-context自己的pom文件,把它的所有依赖也一并拉取下来。我在前面提到的那些间接依赖,Maven帮你全部处理掉了。
而且Maven支持版本仲裁。当你依赖的多个库传递依赖了同一个库的不同版本,Maven会按照"路径最短优先、先声明优先"的原则,自动选出唯一一个版本,避免jar包冲突。这个机制不一定永远是对的,但至少它有明确的、可预测的规则,不像手动管理那样完全靠猜。
1.3 从依赖管理到构建生命周期
Maven能做的远不止依赖管理。你肯定听过Maven的"构建生命周期",它的核心指令是clean、validate、compile、test、package、verify、install、deploy这一串。每一条指令背后都是一整套标准化的构建步骤。
我举一个实际例子。之前我接手过一个小项目,代码没问题,但部署的时候运维每次都要手动执行编译、打jar、拷贝到服务器这一套固定流程,特别容易漏步骤。后来我加了个maven-assembly-plugin插件,把打包配置写死进pom.xml,运维只需要敲一行mvn clean package,所有事情都搞定了。这就是Maven相比手工操作的最大优势——把流程固化下来,让人不需要记忆,也不需要理解每一步细节。
对Spring项目来说,Maven还有一个隐藏的好处:它是Spring官方文档、Spring Initializr、Spring Boot这些工具链的底层基础设施。你哪怕今天还在纠结"怎么导入Spring",最终也逃不过要学Maven,不如从这一步就把它弄明白。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 开工前先配好环境:Maven安装与仓库镜像
这一步真的太多人卡住了,而且卡住的原因都不是技术难度,而是下载源太慢。Maven默认的中央仓库在国外,国内访问速度极慢,经常一个spring-context要下载十几分钟还失败。所以环境的配置核心就两件事:装好Maven本体,配好国内镜像源。
2.1 JDK版本与Maven版本怎么搭
先说版本匹配问题。不同版本的Maven对JDK版本有硬性要求,这个官网的文档里有完整的兼容性表格,我直接说结论:
Maven 3.6.x可以用JDK 8到JDK 11,Maven 3.8.x可以用JDK 8到JDK 17,Maven 3.9.x和4.x要求JDK 8以上但官方建议用JDK 17或更高。Spring这块更需要注意:如果你用的是Spring Framework 5.3.x,JDK 8-17都可以;如果用Spring Framework 6.0.x或Spring Boot 3.x,那么最低要求是JDK 17。
我在实际中见过最离谱的搭配是:JDK 8 + Maven 3.9.6 + Spring 6,结果Spring 6的class文件版本是61.0(也就是编译目标为JDK 17),JDK 8根本没法加载,报"UnsupportedClassVersionError",项目根本跑不起来。
所以建议的组合方式是这样:
- 低版本路线:JDK 8 + Maven 3.6.3或3.8.8 + Spring 5.3.x
- 中版本路线:JDK 11 + Maven 3.8.8 + Spring 5.3.x
- 高版本路线(推荐):JDK 17 + Maven 3.9.x + Spring Boot 3.x / Spring 6.x
如果你完全是个新手,我推荐直接从JDK 17 + Maven 3.9.x开始,因为Spring Boot 3.x已经全面转向JDK 17了,学新不学旧。但如果你所在的公司还在用老一套Spring 5的技术栈,那就老老实实用JDK 8。
2.2 settings.xml三件套:本地仓库、镜像、JDK编译级别
Maven的全局配置文件是settings.xml,位于Maven安装目录的conf目录下。个人用户建议把一份副本放到~/.m2/settings.xml,这样只影响当前用户,不影响别人。
最基本的配置有三块。
第一块是本地仓库路径。默认情况下,Maven会把所有下载的jar包放在~/.m2/repository目录下。这个路径可以改,比如改成`D:/
