一、maven 生命周期
(一)简介
Maven强大的一个重要的原因是它有一个十分完善的生命周期模型(lifecycle),这个生命周期可以从两方面来理解:
1、顾名思义,运行Maven的每个步骤都由它来定义的,这种预定义的默认行为使得我们使用Maven变得简单,相比而言,Ant的每个步骤都要你手工去定义。
2、这个模型是一种标准,在不同的项目中,使用Maven的接口是一样的,这样就不用去仔细理解每个项目的构建了,一般情况下,mvn clean install 这样的命令是通用的。
3、一个Maven 的生命周期,可以分为若干个阶段。如 Clean 生命周期,就有3个阶段。
(二)生命周期的类型
1、Maven有三套相互独立的生命周期,这三套生命周期分别是:
- Clean Lifecycle 在进行真正的构建之前进行一些清理工作。
- Default Lifecycle 构建的核心部分,编译,测试,打包,部署等等。
- Site Lifecycle 生成项目报告,站点,发布站点。
2、它们是相互独立的,你可以仅仅调用clean来清理工作目录,仅仅调用site来生成站点。当然你也可以直接运行 mvn clean install site 运行所有这三套生命周期。
3、每套生命周期都由一组阶段(Phase)组成,我们平时在命令行输入的命令总会对应于一个特定的阶段。比如,运行mvn clean ,这个的clean 是 Clean 生命周期的一个阶段。这个很重要。
4、阶段运行规则:在一个生命周期中,运行某个阶段的时候,它之前的所有阶段都会被运行,也就是说,mvn clean 等同于 mvn pre-clean clean ,如果我们运行 mvn post-clean ,那么 pre-clean,clean 都会被运行。这是Maven很重要的一个规则,可以大大简化命令行的输入。
(三)Clean 生命周期
1、Clean生命周期一共包含了三个阶段:
pre-clean 执行一些需要在clean之前完成的工作
clean 移除所有上一次构建生成的文件(命令行经常输入的 mvn clean)
post-clean 执行一些需要在clean之后立刻完成的工作
2、mvn clean 中的clean就是上面的clean阶段。
(四)Site 生命周期
Site生命周期的各个阶段
pre-site 执行一些需要在生成站点文档之前完成的工作
site 生成项目的站点文档
post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
site-deploy 将生成的站点文档部署到特定的服务器上
(五)Default 生命周期(最重要)
validate
generate-sources
process-sources
generate-resources
process-resources 复制并处理资源文件,至目标目录,准备打包。
compile 编译项目的源代码。
process-classes
generate-test-sources
process-test-sources
generate-test-resources
process-test-resources 复制并处理资源文件,至目标测试目录。
test-compile 编译测试源代码。
process-test-classes
test 运行测试。
prepare-package
package 打包成可发布的格式,如 JAR 。
pre-integration-test
integration-test
post-integration-test
verify
install 将包安装至本地仓库,以让其它项目依赖。
deploy 将最终的包复制到远程的仓库。
基本上,根据名称我们就能猜出每个阶段的用途。
(六)插件与生命周期
1、生命周期以及各个阶段,是通过插件的运行而实现的。
2、插件的目标可以捆绑生命周期的阶段。如maven-clean-plugin插件的 clean 目标绑定了Clean 生命周期的 clean 阶段。这样命令行输入 mvn clean 命令,先定位到clean 阶段 ,然后执行 maven-clean-plugin插件中的 clean 目标。插件保存在仓库中:%仓库目录%\repository\org\apache\maven\plugins\ 。
二、maven 插件
(一)插件基础
1、插件目标
1)我们都知道Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给插件来完成,例如编译源代码是由maven- compiler-plugin完成的。
2)每个任务对应了一个插件目标(goal),每个插件会有一个或者多个目标,例如maven- compiler-plugin 的 compile 目标用来编译位于src/main/java/目录下的主源码,testCompile 目标用来编译位于src/test/java/目录下的测试源码。
2、可以通过两种方式调用Maven插件目标。
1)将插件目标与生命周期阶段(lifecycle phase)绑定(内置绑定与自定义绑定)。这样用户在命令行只是输入生命周期阶段而已,例如 Maven默认将 maven-compiler-plugin 的 compile 目标与 compile 生命周期阶段绑定,因此命令mvn compile实际上是先定位到 compile 这一生命周期阶段,然后再根据绑定关系调用 maven-compiler-plugin 的 compile 目标。
2)直接在命令行指定要执行的插件目标,例如mvn archetype:generate 就表示调用maven-archetype-plugin的 generate目标,这种带冒号的调用方式与生命周期无关。
3、Maven官方有两个插件列表:
1)GroupId为 org.apache.maven.plugins,这里的插件最为成熟,具体地址为:http://maven.apache.org/plugins/index.html。
2)GroupId为 org.codehaus.mojo,这里的插件没有那么核心,但也有不少十分有用,其地址为:http://mojo.codehaus.org/plugins.html。
(二)插件应用
1、maven-source-plugin 创建项目源码
1)插件目标与阶段的自定义绑定
<!-- 源码编译插件,实现自定义绑定 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.1.1</version>
<executions>
<execution><!-- 配置一个任务 -->
<id>attach-sources</id><!-- 任务id -->
<phase>verify</phase><!-- 生命周期的阶段 -->
<goals>
<goal>jar-no-fork</goal><!-- 阶段绑定的目标 -->
</goals>
</execution>
</executions>
</plugin>
这样在命令行输入 :mvn verify ,输出以下内容。即在执行 verify 生命阶段的时候,jar-no-fork 目标会得以执行,会创建一个-sources.jar 文件。
2)插件目标与阶段的内置绑定。(不通过 phase 元素配置生命周期阶段,插件目标也可以绑定到生命周期中)
①、删除上面 <phase>verify</phase> 这一行配置,再次执行 mvn verify 命令仍然可以看到插件执行。
②、命令行:mvn help:describe -Dplugin=org.apache.maven.plugins:maven-source-plugin:2.1.1 -Ddetail 查看插件详细信息,了解插件目标的内置绑定阶段。
③、maven-help-plugin 插件,查看其它插件的详细信息。mvn help:describe -Dplugin = source -Ddetail 可以简化命令。
2、maven-compiler-plugin 设定编译的JDK版本
1)配置插件目标的参数,-D 增加参数。
2)pom文件配置全局参数。
<!-- compiler插件, 设定JDK版本 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
<encoding>${project.charset}</encoding>
<showWarnings>true</showWarnings>
</configuration>
</plugin>
3)配置特定参数。<configuration>标签的位置不同。
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.7</version>
<executions>
<execution>
<id>upload-war-to-uat-server</id>
<phase>install</phase>
<configuration>
<tasks>
<ant antfile="${basedir}/bin/${project.install.phase}-ant.xml">
<target name="deploy" />
</ant>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
4) maven-antrun-plugin 插件,调用ant 任务。有一个目标 run 可以在 Maven 中调用 Ant 任务。
3、tomcat-maven-plugin tomcat插件,maven与tomcat的结合(maven项目在toncat中运行)。
1)配置
<!-- tomcat的插件 -->
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>tomcat-maven-plugin</artifactId>
<version>1.1</version>
<configuration>
<path>/${project.build.target.file.name}</path>
</configuration>
</plugin>
2)运行:tomcat:run 或者 tomcat:run -Dmaven.tomcat.port=8880 指定端口。