maven

32 阅读7分钟

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工具解压包安装目录【简介---通用位置】
  1. 在终端中,使用 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的设置路径保持一致 image.png

maven的使用

pom.xml 中的 groupIdartifactIdversion 和 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:父项目或聚合项目,它本身不产出代码包,只用于管理子模块。

依赖信息 的搜索

关键字搜索--- Compile Dependencies[能看到依赖的依赖]
  • idea插件安装maven-search
tools---maven-search---输入依赖关键字---复制

依赖传递性:依赖会自动带来新的依赖,

当你的项目 A 依赖于库 B,而库 B 又在其 pom.xml 中声明依赖于库 C,那么库 C 就会自动成为项目 A 的传递性依赖。pom.xml只需要添加B的gav坐标即可。

Maven 的默认依赖调解原则

  1. “最短路径优先”原则: 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 artifactConnection timed/refusedReceived fatal alert1. 网络连接不稳定或被阻断。 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 Unauthorized407 Proxy Authentication Required1. 访问私有仓库(如公司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 artifactMissing artifact X1. groupIdartifactIdversion 拼写错误。 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. 版本冲突与解析失败 构建成功,但运行时出现 NoClassDefFoundErrorNoSuchMethodError1. 依赖传递导致引入了多个版本,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 pathUser settings fileLocal 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