乐途乐途
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
    • HTTP协议
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • MyBatis
    • Spring
    • Spring MVC
    • Maven 入门
    • Maven 进阶
    • Java 设计模式
  • 缓存

    • Redis
联系
阿里云
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
    • HTTP协议
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • MyBatis
    • Spring
    • Spring MVC
    • Maven 入门
    • Maven 进阶
    • Java 设计模式
  • 缓存

    • Redis
联系
阿里云
  • 学习路径
  • 第1章 介绍与核心概念

    • Maven是什么
    • 约定优于配置
  • 第2章 安装与配置

    • 安装与验证
    • settings.xml
    • 本地仓库与镜像
  • 第3章 POM与项目坐标

    • POM
    • GAV坐标
    • packaging
  • 第4章 标准目录布局

    • 标准目录布局
  • 第5章 依赖机制

    • dependencies
    • scope
    • 依赖传递
    • 依赖冲突与调解
    • exclusions
    • optional
    • dependencyManagement
  • 第6章 仓库

    • 仓库体系
    • 本地仓库
    • 远程仓库与镜像
    • 私服
  • 第7章 构建生命周期

    • 生命周期概述
    • clean 生命周期
    • default 生命周期
    • site 生命周期
    • 生命周期与插件绑定
  • 第8章 插件

    • 插件概述
    • maven-compiler-plugin
    • maven-surefire-plugin
    • maven-war-plugin
  • 第9章 继承与聚合

    • parent继承
    • 聚合
    • BOM
    • properties
  • 第10章 属性与资源过滤

    • 资源过滤
    • Profile
  • 第11章 常用命令

    • mvn compile
    • mvn test
    • mvn package
    • mvn clean
    • mvn install
    • mvn dependency:tree
  • 第12章 常见问题与最佳实践

    • 依赖冲突排查
    • 最佳实践

Maven是什么

本章是 Maven 教程的起点。理解 Maven 的官方定位和核心设计哲学,是后续学习 POM、依赖、生命周期等所有机制的前提。


核心机制

Maven 是一个软件项目管理和理解工具。它基于**项目对象模型(Project Object Model,POM)**的概念,通过一个中央配置文件 pom.xml 来管理项目的构建、报告和文档。

需要特别注意的是,它不是单纯的"构建工具",而是"管理和理解工具"。这意味着 Maven 的设计目标不仅是帮你编译打包,更是要让项目的结构、依赖、构建过程对所有人(包括你自己三个月后回来看代码)都是可理解、可复现、可传承的。

从"手工时代"到"声明式时代"

在 Maven 出现之前,Java 项目的构建是典型的"手工时代":

  1. 手动下载 JAR 包:去官网找依赖,下载到本地,复制到项目目录
  2. 手动管理 classpath:用 -cp 或 -classpath 参数列出几十个 JAR 路径
  3. 手动编写编译脚本:用 javac 命令逐个编译,或者用 Ant 写冗长的 XML 构建脚本
  4. 项目结构因人而异:A 同学的 src 目录和 B 同学的 source 目录互不兼容

Maven 用三个核心能力彻底改变了这一局面:

核心能力解决的问题本质
项目构建编译、测试、打包、部署的自动化用声明式配置替代手工命令
依赖管理JAR 包的下载、传递、版本冲突用坐标系统替代手动搬运
统一项目结构团队协作时的目录混乱用"约定优于配置"替代各自为政

生活类比:从"自己买菜做饭"到"餐厅点餐"

想象你(开发者)要做一顿饭(构建一个项目):

  • 手工时代(无 Maven):你自己去菜市场(官网)买每一种食材(JAR 包),回家自己切配(写 classpath)、自己掌勺(写编译脚本)。如果菜谱需要 20 种食材,你就得跑 20 趟菜市场。
  • Maven 时代:你走进一家标准化餐厅,菜单上每道菜都有唯一编号(GAV 坐标)。你只需在点餐单(pom.xml)上勾选"番茄炒蛋""糖醋排骨",餐厅后厨(Maven 引擎)自动从中央厨房(仓库)调取食材、按标准流程(生命周期)烹饪,最终端上成品(构建产物)。

这个类比的关键在于:你不再需要关心食材从哪来、怎么切、怎么炒,你只需要"声明"你想吃什么。


图示

上图展示了 Maven 的核心价值:开发者从繁琐的构建细节中解放出来,只需关注"声明",Maven 负责"执行"。仓库体系(本地仓库、远程仓库、中央仓库)是依赖自动下载的基础设施,后续章节会详细展开。


完整示例

场景

飞翔科技的技术部要开发一个员工信息管理系统。CTO 大翔要求项目必须标准化,方便后续维护。架构师白歌决定用 Maven 来管理这个项目。

操作前:手工时代的困境

假设没有 Maven,项目目录可能是这样的:

employee-system/
├── source/                    # 主代码(注意:叫 source 而不是 src)
│   └── com/feixiang/...
├── lib/                       # 手动下载的 JAR
│   ├── spring-context-5.3.21.jar
│   ├── mybatis-3.5.9.jar
│   ├── mysql-connector-8.0.30.jar
│   └── junit-5.8.2.jar
├── test/                      # 测试代码(和主代码平级)
├── build.bat                  # Windows 编译脚本
├── build.sh                   # Linux 编译脚本
└── README.txt                 # 说明文档

问题:

  • 新成员小崔入职后,发现 lib/ 里少了某个 JAR,项目编译失败
  • 前端黄俪的 Mac 上跑不了 build.bat
  • 运维李眉部署时,classpath 路径写错导致启动失败

操作后:Maven 标准化

使用 Maven 后,项目变成:

employee-system/
├── pom.xml                    # 唯一核心配置文件
├── src/
│   ├── main/
│   │   ├── java/              # 主代码
│   │   └── resources/         # 主配置
│   └── test/
│       ├── java/              # 测试代码
│       └── resources/         # 测试配置
└── target/                    # 构建输出(自动生成)

pom.xml 中声明依赖:

<?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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.feixiang</groupId>
    <artifactId>employee-system</artifactId>
    <version>1.0.0</version>
    <packaging>jar</packaging>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.21</version>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <version>5.8.2</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

变化分析:

  • 小崔入职后,只需执行 mvn compile,Maven 自动从仓库下载缺失的依赖
  • 黄俪的 Mac 和白歌的 Linux 执行同样的命令,结果完全一致
  • 李眉部署时,target/ 目录里的 JAR 就是最终产物,无需手动拼 classpath

易错点与常见问题

误区一:Maven 只是"自动下载 JAR 的工具"

错误认知:"我用 Maven 就是图它自动下依赖,别的功能我不关心。"

纠正:自动下载依赖只是 Maven 的三分之一能力。如果你只用它下载 JAR,却不用它的标准目录结构、生命周期和插件体系,相当于买了一台智能手机却只用来打电话——你错过了 Maven 最大的价值:项目标准化和团队协作效率。

误区二:Maven 替换了 Java 编译器

错误认知:"Maven 编译代码,所以 Maven 是编译器。"

纠正:Maven 不编译代码。真正编译的是 maven-compiler-plugin,它底层调用的是 JDK 的 javac。Maven 的角色是编排者——它按照生命周期阶段的顺序,在正确的时机调用正确的插件。编译器是插件,不是 Maven 本身。

误区三:Maven 和 IDE 的"Build"是一回事

错误认知:"我在 IDEA 里点一下 Build 按钮,和运行 mvn compile 效果一样。"

纠正:IDE 的 Build 通常只编译代码,不运行测试、不打包、不安装到本地仓库。而 mvn compile 会严格遵循 Maven 的生命周期,触发依赖解析、资源复制、编译等一系列标准步骤。在 CI/CD 流水线(如 Jenkins、GitHub Actions)中,只有 Maven 命令是可复现的,IDE 的 Build 行为因版本和配置而异,不可用于自动化构建。


小结

Maven 的—项目构建、依赖管理、统一项目结构——将 Java 开发者从繁琐的手工构建中解放出来。理解这一点,是后续学习 POM、依赖传递、生命周期等所有机制的思想基础。

本章与全局的关系:本章回答了"Maven 是什么、为什么需要它"。下一章将回答"怎么安装和配置 Maven",让你能亲手运行第一个 Maven 命令。

下一页
约定优于配置