首页 > 代码库 > 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插件