Maven

一、Maven 是什么

Maven 是一个基于 项目对象模型(POM)项目管理与构建工具 ,主要用于 Java 项目。它通过一个核心配置文件 pom.xml 来管理项目的构建、依赖、文档生成、报告等全生命周期。

简单说:Maven 给 Java 项目提供了一套标准化的构建流程和依赖管理方案

项目对象模型(POM)是什么?

通俗理解

项目 想象成一个人 ,POM 就是这个人的身份证

身份证上记录了:姓名、年龄、住址、身份证号......

POM 文件(pom.xml)里记录了:项目叫什么、版本多少、依赖哪些第三方库、怎么编译、怎么打包......

技术解释

项目对象模型 是一种把项目的所有配置信息抽象成一个对象 的思想。Maven 读取 pom.xml 后,会在内存中构建一个完整的 Project 对象,包含:

  • 项目坐标(groupIdartifactIdversion

  • 依赖列表

  • 构建配置(编译器版本、编码格式等)

  • 插件配置

  • 模块信息(多模块项目)

一个最小示例:

java 复制代码
<project>
    <!-- 模型版本,Maven 2/3 固定用 4.0.0 -->
    <modelVersion>4.0.0</modelVersion>

    <!-- 以下三行是项目唯一标识 = 坐标 -->
    <groupId>com.example</groupId>
    <artifactId>my-project</artifactId>
    <version>1.0.0</version>

    <!-- 依赖管理 -->
    <dependencies>
        <dependency>...</dependency>
    </dependencies>
</project>

有了这个 POM,Maven 就知道你的项目"长什么样",不需要你额外说明。
标准化构建流程是什么意思?

没有标准化的混乱状态

以前(或不用构建工具时),每个项目有自己的构建方式:

  • 项目 A:用 build.sh 脚本编译

  • 项目 B:用 ant build.xml

  • 项目 C:在 Eclipse 里点按钮打包

  • 项目 D:手动敲 javac 编译

你接手新项目时,第一件事就是"研究怎么构建它"。

标准化之后

Maven 定义了一套所有人通用的生命周期和阶段

阶段 作用 对应命令
clean 删除上次编译的文件 mvn clean
validate 验证项目配置正确 自动执行
compile 编译源代码 mvn compile
test 运行单元测试 mvn test
package 打包成 JAR/WAR mvn package
verify 验证包是否合格 mvn verify
install 安装到本地仓库 mvn install
deploy 上传到远程仓库 mvn deploy

带来的好处

  • 任何 Maven 项目 ,你执行 mvn clean install 都能完成构建

  • 不用看文档、不用问人、不用学新脚本

  • CI/CD(持续集成/部署)只需统一调用 mvn 命令

这就是"标准化构建流程"的含义:不是你的项目流程,而是 Maven 定义的行业通用流程
依赖管理方案是什么意思?

没有依赖管理的痛苦

假设你要用 Spring Framework 开发项目:

  1. 去 Spring 官网找到 spring-core.jar

  2. 发现它需要 commons-logging.jar,去下载

  3. 还要 spring-beans.jar,它又依赖其他包

  4. 手动一个个找,可能要下载几十个 Jar 包

  5. 团队里别人拿到你的代码,也要重复这个过程

  6. 版本搞错了,程序报 ClassNotFoundException

这就是依赖地狱。

Maven 的依赖管理方案

核心三要素:坐标

每个 Jar 包有唯一身份证:

java 复制代码
groupId:org.springframework
artifactId:spring-core
version:5.3.20

声明式依赖

你只需要在 pom.xml 里写:

java 复制代码
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>5.3.20</version>
</dependency>

Maven 自动去仓库下载 spring-core 以及它的所有依赖。

依赖仓库机制

  • 本地仓库 (你电脑 ~/.m2/repository):缓存已下载的包,一次下载全局复用

  • 中央仓库(Maven 官方):全世界的开源库都在这里

  • 私有仓库(公司内部):存放公司自己的包

传递依赖自动解析

java 复制代码
你的项目 → spring-core → commons-logging

你只需要声明 spring-core,Maven 自动把 commons-logging 也下载下来。

依赖冲突解决

如果 A 依赖 junit:4.12,B 依赖 junit:4.13,Maven 有一套规则(就近原则、路径最短优先等)自动选择版本,避免冲突。

概念 一句话解释
POM 用 XML 文件把项目所有的配置信息"模型化",让 Maven 认识你的项目
标准化构建流程 Maven 定义了一套从编译→测试→打包→部署的通用命令,所有项目都遵守
依赖管理方案 你只需声明需要什么库(坐标),Maven 自动下载、管理版本、处理传递依赖

一个形象的类比:网购

  • POM = 你的购物清单(写了要买什么、买多少)

  • 标准化构建流程 = 快递的标准流程(下单→打包→运输→派送→签收)

  • 依赖管理方案 = 购物平台自动从各个仓库调货,还能自动搭配赠品(传递依赖)

你不用自己去每个厂家买货(找 Jar 包),也不用告诉快递员怎么走(构建步骤),一切自动化。

二、Maven 能干什么?

1.管理项目依赖
  • 自动下载项目所需的第三方库(JAR 包)

  • 自动处理传递性依赖(A 依赖 B,B 依赖 C,Maven 自动把 C 也带来)

  • 避免 Jar 包冲突、版本不一致

例子

你只需要在 pom.xml 中写:

java 复制代码
xml

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>5.3.20</version>
</dependency>

Maven 会自动从中央仓库下载 spring-core 及其依赖的其它包。

2. 标准化项目构建

提供一套生命周期命令:

  • mvn clean:删除编译好的文件

  • mvn compile:编译源代码

  • mvn test:运行测试

  • mvn package:打包成 JAR 或 WAR

  • mvn install:将包安装到本地仓库,供其他项目使用

  • mvn deploy:上传到远程仓库(供团队共享)

3. 统一项目结构

Maven 强制规定了标准目录布局:

java 复制代码
项目根目录
├── pom.xml
├── src
│   ├── main
│   │   ├── java        # 源码
│   │   └── resources    # 配置文件
│   └── test
│       ├── java        # 测试代码
│       └── resources
└── target              # 编译输出

任何 Maven 项目结构一致,新成员上手快。

4. 跨环境可移植

在不同电脑上只要执行相同 Maven 命令,就能得到一致的构建结果,无需手动复制 Jar 包。

5. 插件机制

可以通过插件扩展功能,比如:

  • 生成站点文档

  • 代码检查(Checkstyle)

  • 打包成 Docker 镜像

三、为什么要用 Maven?

没有 Maven 时的问题 用 Maven 后的好处
手动下载 Jar 包,从各种网站找 声明式依赖,自动下载+版本管理
依赖的依赖也要手动找(比如用 Spring 要带几十个包) 自动传递依赖
不同机器上 Jar 包版本不一致导致诡异 bug 依赖版本锁定,可重现构建
每个人用不同方式编译、打包(IDE 不同、脚本不同) 标准生命周期命令,所有人都一样
项目目录混乱,新人看不懂 统一项目结构
要自己写 Ant 脚本或手动操作 一条命令完成 clean、compile、test、package
示例说明:

pom.xmls

java 复制代码
<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>my-app</artifactId>
    <version>1.0</version>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

然后在命令行运行:

java 复制代码
mvn package

Maven 会自动下载 JUnit、编译、测试、打包成一个 JAR 文件。

四、总结

  • Maven 是什么:Java 项目自动化构建和依赖管理工具

  • 能干什么:管理依赖、标准化构建、统一结构、跨环境可移植、插件扩展

  • 为什么用它:告别手工下载 Jar 包和混乱的构建流程,提升效率、减少错误、便于团队协作

如果你正在学习 Java 项目开发或进入企业团队,Maven 几乎是必备技能。后续你还会遇到 Gradle(更灵活的构建工具),但 Maven 仍是目前 Java 生态中最主流、最基础的选择。

核心概念简要

概念 说明
坐标 groupId:artifactId:version 唯一标识一个构件
插件 执行某个具体任务,如 maven-compiler-plugin

什么是"构件"?

构件 = 一个具体的文件,通常是 Jar 包(也可能是 WAR、EAR 等)

举例说明:

你从网上下载一个 Jar 包,文件名是:

java 复制代码
spring-core-5.3.20.jar

Maven 如何精确描述这个 Jar 包?用三个坐标

坐标 含义
groupId org.springframework 哪个公司/组织写的
artifactId spring-core 项目叫什么
version 5.3.20 哪个版本

三个合起来org.springframework:spring-core:5.3.20 → 唯一指向 spring-core-5.3.20.jar 这个文件。
什么是"插件"?

插件 = 一个 专门干某件事 的程序

Maven 本身只是个框架,具体干活的是插件:

任务 负责的插件
编译 Java 代码 maven-compiler-plugin
运行测试 maven-surefire-plugin
打包成 Jar maven-jar-plugin
上传到服务器 maven-deploy-plugin

举例:maven-compiler-plugin

你执行 mvn compile 时,Maven 会调用 maven-compiler-plugin 这个插件,它去执行 javac 命令编译代码。

为什么叫"插件"?

  • 可插拔:不用就删掉配置,不影响

  • 可替换:你可以换成其他编译插件

  • 可扩展:官方没有的功能,第三方可以写插件

关键联系

插件本身也是一个构件(Jar包),所以它也有自己的坐标!

当你写:

java 复制代码
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.1</version>
</plugin>

这就是用坐标去下载 maven-compiler-plugin 这个 Jar 包,然后 Maven 用它来执行编译任务。

相关推荐
悟空码字2 小时前
别再重复造轮子了!SpringBoot对接第三方系统模板,拿来即用
java·spring boot·后端
yaaakaaang2 小时前
十七、迭代器模式
java·迭代器模式
我爱cope2 小时前
【从0开始学设计模式-8| 桥接模式】
java·设计模式·桥接模式
Lsk_Smion2 小时前
Hot100(开刷) 之 环形链表(II)-- 随机链表的复制 -- 翻转二叉树
java·后端·kotlin·力扣·hot100
indexsunny2 小时前
互联网大厂Java求职面试实战:Spring Boot与微服务架构解析
java·spring boot·redis·kafka·spring security·flyway·microservices
lulu12165440782 小时前
Claude Code Routines功能深度解析:24小时云端自动化开发指南
java·人工智能·python·ai编程
ch.ju2 小时前
Java程序设计(第3版)第二章——关系运算符
java
Tirzano2 小时前
springsession全能序列化方案
java·开发语言
我登哥MVP2 小时前
【SpringMVC笔记】 - 2 - @RequestMapping
java·spring boot·spring·servlet·tomcat·intellij-idea·springmvc