Maven 是什么:Java 项目的“自动采购员”与“生产线”
一、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 项目
-
打开 IDEA,New Project → Maven → 勾选
Create from archetype→ 选择maven-archetype-webapp。 -
填写 GroupId(如 com.demo)、ArtifactId(如 myweb)。
-
等待 IDEA 下载 archetype 和依赖。
-
生成的项目已经有标准结构,
pom.xml里默认有 JUnit 依赖。 -
在
src/main/webapp/下放 JSP 文件。 -
在
pom.xml中添加javax.servlet-api依赖(scope 为 provided)。 -
配置 Tomcat,但这次不需要手动复制 JAR 了。
实验2:手动执行 Maven 命令(可选)
-
打开命令行,进入项目根目录(有 pom.xml 的目录)。
-
执行
mvn clean compile→ 看到编译成功,target 目录出现。 -
执行
mvn package→ 在 target 下生成myweb.war。 -
把 war 复制到 Tomcat 的 webapps 下,启动 Tomcat,访问即可。
通过这些命令,你感受到了 Maven 自动化构建的威力。
六、Maven 常见问题与误区
误区1:Maven 只适合大型项目
错。即使只有一个类的项目,Maven 也能帮助你管理测试、打包。
误区2:必须联网才能用 Maven
第一次使用需要联网下载依赖和插件。之后本地仓库有缓存,可以离线工作(大部分情况)。
误区3:Maven 是 IDE 插件
不是。Maven 是一个独立命令行工具,IDEA/Eclipse 只是集成了它,让你不用敲命令。
问题:依赖下载慢怎么办?
可以配置阿里云镜像(在 ~/.m2/settings.xml 中添加),下载速度快很多。
更多推荐
所有评论(0)