Maven[ˈmevən]能帮你构建工程,管理jar包,编译代码,还能帮你自动运行单元测试,打包,生成报表,甚至能帮你部署项目,生成Web站点, 为开发者提供了一套完整的构建生命周期框架。开发团队几乎不用花多少时间就能够自动完成工程的基础构建配置,因为 Maven 使用了一个标准的目录结构和一个默认的构建生命周期。
1. POM文件
Maven 工程结构和内容被定义在一个 xml 文件中 pom.xml
,是 Project Object Model (POM) 的简称,此文件是整个 Maven 系统的基础组件。POM 它放在工程根目录下,包含了关于工程和各种配置细节的信息,Maven 使用这些信息构建工程。也包含了目标和插件。当执行一个任务或者目标时,Maven 会查找当前目录下的 POM,从其中读取所需要的配置信息,然后执行目标。下面是一个简单的pom文件:
4.0.0
Hust
Gongmei
1.0-SNAPSHOT
war
Gongmei Maven Webapp
http://www.example.com
UTF-8
1.7
1.7
6.0.1
junit
junit
4.12
org.apache.maven.plugins
maven-compiler-plugin
2.3.2
1.8
true
cloud
POM文件的要求
- 每个工程应该只有一个 POM 文件。
- 所有的 POM 文件需要 project 元素和三个必须的字段:groupId, artifactId,version。表达当前工程的信息
- 在仓库中的工程标识为 groupId:artifactId:version
节点 | 说明 |
---|---|
groupID | 这是工程组的标识。它在一个组织或者项目中通常是唯一的。例如,一个银行组织 com.company.bank 拥有所有的和银行相关的项目。 |
artifactId | 这是工程的标识。它通常是工程的名称。例如,消费者银行。groupId 和 artifactId 一起定义了 artifact 在仓库中的位置。 |
version | 这是工程的版本号。在 artifact 的仓库中,它用来区分不同的版本。例如:com.company.bank:consumer-banking:1.0 com.company.bank:consumer-banking:1.1. |
properties | 项目中的配置文件。指明项目中一些配置,例如字体编码以及版本号等 |
dependencies | 项目中的依赖文件。即项目中需要引入的jar包。 |
plugins | maven插件。Maven 实际上是一个依赖插件执行的框架,每个任务实际上是由插件完成。Build plugins:在构建时执行;Reporting plugins:在网站生成过程中执行 |
2. Maven构建声明周期
三个关键字:
- lifecycle 生命周期
- phase 阶段
- goal 目标
lifecycle 中包含phase ,phase 中包含goal 。
2.1 lifestyle
每个lifecycle 中都包含一个或多个phase 。通过 Maven 命令调用lifecycle中的phase时,该lifecycle中phase之前以及包括该phase在内的所有phase会被执行。Maven 有以下三个默认的生命周期:
- clean 删除构建目录
- build 构建应用
- site 创建新的报告文档、部署站点
2.2 phase
执行phase实际执行的是goal。如果一个phase没有绑定goal,这个phase就不会被执行。每个phase定义了一个或多个goals ,其中的goals是顺序执行。一些phase默认已经绑定了一些goal。对于default lifecycle来说, 这些被绑定的goal并不完全相同,而是和packaging value相关。
2.3 goal
最终被执行的就是goal,goal与goal之间是独立的。因此单独执行一个goal不会导致其他goal被执行。
e.g: mvn clean dependency:copy-dependencies package
,maven会顺序执行这3个对象中包含的所有goal。
3. Maven仓库
Maven仓库有三种类型:
- 本地(local)
- 中央(central)
- 远程(remote)
3.1 本地仓库
Maven 本地仓库保存你的工程的所有依赖(library jar、plugin jar 等)。当你运行一次 Maven 构建,Maven 会自动从中央库或远程库下载所有依赖的 jar 文件到本地仓库中。它避免了每次构建时都引用存放在远程机器上的依赖文件。
Maven 本地仓库默认被创建在 %USER_HOME% 目录下。要修改默认位置,在 %M2_HOME%\conf 目录中的 Maven 的 settings.xml 文件中定义另一个路径。
C:/MyLocalRepository
3.2 中央仓库
Maven 中央仓库是由 Maven 社区提供的仓库,其中包含了大量常用的库。通俗一点说,就是一个网站,上面存放大量的库,项目中用到中央仓库的相关文件,就自动下载下来。可以在maven文件夹下的settings.xml中更改中央仓库的地址
3.3 远程仓库
如果 Maven 在中央仓库中也找不到依赖的库文件,它会停止构建过程并输出错误信息到控制台。可以在pom文件中指定远程仓库地址,那么Maven就会从该远程仓库下载依赖:
4.0.0
com.companyname.projectgroup
project
1.0
com.companyname.common-lib
common-lib
1.0.0
companyname.lib1
http://download.companyname.org/maven2/lib1
companyname.lib2
http://download.companyname.org/maven2/lib2
3.4 Maven依赖搜索顺序
步骤 1 - 在本地仓库中搜索,如果找不到,执行步骤 2,如果找到了则执行其他操作。
步骤 2 - 在中央仓库中搜索,如果找不到,并且有一个或多个远程仓库已经设置,则执行步骤 4,如果找到了则下载到本地仓库中。
步骤 3 - 如果远程仓库没有被设置,Maven 将简单的停滞处理并抛出错误(无法找到依赖的文件)。
步骤 4 - 在一个或多个远程仓库中搜索依赖的文件,如果找到则下载到本地仓库已被将来引用,否则 Maven 将停止处理并抛出错误(无法找到依赖的文件)
4. Maven插件
另外一种将goal绑定到phase的方法就是在project中使用plugin,一个plugin可能有一个或多个goal,其中每个goal代表一个plugin的功能。
4.1 插件的使用
一、插件通常提供了一个目标的集合,可以使用下面的方法使用:
mvn [plugin-name]:[goal-name]
例如,一个 Java 工程可以使用 maven-compiler plugin 的 compile (goal) 编译,使用以下命令:
mvn compiler:compile
4.2 常用的插件列表
插件 | 说明 |
---|---|
clean | 构建之后清理目标文件(target文件),删除目标目录 |
compiler | 编译Java源文件 |
surefile | 运行junit单元测试,创建测试报告 |
jar | 从当前工程中构建jar文件 |
war | 从当前工程中构建war文件 |
javadoc | 为工程生成javadoc |
antrun | 从构建过程的任意一个阶段中运行一个ant任务的集合 |
5. Maven打包的详细过程
mvn clean package
执行详细过程如下:
从图中我们可以看到Maven的执行顺序:
1、使用清理插件:maven-clean-plugin:2.5执行清理删除已有target目录(版本2.5)
2、使用资源插件:maven-resources-plugin:2.6执行资源文件的处理(版本2.6)
3、使用编译插件:maven-compiler-plugin:3.1编译所有源文件生成class文件至target\classes目录下(版本3.1)
4、使用资源插件:maven-resources-plugin:2.6:testResource执行测试资源文件的处理(版本2.6)
5、使用编译插件:maven-compiler-plugin:3.1:testCompile编译测试目录下的所有源代码(版本3.1)
6、使用插件:maven-surefire-plugin:2.12.4运行测试用例(版本2.12.4);
7、使用插件:maven-jar-plugin:2.4对编译后生成的文件进行打包,包名称默认为:artifactId-version,比如本例生成的jar文件:Gongmei-1.0-SNAPSHOT,包文件保存在target目录下,将该war包放入tomcat目录下的webapp中运行即可。
备注:不管是compile、package还是install等前三个步骤都是必不可少的,即清理已有目录,处理资源文件、编译源文件。
6. Maven常用插件
maven默认会依据项目类型自动把构建时的各阶段(Lifecycle和phase)自动绑定到特定插件提供的功能(goal)点上。例如java项目编译(compile)阶段,实际上是调用了maven-compiler-plugin插件提供的compile功能点来实现的。
- maven-resources-plugin 文件资源配置
maven-resources-plugin
UTF-8
- maven-compiler-plugin 编译配置
默认绑定到compile phase。maven2默认使用的是jdk5,jdk版本一般自己指定。
org.apache.maven.plugins
maven-compiler-plugin
2.3.2
1.8
utf-8
-Xlint:none
libs
- maven-surefire-plugin 单元测试
默认绑定到test阶段
org.apache.maven.plugins
maven-surefire-plugin
true
true
true
- maven-jar-plugin 打jar包
普通java项目(非web项目或其它类型的特殊项目),package阶段默认绑定的插件,能够将编译好的class和资源达成jar包,但不包含依赖
org.apache.maven.plugins
maven-jar-plugin
2.4
agent.properties
true
com.demo.HelloWorld
- maven-assembly-plugin 打包含依赖的全包
在打包时,对jar包的打包形式进行自定义配置
org.apache.maven.plugins
maven-assembly-plugin
2.4
src/main/resources/package.xml
make-assembly
package
single
下面是具体的配置package.xml
bin
zip
- maven-war-plugin 打war包
org.apache.maven.plugins
maven-war-plugin
2.1.1
${project.artifactId}
libs/
WEB-INF/lib
**/*.jar
css/**,html/**
- maven-source-plugin 打包源码
org.apache.maven.plugins
maven-source-plugin
2.1.2
attach-sources
verify
jar-no-fork