一、Maven的诞生

以往的开发场景每个项目都有自己独特的构建脚本,依赖管理完全依赖手动下载JAR包,团队成员之间的项目结构千差万别,好比每个厨师都用自己的方式组织厨房,导致换个厨师就找不到调料在哪里。

Maven(意为"知识的积累者")在2004年由Apache软件基金会推出,它不仅仅是一个构建工具,更是一种项目管理哲学。Maven的核心理念是约定优于配置(Convention over Configuration),虽然限制了一些自由度,但极大地提升了整体效率和可维护性。

Maven解决了哪些问题?

传统构建方式的问题 Maven的解决方案 实际影响
依赖管理混乱,JAR包到处散落 中央仓库+坐标系统 依赖自动下载,版本冲突可追溯
构建脚本各异,学习成本高 标准化生命周期 新项目5分钟上手,无需学习新脚本
项目结构不统一 标准目录结构 团队协作零障碍,IDE自动识别
多模块项目管理困难 继承与聚合机制 大型项目统一管理,版本一致性保证
构建过程不透明 插件化架构 每个步骤可见可控,易于扩展

二、Maven的特点

2.1 约定优于配置

Maven最革命性的特点就是它的标准化项目结构。这不是简单的文件夹规范,而是一种思维方式的转变。

下面是Maven项目的大致结构:

project-root/
├── src/
│   ├── main/
│   │   ├── java/          # 主代码源文件
│   │   ├── resources/     # 配置文件、静态资源
│   │   └── webapp/        # Web应用资源(如果是Web项目)
│   └── test/
│       ├── java/          # 测试代码
│       └── resources/     # 测试资源
├── target/                # 编译输出目录(自动生成)
└── pom.xml                # 项目对象模型配置文件

这使得开发者无需阅读文档就能理解项目结构,IDE也能自动识别并提供智能支持,为开发提供了极大的便利!

2.2 依赖管理

Maven使用 Project Object Model(项目对象模型)(本质是项目里的pom.xml完整 XML 文件,Maven 项目的总控入口)中的GAV坐标系统来唯一标识每个依赖:

坐标元素 含义 示例 类比理解
GroupId 组织/公司的唯一标识 com.alibaba 国家/省份
ArtifactId 项目/模块名称 fastjson 城市/街道
Version 版本号 2.0.32 门牌号

举例添加一个 GAV:

<dependency>
    <groupId>com.alibaba</groupId> //组织名称(通常为域名反写)
    <artifactId>fastjson</artifactId> //模块名称
    <version>2.0.32</version> //版本号(通常为release正式发布版本以及snapshot测试不稳定版本)
</dependency>

-- Maven 会自动:
-- 从中央仓库(或配置的私有仓库)下载 fastjson-2.0.32.jar
-- 解决并下载该版本 fastjson 内部依赖的其他库(传递依赖)
-- 将所有依赖统一管理在本地仓库(.m2 目录),避免项目中堆积 JAR 文件

依赖传递性是Maven的另一个精妙设计。当你引入Spring框架时,它所依赖的commons-logging等库会自动被引入,形成一个依赖树。当你不需要某个依赖时,需要排除依赖:

<!--    配置依赖-->
<dependencies>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>6.2.16</version>

<!--            排除依赖-->
    <exclusions>
      <exclusion>
        <groupId>io.micrometer</groupId>
        <artifactId>micrometer-observation</artifactId>
      </exclusion>
    </exclusions>
  </dependency>
</dependencies>

2.3 生命周期

其定义了一套标准化的项目构建全流程,统一了Java项目的清理、编译、测试、打包、安装、部署等操作的执行规范。下面是Maven的常用阶段:

阶段 核心作用
clean 清理阶段,移除上一次项目构建生成的文件(默认是项目的target目录),避免旧文件干扰新的构建过程
validate 验证阶段,校验项目结构是否正确、构建所需的必要信息是否完整,是构建流程的前置校验
compile 编译阶段,将项目src/main/java下的Java源代码编译为.class字节码文件,输出到target/classes目录
test 测试阶段,执行src/test/java下的单元测试代码(常用JUnit框架),执行前会自动触发compile阶段,保证测试的是最新代码
package 打包阶段,将编译后的代码,按照pom.xml配置的打包类型(jar、war等),打成对应的安装包,输出到target目录
verify 验证阶段,对打包结果进行校验,确保包文件有效、符合质量标准
install 安装阶段,将打包好的项目安装到本地Maven仓库,供本地其他Maven项目直接作为依赖引用
site 站点阶段,自动生成项目的站点文档(包含项目信息、测试报告、依赖分析报告等)
deploy 部署阶段,将打包好的项目上传到远程私服/中央仓库,供团队内其他开发者、线上环境引用

在同一套生命周期中,执行后面的阶段时,它前面的所有阶段都会按顺序自动执行。点击执行install时,Maven会按顺序自动执行 validatecompiletestpackageverifyinstall,执行package时,会自动先执行编译、测试等前置环节,保证打包的是最新、且测试通过的代码。


Maven有三套相互独立的生命周期:

  1. clean生命周期:负责项目清理,核心是clean阶段
  2. default生命周期:负责项目核心构建,是validatedeploy的核心流程
  3. site生命周期:负责项目站点文档生成,核心是site阶段

2.4 仓库机制

Maven的仓库系统采用三级缓存架构,这种设计在性能和灵活性之间达到了完美平衡:

本地仓库(Local Repository)
    ↓ 如果未找到
私服/镜像仓库(Private/Mirror Repository)
    ↓ 如果未找到
中央仓库(Central Repository)
仓库类型 位置 作用 访问速度
本地仓库 ~/.m2/repository 本机缓存,避免重复下载 极快(本地磁盘)
私服仓库 公司内网 企业内部共享,加速+安全控制 快(局域网)
中央仓库 Maven Central 全球公共依赖库 较慢(互联网)
  • 首先会查找本地仓库,若存在所需 jar 包直接使用;
  • 若本地仓库没有,则从私服中查找,若存在所需 jar 包,下载到本地仓库使用;
  • 若私服没有,则从中央仓库中下载到私服,再从私服下载到本地仓库

三、Maven下载与安装

3.1 JDK检查

Maven是用Java编写的,因此需要先安装JDK。

检查JDK安装

java -version

你应该看到类似输出:

在这里插入图片描述

如果没有安装JDK,请先前往Oracle官网或使用OpenJDK。

3.2 下载Maven

访问Maven官方网站:https://maven.apache.org/download.cgi

你会看到多个下载选项:

文件类型 适用系统 说明
apache-maven-x.x.x-bin.zip Windows 二进制发行版,包含可执行文件
apache-maven-x.x.x-bin.tar.gz Linux/Mac 二进制发行版,Unix格式压缩
apache-maven-x.x.x-src.zip 所有系统 源代码版本,用于学习或自定义编译

推荐下载:选择最新稳定版的bin版本(例如:apache-maven-3.9.5-bin.zip)

3.3 安装配置详解(Windows系统)

  1. 解压文件
    将下载的zip文件解压到一个没有空格和中文的路径,例如:

    D:\DevTools\apache-maven-3.9.5
    

    注意路径中不要出现空格和中文!!!

  2. 配置环境变量

    这一步是让系统能在任何位置识别mvn命令:

    • 打开控制面板,环境变量:在这里插入图片描述

    • 新建系统变量:在这里插入图片描述

      变量名:MAVEN_HOME
      变量值:D:\DevTools\apache-maven-3.9.5(你保存的路径)
      
    • 编辑系统变量Path,添加:在这里插入图片描述

      %MAVEN_HOME%\bin(如图)
      
  3. 验证安装

    打开新的命令提示符窗口(必须是新窗口,旧窗口不会加载新的环境变量),执行:

    mvn -version
    

    成功输出示例:
    在这里插入图片描述

四、Maven配置

4.1 settings.xml(下载完Maven后配置)

settings.xml是Maven的全局配置文件,位于两个位置:

位置 路径 优先级 适用场景
全局配置 ${MAVEN_HOME}/conf/settings.xml 所有用户共享的配置
用户配置 ~/.m2/settings.xml 个人定制配置
  • 先在maven的下载目录下新建仓库:mvn_resp
  • 找到 settings.xml 中的 localRepository
//本地仓库路径,将中间的路径改为自己设置的仓库路径
<localRepository>D:\DevTools\apache-maven-3.9.9\mvn_resp</localRepository>
4.1.1 远程仓库配置
  • settings.xml 中,找到 mirror 标签,默认镜像源是国外镜像源,需要修改为国内镜像源:
//修改为阿里云镜像代码
<mirror>
      <id>alimaven</id>
      <mirrorOf>central</mirrorOf>
      <name>aliyun maven</name>
      <url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
4.1.2 配置 idea

更改idea的全局配置,打开设置->构建->Maven,将相关路径修改如下:

在这里插入图片描述

4.2 pom.xml

pom.xml(Project Object Model)定义了项目的所有元数据、依赖关系和构建配置。

4.2.1 基础结构
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
         http://maven.apache.org/xsd/maven-4.0.0.xsd">
    
    <!-- POM模型版本,固定为4.0.0 -->
    <modelVersion>4.0.0</modelVersion>
    
    <!-- 项目坐标:唯一标识这个项目 -->
    <groupId>com.example</groupId>
    <artifactId>my-app</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    
    <!-- 打包方式:jar/war/pom -->
    <packaging>jar</packaging>
    
    <!-- 项目元信息 -->
    <name>My Application</name>
    <description>一个示例Maven项目</description>
    <url>https://www.example.com</url>
    
    <!-- 属性定义:统一管理版本号 -->
    <properties>
        <java.version>1.8</java.version>
        <spring.version>5.3.20</spring.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    
    <!-- 依赖管理 -->
    <dependencies>
        <!-- 具体依赖配置 -->
    </dependencies>
    
    <!-- 构建配置 -->
    <build>
        <!-- 插件配置 -->
    </build>
</project>
4.2.2 版本号

Maven推荐使用语义化版本(Semantic Versioning):

主版本号.次版本号.修订号-限定符
例如:1.2.3-SNAPSHOT
版本部分 含义 何时递增 示例
主版本号 重大变更,可能不兼容 API重大改变 1.x.x → 2.0.0
次版本号 新增功能,向后兼容 添加新特性 1.2.x → 1.3.0
修订号 Bug修复,完全兼容 修复问题 1.2.3 → 1.2.4

限定符说明

  • SNAPSHOT:快照版本,开发中的不稳定版本
  • RELEASE:正式发布版本
  • RC(Release Candidate):候选发布版本
  • BETA:测试版本
  • ALPHA:内部测试版本
4.2.3 依赖配置详解
<dependencies>
    <!-- 基础依赖 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${spring.version}</version>
    </dependency>
    
    <!-- 测试依赖:仅在测试时使用 -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13.2</version>
        <scope>test</scope> <!--scope设置依赖范围-->
    </dependency>
    
    <!-- 可选依赖:不会传递给依赖此项目的其他项目 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.28</version>
        <optional>true</optional>  <!--optional为可选依赖-->
    </dependency>
    
    <!-- 排除传递依赖:解决版本冲突 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>2.7.0</version>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-tomcat</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>

依赖作用域(Scope)常用取值

scope值 主程序 测试程序 打包(运行) 范例
compile(默认) Y Y Y log4j
test - Y - junit
provided Y Y - servlet-api
runtime - Y Y jdbc驱动

五、Maven使用

5.1 创建Maven项目

IntelliJ IDEA 创建

  1. 创建一个空项目,指定项目名称:在这里插入图片描述
  2. 新建一个模块,选择Maven语言,选择你安装的jdk版本:在这里插入图片描述
    在这里插入图片描述
  3. 新建模块/src/main/java 下新建java类,进行代码编写…

5.2 导入Maven项目

在IntelliJ IDEA中导入:

  • 方式一(推荐)
    a. 打开IDEA → 点击右侧 Maven面板(若无:View → Appearance → Tool Window Bars
    b. 点击 + → 选择目标项目的 pom.xml → 双击导入
  • 方式二(中文模式)
    a. 文件 → 项目结构 → 点击 +
    b. 选择 导入模块 → 定位到项目的 pom.xml → 确认
  • 请确保项目根目录包含 pom.xml(Maven核心配置文件)。
  • 导入后IDE会自动下载pom.xml中定义的依赖(需联网)。若依赖缺失,手动触发Maven命令:
    bash mvn clean install

5.3 Maven使用运行

在 idea 中打开Maven的控制面板展开生存期,双击即可进行相应操作,这里讲解maven命令进行操作:Maven的命令遵循mvn [插件]:[目标]mvn [生命周期阶段]的格式。

5.2.1 清理与编译
# 清理项目:删除target目录
mvn clean

# 编译主代码:src/main/java → target/classes
mvn compile

# 编译测试代码:src/test/java → target/test-classes
mvn test-compile
5.2.2 测试相关命令
# 运行所有测试
mvn test

# 跳过测试
mvn package -DskipTests

# 跳过测试编译和执行
mvn package -Dmaven.test.skip=true

# 运行指定测试类
mvn test -Dtest=UserServiceTest

# 运行指定测试方法
mvn test -Dtest=UserServiceTest#testLogin

测试报告位置target/surefire-reports/

5.2.3 打包与安装
# 打包项目:生成jar/war文件
mvn package

# 安装到本地仓库:其他项目可以依赖
mvn install

# 部署到远程仓库:供团队其他成员使用
mvn deploy

# 组合命令:清理+编译+测试+打包
mvn clean package

# 完整构建流程
mvn clean install

打包结果示例

target/
├── my-app-1.0.0-SNAPSHOT.jar    # 最终产物
├── classes/                      # 编译后的class文件
├── test-classes/                 # 测试class文件
├── maven-archiver/               # 打包元信息
└── surefire-reports/             # 测试报告
5.2.4 依赖管理命令
# 查看依赖树:分析依赖关系
mvn dependency:tree

# 查看依赖树(详细版本信息)
mvn dependency:tree -Dverbose

# 分析依赖冲突
mvn dependency:analyze

# 下载依赖源码
mvn dependency:sources

# 下载依赖文档
mvn dependency:resolve -Dclassifier=javadoc

# 复制依赖到指定目录
mvn dependency:copy-dependencies -DoutputDirectory=lib
5.2.5 项目信息命令
# 生成项目站点文档
mvn site

# 查看有效POM(包含继承和默认配置)
mvn help:effective-pom

# 查看有效settings
mvn help:effective-settings

# 查看插件信息
mvn help:describe -Dplugin=compiler

# 查看项目依赖更新
mvn versions:display-dependency-updates

# 查看插件更新
mvn versions:display-
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐