一、Maven 是什么?(一句话)

Maven 是一个Java 项目的构建和依赖管理工具,它能帮你:

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

  • 自动编译你的代码、打包成 JAR/WAR、运行测试(构建生命周期)。

  • 统一项目目录结构,让不同 IDE 之间可以通用。

类比

  • 没有 Maven 时:你开一家餐厅,需要自己去菜市场买菜、搬回厨房、洗菜切菜、炒菜、洗碗……所有环节自己干。

  • 有 Maven 后:你只需要写一份“菜单”(pom.xml),告诉 Maven 要什么菜(依赖)、什么口味(插件),Maven 帮你买菜、搬运、甚至初步加工,你只负责炒核心业务。

二、为什么需要 Maven?(痛点回顾)

痛点1:手动管理 JAR 包太麻烦

  • 你需要一个个下载 JAR 文件(可能还得找版本、来源)。

  • 多个项目用同一个 JAR,你得复制多份,浪费磁盘。

  • JAR 之间可能有依赖关系(比如 A.jar 需要 B.jar),你得自己研究并下载所有传递依赖。

痛点2:手动编译、打包繁琐

  • 每次修改代码,要手动 javac 编译、手动复制到 WEB-INF/classes、手动打成 war 包。

  • 如果项目很大,编译顺序还有讲究(比如先编译 A 再编译 B)。

痛点3:项目结构不统一

  • 不同 IDE(Eclipse、IDEA)生成的目录结构不一样,团队协作困难。

Maven 解决了以上所有问题

  • 你只需在 pom.xml 中声明依赖的 JAR 的“坐标”(groupId, artifactId, version),Maven 自动从中央仓库下载并管理。

  • 执行 mvn compile → 自动编译;mvn package → 自动打包。

  • 规定了标准的目录结构,所有人都一样。


三、Maven 的核心概念

1. POM(Project Object Model)

一个 pom.xml 文件,是 Maven 的心脏。里面写什么?

  • 项目信息(groupId, artifactId, version)。

  • 依赖列表(哪些第三方 JAR)。

  • 插件(编译打包时执行的任务)。

例子(最简单的 pom.xml):

xml

<project>
    <groupId>com.myapp</groupId>
    <artifactId>hello</artifactId>
    <version>1.0</version>
    <dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
</project>

2. 坐标(GAV)

每个 JAR 在全球 Maven 仓库中有唯一标识,由三部分组成:

  • groupId:组织/公司名,比如 com.fasterxml.jackson

  • artifactId:项目名,比如 jackson-databind

  • version:版本号,比如 2.13.0

就像快递地址:国家(groupId) → 城市(artifactId) → 街道+门牌号(version)。

3. 仓库(Repository)

  • 本地仓库:在你电脑上的一个文件夹(默认 ~/.m2/repository),下载过的 JAR 都存在这里,所有项目共享。

  • 中央仓库:Maven 官方维护的全球公共仓库,里面几乎有所有开源 Java 库。

  • 私有仓库:公司内部用的(如 Nexus, Artifactory)。

4. 生命周期(Lifecycle)

Maven 定义了一组构建阶段,你只需调用某个阶段,它会按顺序执行前面的阶段。

常用命令:

  • mvn clean:删除 target 目录(删除之前编译的东西)。

  • mvn compile:编译 main 目录下的 Java 代码。

  • mvn test:运行测试代码。

  • mvn package:打包成 JAR 或 WAR(在 target 目录下)。

  • mvn install:把打包结果安装到本地仓库,供其他项目使用。

  • mvn clean package:先清再打包(最常用)。

类比:你告诉机器“煮米饭”,它会自动完成“洗米 → 加水 → 插电 → 煮”。你不需要每一步单独下指令。


四、Maven 标准目录结构(不用记,IDE 会创建)

text

项目根目录
├── pom.xml
├── src
│   ├── main
│   │   ├── java          (你的Java源代码)
│   │   ├── resources     (配置文件,如properties)
│   │   └── webapp        (如果是Web项目,放JSP、HTML、WEB-INF)
│   └── test
│       ├── java          (单元测试代码)
│       └── resources     (测试用的配置文件)
└── target                (编译打包后的输出目录,不手动改)

这个结构是 Maven 约定的,你不需要记,因为 Spring Initializr 或 IDE 会自动生成。


五、动手实验(建立第一个 Maven Web 项目)

实验1:使用 IDEA 创建一个 Maven Web 项目

  1. 打开 IDEA,New Project → Maven → 勾选 Create from archetype → 选择 maven-archetype-webapp

  2. 填写 GroupId(如 com.demo)、ArtifactId(如 myweb)。

  3. 等待 IDEA 下载 archetype 和依赖。

  4. 生成的项目已经有标准结构,pom.xml 里默认有 JUnit 依赖。

  5. 在 src/main/webapp/ 下放 JSP 文件。

  6. 在 pom.xml 中添加 javax.servlet-api 依赖(scope 为 provided)。

  7. 配置 Tomcat,但这次不需要手动复制 JAR 了。

实验2:手动执行 Maven 命令(可选)

  1. 打开命令行,进入项目根目录(有 pom.xml 的目录)。

  2. 执行 mvn clean compile → 看到编译成功,target 目录出现。

  3. 执行 mvn package → 在 target 下生成 myweb.war

  4. 把 war 复制到 Tomcat 的 webapps 下,启动 Tomcat,访问即可。

通过这些命令,你感受到了 Maven 自动化构建的威力。


六、Maven 常见问题与误区

误区1:Maven 只适合大型项目

错。即使只有一个类的项目,Maven 也能帮助你管理测试、打包。

误区2:必须联网才能用 Maven

第一次使用需要联网下载依赖和插件。之后本地仓库有缓存,可以离线工作(大部分情况)。

误区3:Maven 是 IDE 插件

不是。Maven 是一个独立命令行工具,IDEA/Eclipse 只是集成了它,让你不用敲命令。

问题:依赖下载慢怎么办?

可以配置阿里云镜像(在 ~/.m2/settings.xml 中添加),下载速度快很多。

更多推荐