maven
Maven是一个声明式的项目依赖管理和构建工具,用一句话概括:Maven让你通过描述项目(pom.xml),而不是写构建脚本,来自动化构建过程。
IDEA自带Maven(Bundled Maven)。当然也可以自己安装配置maven, 完全控制settings.xml,便于配置镜像、仓库等,团队协作、企业项目、需要特定Maven配置。
安装maven工具
https://maven.apache.org/download.cgi 下载bin.zip压缩包,解压。
配置maven
Mac 配置 JAVA_HOME 和 M2_HOME(通常称 MAVEN_HOME)环境变量,并让它们在终端(如 zsh)和 IntelliJ IDEA 中都生效,可以按照以下步骤操作
准备工作
查找 Java 安装路径 /usr/libexec/java_home [这个命令会输出你的 **Java 主目录**]
查找 Maven 安装路径 找到Maven工具解压包安装目录【简介---通用位置】
- 在终端中,使用
vim或nano编辑器打开~/.zshrc文件:
nano ~/.zshrc
2.将准备工作中找到的java + maven 安装路径 替换到 = 号后面
# 设置 JAVA_HOME
export JAVA_HOME=/Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home
# 设置 M2_HOME (或 MAVEN_HOME)
export M2_HOME=/Users/wmy/codes/idea/apache-maven-3.9.12
# 将 Maven 的 bin 目录添加到 PATH 环境变量
export PATH="$M2_HOME/bin:$PATH"
3.保存并退出编辑器
在 **nano** 中:按 `Control + X`,然后按 `Y` 确认保存,最后按 `Enter` 确认文件名
4.让配置立即生效。执行以下命令来重新加载 ~/.zshrc 文件:
source ~/.zshrc
5.验证配置。分别执行以下命令,如果正确输出版本号,说明配置成功:
mvn -v
6.修改安装好的maven目录下settings.xml
// maven/conf/settings.xml 修改依赖的本地位置 + 下载镜像 + jdk版本
<localRepository>/Users/wmy/codes/repo</localRepository>
<mirror>
<id>aliyunmaven</id>
<mirrorOf>central,jcenter,google,spring,spring-plugin,gradle-plugin</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
<profile>
<id>jdk-17</id> <!-- 为此Profile定义一个ID -->
<activation>
<!-- 激活条件:当检测到JDK版本为17时自动激活 -->
<jdk>17</jdk>
</activation>
<properties>
<!-- 设置Maven编译器的源代码和目标字节码版本 -->
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<!-- 显式指定编译器版本,确保兼容性 -->
<maven.compiler.compilerVersion>17</maven.compiler.compilerVersion>
</properties>
</profile>
7.在 IntelliJ IDEA 中配置路径
当前项目 设置---构建、执行、部署---构建工具---maven
新项目 文件---新建项目设置---为新项目设置
maven主路径 设置文件 要与maven安装位置一致
本地仓库 与步骤6的设置路径保持一致
maven的使用
pom.xml 中的 groupId、artifactId、version 和 packaging 是 Maven 坐标(GAV) 的核心元素,它们共同唯一标识了一个项目或依赖
// pom.xml
<!-- 项目依赖的坐标 (GAV) -->
<dependencies>
<dependency>
<!-- 依赖:Guava工具库 -->
<groupId>com.google.guava</groupId> <!-- 来自谷歌公司 -->
<artifactId>guava</artifactId> <!-- 项目叫Guava -->
<version>32.1.3-jre</version> <!-- 版本号 -->
<!-- 注意:依赖不指定packaging,默认就是jar -->
</dependency>
</dependencies>
packaging 决定了构建产出
jar(默认):Java 归档文件,用于普通库或可执行应用。war:Web 应用归档,用于部署到 Servlet 容器(如 Tomcat)。pom:父项目或聚合项目,它本身不产出代码包,只用于管理子模块。
依赖信息 的搜索
- maven中央仓库搜索 mvnrepository.com/
关键字搜索--- Compile Dependencies[能看到依赖的依赖]
- idea插件安装maven-search
tools---maven-search---输入依赖关键字---复制
依赖传递性:依赖会自动带来新的依赖,
当你的项目 A 依赖于库 B,而库 B 又在其 pom.xml 中声明依赖于库 C,那么库 C 就会自动成为项目 A 的传递性依赖。pom.xml只需要添加B的gav坐标即可。
Maven 的默认依赖调解原则
- “最短路径优先”原则: Maven 会选择依赖路径最短的那个版本。
A -> B -> C -> X(1.0) // 路径长度:3
A -> D -> X(2.0) // 路径长度:2 (胜出!)
X最终的版本 2.0
2.“最先声明优先”原则
如果两个依赖的路径长度完全一样,那么在 pom.xml 的 <dependencies> 中先声明的依赖,其传递进来的版本胜出。
依赖版本管理
- properties中定义 ${}取出
<!-- 1. 在 properties 中集中定义版本属性 -->
<properties>
<!-- 自定义的属性名,通常用“依赖名.version”的格式 -->
<spring.boot.version>3.2.5</spring.boot.version>
<mybatis.version>3.0.3</mybatis.version>
</properties>
<!-- 2. 在 version 中引用属性 -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring.boot.version}</version>
</dependency>
</dependencies>
-
父项目中定义依赖的gav,各个子模块依赖是 g+a+复用父定义的v父容器 pom.xml
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>3.2.5</version> </dependencies> </dependencyManagement> // 一起clean install 等 <modules> <module>maven-user</module> </modules>
各个子模块 pom.xml
// 父容器的gav信息
<parent>
<groupId>org.example</groupId>
<artifactId>maven-parent</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
// 子模块只需填入ga信息即可
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
maven依赖下载失败解决方案
| 场景 / 特征与报错关键词 | 可能原因 | 解决方案 (从最常用到备用) |
|---|---|---|
1. 网络与传输问题 Could not transfer artifact, Connection timed/refused, Received fatal alert | 1. 网络连接不稳定或被阻断。 2. 镜像仓库(如阿里云)配置错误或暂时不可用。 3. 代理设置不正确。 4. 使用了不安全的HTTP仓库,而JDK版本默认禁止。 | 第一步(必做):删除锁定文件 find ~/.m2/repository -name "*.lastUpdated" -delete 第二步:检查与修复网络配置 1. 检查镜像:确认 ~/.m2/settings.xml 中的 <mirror> 配置正确(如阿里云https://maven.aliyun.com/repository/public)。 2. 临时关闭镜像:注释掉 <mirror> 配置,测试连接中央仓库。 3. 检查代理:如果使用代理,确保在 settings.xml 或系统环境中正确配置。 4. JDK安全限制:对于HTTP仓库,在 JAVA_OPTS 中添加:-Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true 第三步:强制更新 mvn clean compile -U -Dmaven.test.skip=true |
2. 认证与权限问题 401 Unauthorized, 407 Proxy Authentication Required | 1. 访问私有仓库(如公司Nexus)未配置用户名/密码。 2. 代理服务器需要认证。 | 配置认证信息 在 ~/.m2/settings.xml 的 <servers> 段中添加: xml<br><server><br> <id>仓库或代理的ID</id><br> <username>你的用户名</username><br> <password>你的密码</password><br></server><br> 注意:<id> 必须与 pom.xml 或代理配置中的ID完全一致。 |
3. 依赖坐标不存在 Could not find artifact, Missing artifact X | 1. groupId, artifactId, version 拼写错误。 2. 指定的版本在仓库中确实不存在。 3. 依赖的 packaging 类型非标准(如 pom)。 | 第一步:核对坐标 1. 访问 Maven Central 或你的私有仓库Web界面,搜索并确认依赖坐标存在。 2. 特别检查 version 是否可用(例如,你之前遇到的 4.0.1 就不存在)。 第二步:检查传递依赖 使用 mvn dependency:tree 查看是哪个依赖传递引入了这个找不到的构件。 |
| 4. 本地仓库文件损坏/锁定 无明确网络错误,但项目持续报“找不到类”;或依赖无法更新。 | 1. 上次下载因故中断,导致JAR包不完整。 2. 残留 .lastUpdated 文件,Maven认为该依赖处于“正在更新”状态,跳过下载。 | 第一步:强力清理(最有效) 1. 删除锁定文件:find ~/.m2/repository -name "*.lastUpdated" -delete 2. 删除整个问题依赖目录: rm -rf ~/.m2/repository/路径/对应目录 例如:rm -rf ~/.m2/repository/org/springframework/spring-core/ 第二步:重新下载 执行 mvn clean compile 重新拉取完整依赖。 |
5. 版本冲突与解析失败 构建成功,但运行时出现 NoClassDefFoundError, NoSuchMethodError。 | 1. 依赖传递导致引入了多个版本,Maven调解后选定的版本与实际运行所需不兼容。 2. 父子项目版本管理不一致。 | 第一步:分析依赖树 mvn dependency:tree -Dincludes=有问题的依赖groupId:artifactId 第二步:统一版本管理 1. 在顶层POM的 <dependencyManagement> 中强制指定版本。 2. 在 <properties> 中定义版本属性。 第三步:排除冲突传递依赖 xml<br><exclusions><br> <exclusion><br> <groupId>冲突组</groupId><br> <artifactId>冲突构件</artifactId><br> </exclusion><br></exclusions><br> |
6. IDE(IntelliJ IDEA)特有问题 IDEA中依赖飘红,但命令行 mvn 命令正常。 | 1. IDEA的Maven配置未使用正确的 settings.xml。 2. IDEA缓存或索引损坏。 3. 项目JDK配置与Maven不匹配。 | 第一步:重置IDEA配置 1. 检查配置:File -> Settings -> Build Tools -> Maven,确认 Maven home path, User settings file, Local repository 三项正确。 2. 重新导入:右键点击 pom.xml -> Maven -> Reload project。 3. 清理缓存:File -> Invalidate Caches... -> Invalidate and Restart。 第二步:检查项目结构 File -> Project Structure,确认 Project SDK 和 Modules 的语言级别与 pom.xml 中配置的JDK版本一致。 |
maven下载依赖的流程
先从本地设置的仓库中找,找不到再去设置的镜像远程仓库下载。若本地仓库依赖存在,但被污染,将会导致不去远程仓库下载,所以此时需要先删除本地对应依赖目录的lastUpdated文件。
maven的周期
mvn clean:清理编译或打包后的项目结构,删除target文件夹mvn compile:编译项目 生成target文件夹mvn package:打包项目 生成war/jar包mvn install:打包后上传包到本地仓库【将本项目的包移动到maven/conf/settings.xml设置的本地仓库,方便本地其他项目可以引用此依赖】mvn deploy:打包后,上传到maven私服仓库【公司级别使用】 最佳使用
打包 mvn clean package
编译 mvn clean package
部署 mvn clean install/deploy