关于Maven

Maven是Java项目的管理和构建工具,它主要提供标准化的

  • 项目结构
  • 构建流程(编译,测试,打包,发布等)
  • 依赖管理机制

Maven项目结构

Maven管理的普通Java项目默认结构如下

  • pom.xml
  • src/
    • main/
      • java/
      • resources/
    • test/
      • java/
      • resources/
  • 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依赖由groupIdartifactIdversion作为唯一标识,例如

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>