生命周期和插件
什么是生命周期?
Maven 构建生命周期就是 Maven 将一个整体任务划分为一个个的阶段,类似于流程图,按顺序依次执行。也可以指定该任务执行到中间的某个阶段结束。
Maven 的内部有三个构建生命周期,分别是 clean, default, site。
周期之间互相独立,周期内的阶段有前置依赖。
如何使用构建生命周期来完成构建工作?
使用mvn命令,如执行mvn install命令,将完成validate, compile, test, package, verify, install阶段
也可以指定多个阶段,如执行mvn clean deploy命令,首先完成的clean lifecycle,将以前构建的文件清理,然后再执行default lifecycle的validate, compile, test, package, verify, insstall, deploy 阶段,将package阶段创建的包发布到远程仓库中。
什么是插件?
生命周期只是抽象的概念,具体Maven对工程的所有操作实实在在的都是由插件来完成的。一个插件可以支持多种功能,称之为目标(goal),例如:compiler插件有两个目标:compile和testCompile,分别实现编译源代码和编译测试代码。
生命周期和插件的关系?
一个插件可能有一个或多个插件目标。生命周期的某个阶段可以绑定一个或多个插件目标;一个插件目标也可以绑定到一个或多个生命周期阶段。他们是多对多的关系。
如何绑定生命周期和插件?
1 | <plugin> |
- phase:阶段
- goal:插件目标
插件配置
配置插件目标的参数:
- 命令行插件配置:mvn install -Dmaven.test.skip=true
POM中插件全局配置:
1
2
3
4
5
6
7
8
9
10
11
12<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<!-- 利用属性传递版本号 -->
<version>${plugin.version}</version>
<configuration>
<!-- 设置编码 -->
<encoding>UTF-8</encoding>
<!-- 设置名称 -->
<warName>ROOT</warName>
</configuration>
</plugin>POM中插件目标配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23<!-- 依赖插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>compile</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<!-- ${project.build.directory}为Maven内置变量,缺省为target -->
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<!-- 表示是否不包含间接依赖的包 -->
<excludeTransitive>false</excludeTransitive>
<!-- 表示复制的jar文件去掉版本信息 -->
<stripVersion>true</stripVersion>
</configuration>
</execution>
</executions>
</plugin>
获取插件信息
- 在线查找插件:
目前,插件基本上都来源于两处,一个是 Apache;另一个是 Codehaus。因为 Maven 本身就来自 Apache 软件基金会,所有在 Apache 上有很多 Maven 的官方插件,而且每天有很多人在使用这些插件,这些插件都经过了很多项目的实际考验,所以它们比较可靠。 - 使用 maven-help-plugin 查看插件:
mvn help:describe -Dplugin=org.apache.maven.plugins:maven-site-plugin:3.4 -Ddetail
mvn help:describe -Dplugin=site -Dgoal=site -Ddetail
从命令行调用插件
mvn命令后面除了可以接多个phase外,也可以接多个goal
如:mvn dependency:tree 表示 执行dependency插件的tree目标
上述dependency并不是一个完整的插件坐标,那么如何找到对应的目标?
插件查库和依赖仓库是区分开的,Maven内置的额插件仓库配置:1
2
3
4
5
6
7
8
9
10
11
12
13
14<pluginRepositories>
<pluginRepository>
<id>central</id>
<name>Central Repository</name>
<url>http://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
<releases>
<updatePolicy>never</updatePolicy>
</releases>
</pluginRepository>
</pluginRepositories>
如果不指定groupId,那么默认是org.apache.maven.plugins
如果不指定version,那么默认是最新版本(包含快照)