首页 > 代码库 > Maven学习(四):生命周期与maven插件

Maven学习(四):生命周期与maven插件

一、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 生命周期(最重要)

1、各个阶段:

  • 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 指定端口。


3、插件介绍

1)Maven实战(七)——常用Maven插件介绍(上)

2)Maven实战(八)——常用Maven插件介绍(下)


Maven学习(四):生命周期与maven插件