关于Maven
Maven是Java项目的管理和构建工具,它主要提供标准化的:
- 项目结构
- 构建流程(编译,测试,打包,发布等)
- 依赖管理机制
Maven项目结构
Maven管理的普通Java项目默认结构如下
- pom.xml
- src/
- main/
- java/
- resources/
- test/
- java/
- resources/
- main/
- target/
Maven依赖管理
Maven维护了一个中央仓库 repo1.maven.org,所有第三方库将自身的jar以及相关信息上传至中央仓库,Maven就可以从中央仓库把所需依赖下载到本地用户主目录的.m2
目录。除了可以从中央仓库下载外,还可以从镜像仓库下载,镜像仓库定期从中央仓库同步,例如
1
2<settings>
3 <mirrors>
4 <mirror>
5 <id>aliyun</id>
6 <name>aliyun</name>
7 <mirrorOf>central</mirrorOf>
8 <url>https://maven.aliyun.com/nexus/content/groups/public/</url>
9 </mirror>
10 </mirrors>
11</settings>
国内常用的Maven镜像仓库
https://maven.aliyun.com/nexus/content/groups/public/
https://mirrors.cloud.tencent.com/nexus/repository/maven-public/
https://mirrors.huaweicloud.com/repository/maven/
https://mirrors.163.com/maven/repository/maven-public/
Maven依赖由groupId
,artifactId
和version
作为唯一标识,例如
1
2<dependency>
3 <groupId>commons-logging</groupId>
4 <artifactId>commons-logging</artifactId>
5 <version>1.2</version>
6 <scope>provided</scope>
7</dependency>
Maven通过PGP签名确保任何一个jar包一经发布就无法修改,某个jar包一旦被Maven下载过,即可永久地安全缓存在本地
以
-SNAPSHOT
结尾的版本号会被Maven视为开发版本,每次都会重复下载
Maven定义了四种scope
Scope | 说明 |
---|---|
compile | (默认) 编译时需要用到该jar包,Maven会把这种类型的依赖直接放入classpath |
test | 仅在测试时使用,正常运行时并不需要,例如JUnit |
runtime | 编译时不需要,但运行时需要,例如JDBC驱动 |
provided | 编译时需要,但运行时不需要,例如Servlet相关jar包 |
Maven构建流程
Maven的生命周期(lifecycle)由一系列阶段(phase)构成,Maven内置定义了以下三种lifecycle
default
1<phases>
2 <phase>validate</phase>
3 <phase>initialize</phase>
4 <phase>generate-sources</phase>
5 <phase>process-sources</phase>
6 <phase>generate-resources</phase>
7 <phase>process-resources</phase>
8 <phase>compile</phase>
9 <phase>process-classes</phase>
10 <phase>generate-test-sources</phase>
11 <phase>process-test-sources</phase>
12 <phase>generate-test-resources</phase>
13 <phase>process-test-resources</phase>
14 <phase>test-compile</phase>
15 <phase>process-test-classes</phase>
16 <phase>test</phase>
17 <phase>prepare-package</phase>
18 <phase>package</phase>
19 <phase>pre-integration-test</phase>
20 <phase>integration-test</phase>
21 <phase>post-integration-test</phase>
22 <phase>verify</phase>
23 <phase>install</phase>
24 <phase>deploy</phase>
25</phases>
clean
1<xxx>
2 <phases>
3 <phase>pre-clean</phase>
4 <phase>clean</phase>
5 <phase>post-clean</phase>
6 </phases>
7 <default-phases>
8 <clean>
9 org.apache.maven.plugins:maven-clean-plugin:2.5:clean
10 </clean>
11 </default-phases>
12</xxx>
site
1<xxx>
2 <phases>
3 <phase>pre-site</phase>
4 <phase>site</phase>
5 <phase>post-site</phase>
6 <phase>site-deploy</phase>
7 </phases>
8 <default-phases>
9 <site>
10 org.apache.maven.plugins:maven-site-plugin:3.3:site
11 </site>
12 <site-deploy>
13 org.apache.maven.plugins:maven-site-plugin:3.3:deploy
14 </site-deploy>
15 </default-phases>
16</xxx>
Maven通过为phase
绑定插件plugin
来完成实际的构建过程,例如以下为jar
packaging的plugin配置
1<phases>
2 <process-resources>
3 org.apache.maven.plugins:maven-resources-plugin:2.6:resources
4 </process-resources>
5 <compile>
6 org.apache.maven.plugins:maven-compiler-plugin:3.1:compile
7 </compile>
8 <process-test-resources>
9 org.apache.maven.plugins:maven-resources-plugin:2.6:testResources
10 </process-test-resources>
11 <test-compile>
12 org.apache.maven.plugins:maven-compiler-plugin:3.1:testCompile
13 </test-compile>
14 <test>
15 org.apache.maven.plugins:maven-surefire-plugin:2.12.4:test
16 </test>
17 <package>
18 org.apache.maven.plugins:maven-jar-plugin:2.4:jar
19 </package>
20 <install>
21 org.apache.maven.plugins:maven-install-plugin:2.4:install
22 </install>
23 <deploy>
24 org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy
25 </deploy>
26</phases>