如果你刚开始接触 java 后端开发,经常会看到:
mvn clean mvn install mvn package mvn test
项目里还经常有一个:
pom.xml
很多初学者的第一反应是:maven 不就是一个 java 的包管理工具吗?
其实不完全是。
maven 更准确地说,是一个 java 项目的构建与项目管理工具。
它主要帮助我们解决:
- 项目怎么编译
- 测试怎么运行
- 依赖怎么管理
- 项目怎么打包
- 多模块项目怎么组织
- 构建过程怎么标准化
apache maven 官方也将它定位为用于 java 项目构建和管理的工具,并通过 pom 和插件定义项目的构建过程。
一、没有 maven 的时候,我们需要做什么?
假设我们有一个 java 项目:
src/
└── main.java
我们想运行它,大概需要经历:
java 源代码
↓
javac 编译
↓
.class 文件
↓
运行
但真实项目很快就复杂起来了。
比如我们的项目需要:
spring
mysql driver
mybatis
jackson
lombok
junit
...
那么问题来了:
这些 jar 包从哪里下载?
jar 包之间还有依赖关系怎么办?
项目怎么编译?
测试怎么执行?
最后怎么打包成 jar?
如果全部手工处理,会非常麻烦。
maven 就是用来解决这一系列问题的。
二、maven 最核心的三个东西
入门 maven,可以先记住三个概念:
pom、repository、lifecycle。
可以简单理解成:
pom
↓
告诉 maven:项目是什么、依赖什么
repository
↓
告诉 maven:依赖从哪里获取
lifecycle
↓
告诉 maven:项目怎么构建
这三个概念基本贯穿 maven 的整个使用过程。
三、pom 是什么?
pom 全称:
project object model
也就是:
项目对象模型。
它通常就是项目根目录下的:pom.xml
例如:
<project>
<groupid>com.example</groupid>
<artifactid>demo</artifactid>
<version>1.0.0</version>
<dependencies>
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-web</artifactid>
<version>3.5.0</version>
</dependency>
</dependencies>
</project>你可以把 pom.xml 理解成:这个 java 项目的身份证 + 配置文件。
它里面可以描述:
项目叫什么
项目版本是多少
使用什么 java 版本
依赖哪些第三方库
使用哪些插件
怎么打包
父项目是谁
有哪些子模块
所以看到一个 maven 项目,第一件事通常就是:打开 pom.xml
四、dependency 是 maven 最常见的配置
例如:
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-web</artifactid>
<version>3.5.0</version>
</dependency>它表示:我的项目需要 spring-boot-starter-web 这个依赖。
这里有三个特别重要的字段。
groupid
表示组织或者项目所属的组织:
<groupid>org.springframework.boot</groupid>
可以理解成:哪个公司 / 哪个组织
artifactid
表示具体的项目或者组件:
<artifactid>spring-boot-starter-web</artifactid>
可以理解成:具体使用哪个库
version
表示版本:
<version>3.5.0</version>
也就是:使用哪个版本
所以:
groupid
+
artifactid
+
version
基本可以唯一定位一个 maven 依赖。
五、maven 为什么能够自动下载 jar?
这就涉及:
repository(仓库)
maven 世界里最重要的仓库之一是:
maven central
你在 pom.xml 中写:
<dependency>
<groupid>xxx</groupid>
<artifactid>xxx</artifactid>
<version>xxx</version>
</dependency>maven 就会根据这些信息寻找对应的依赖。
大致过程:
pom.xml
↓
maven
↓
查找依赖
↓
远程仓库
↓
下载 jar
↓
本地仓库
↓
项目使用
六、什么是本地仓库?
第一次使用某个依赖时,maven 通常会从远程仓库下载。
下载之后,会缓存到本地。
例如 windows 用户通常可以在:
c:\users\用户名.m2\repository
看到 maven 的本地仓库。
里面可能有:
.m2
└── repository
└── org
└── springframework
└── ...
所以第二次构建项目时,如果本地已经存在对应版本:
maven
↓
本地仓库有
↓
直接使用
就不需要每次重新下载。
七、maven 最厉害的地方:传递依赖
假设你的项目依赖:a
但是 a 又依赖:b
b 又依赖:c
传统方式可能需要你自己一个一个下载:
a
b
c
而 maven 可以自动处理:
你的项目
↓
a
↓
b
↓
c
这就是:
传递依赖(transitive dependencies)。
所以你只需要声明自己直接需要的依赖,maven 会根据依赖关系继续解析。
这也是 maven 依赖管理非常重要的能力之一。
八、maven 的标准项目结构
maven 最大的特点之一,就是:
约定优于配置。
一个标准 maven 项目通常是:
demo
├── pom.xml
└── src
├── main
│ ├── java
│ └── resources
│
└── test
├── java
└── resources
其中:
src/main/java
放业务代码。
src/main/resources
放配置文件、资源文件。
src/test/java
放测试代码。
官方 maven getting started guide 也采用这一标准目录结构。
这样做有什么好处?
当你进入一个陌生的 maven 项目时,不需要重新学习它的目录结构。
看到:
src/main/java
基本就知道:java 源代码在这里。
这就是 maven 的:
约定优于配置。
九、maven lifecycle 是什么?
这是 maven 初学者最容易混淆的地方。
经常看到:
mvn clean mvn compile mvn test mvn package mvn install
这些到底是什么?
可以先简单理解成:maven 定义了一套标准的项目构建生命周期。
例如:
validate
↓
compile
↓
test
↓
package
↓
verify
↓
install
↓
deploy
它们代表不同阶段。
十、几个最常用的 maven 命令
1. clean
mvn clean
主要用于清理之前的构建结果。
例如:
target/
通常会被删除。
可以理解成:把之前编译产生的东西清理掉。
2. compile
mvn compile
编译项目代码。
大概就是:
.java
↓
.class
3. test
mvn test
编译并运行测试。
4. package
mvn package
将项目打包。
例如:
target/demo-1.0.0.jar
或者 web 项目可能生成:
xxx.war
5. install
mvn install
它不仅会构建项目,还会把生成的构件安装到本地 maven 仓库。
可以理解成:
项目
↓
编译
↓
测试
↓
打包
↓
安装到 ~/.m2/repository
这样其他本地 maven 项目就可以引用它。
十一、为什么执行 package 会自动编译和测试?
比如你执行:
mvn package
你可能会发现:
compile test package
都执行了。
为什么?
因为 maven 的生命周期阶段是有顺序的。
你执行:
mvn package
相当于告诉 maven:把项目构建到 package 阶段。
那么 package 前面的必要阶段也会执行。
所以:
mvn package
通常不需要你再手动执行:
mvn compile mvn test
十二、plugin 又是什么?
maven 本身并不是把所有事情都硬编码进去。
它大量依赖:
plugin(插件)。
例如:
编译
测试
打包
生成文档
代码检查
发布
很多能力都是通过插件完成的。
可以简单理解:
maven
↓
生命周期
↓
插件
↓
具体执行任务
例如编译 java:
maven compiler plugin
执行测试:
maven surefire plugin
所以 maven 可以理解成一个:围绕生命周期、插件和项目模型组织起来的构建系统。
十三、maven 和 npm 有什么区别?
如果你做过前端,这个对理解 maven 非常有帮助。
前端:
package.json
↓
npm install
↓
node_modules
java:
pom.xml
↓
mvn package
↓
~/.m2/repository
可以粗略类比:
| 前端 | java |
|---|---|
| package.json | pom.xml |
| npm | maven |
| npm install | maven 下载依赖 |
| node_modules | maven 本地仓库 |
| package | jar |
| npm scripts | maven plugin / lifecycle |
当然,这只是帮助理解的类比,两者的构建模型并不完全相同。
十四、maven 到底解决了什么问题?
如果把 maven 浓缩成一句话:maven 把 java 项目的构建、依赖、测试、打包和发布流程标准化了。
以前可能是:
开发人员 a
自己写构建脚本
开发人员 b
自己管理 jar
开发人员 c
自己设计项目结构
最后每个项目都不一样。
maven 希望做到:
统一项目结构
↓
统一依赖管理
↓
统一构建流程
↓
统一测试流程
↓
统一打包方式
所以当你进入一个新的 java maven 项目时,通常只需要先看:pom.xml
然后执行:
mvn clean package
就能快速理解和构建项目。
十五、初学 maven,真正需要掌握什么?
不要一开始就研究 maven 几百个配置项。
入门阶段先掌握这几个:
- pom.xml
- groupid / artifactid / version
- dependency
- repository
- 本地仓库 ~/.m2
- maven 生命周期
- clean / compile / test / package / install
- plugin
- 传递依赖
- maven 标准项目结构
把这几个概念搞懂,已经足够应付绝大多数日常 maven 操作。
十六、最后用一张图理解 maven
可以把 maven 想象成:
maven
│
┌───────────┼───────────┐
↓ ↓ ↓
pom lifecycle repository
│ │ │
↓ ↓ ↓
依赖配置 构建流程 下载依赖
│ │ │
└───────────┼───────────┘
↓
plugin
↓
编译 / 测试 / 打包
↓
jar / war
所以 maven 并不只是:“java 的依赖管理工具。”
更准确的理解是:maven 是一个以 pom 为核心,通过依赖管理、生命周期和插件来标准化 java 项目构建与管理的工具。
以上就是maven工具新手教学:一篇文章搞懂java项目构建与依赖管理的详细内容,更多关于java maven项目构建与依赖管理的资料请关注代码网其它相关文章!
发表评论