生命周期和插件(六)
除了坐标、依赖以及仓库以外,maven另外两个核心概念是生命周期和插件。在有关maven的日常使用中,命令行的输入往往就对应了生命周期,如mvn package就表示执行默认生命周期阶段package。maven的生命周期是抽象的,其实际行为都由插件来完成,如package阶段的任务可能就会由maven-jar-plugin来完成。生命周期和插件两者协同工作,密不可分。
1.何为生命周期
maven的生命周期就是为了对所有的构建过程进行抽象和统一。maven从大量项目和构建工具中学习和反思,然后总结了一套高度完善的、易于扩展的生命周期。这个生命周期包含了项目的清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成等几乎所有构建步骤。也就是说,几乎所有项目的构建,都能映射到这样一个生命周期上。
2.生命周期详解
maven有用三套完全独立的生命周期,他们分别为clean、default、site。clean生命周期的目的是清理项目,default生命周期的目的是构建项目,而site生命周期的目的是建立项目站点。
每个生命周期包含一些阶段,这些阶段是有顺序的,并且后面的阶段依赖于前面的阶段。用户和maven最直接的交互方式就是调用这些生命周期阶段。
clean生命周期:
pre-clean:执行一些清理前需要完成的工作。
clean:清理上一次构建生成的文件。
post-clean:执行一些清理后需要完成的工作。
default生命周期:定义了真正构建时所需要执行的所有步骤,它是所有生命周期中最核心的部分,其包含的阶段如下:
validate:验证
initialize:初始化
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:将包安装到maven本地仓库,供本体其他maven项目使用。
deploy:将最终的包复制到远程仓库,供其他开发人员和maven项目使用。
site生命周期:site生命周期的目的是建立和发布项目站点,maven能够基于pom所包含的信息,自动生成一个友好的站点,方便团队交流和发布项目信息。
pre-site:执行一些在生成项目站点之前需要完成的工作。
site:生成项目站点文档。
post-site:执行一些在生成项目站点之后需要完成的工作。
site-deploy:将生成的项目站点发布到服务器上。
3.插件目标
对于相同的功能,其实现功能的代码会有大量的重复性,所以为了代码复用,会把有大量复用代码的功能都集中到一个插件中,插件中的每个功能就是一个目标,我们叫做插件目标。
4.插件绑定
maven生命周期与插件相互绑定,用以完成实际的构建任务,具体而言,是生命周期的阶段与插件的目标相互绑定,以完成某个具体的构建任务,
内置绑定:为了能让用户几乎不用任何配置就能构建maven项目,maven在核心为一些主要的生命周期阶段绑定了很多插件的目标,当用户通过命令行调用生命周期阶段的时候,对应的插件目标就会执行相应的任务。
内置的绑定:
clean阶段:maven-clean-plugin:clean
site阶段:maven-site-plugin:site
site-deploy:maven-site-plugin:deploy
process-resources:maven-resources-plugin:resources 复制主资源文件至主输出目录compile:maven-compiler-plugin:compile 编译主代码至主输出目录
process-test-resources:maven-resources-plugin:testResources 复制测试资源文件至测试输出目录
test-compile:maven-compiler-plugin:testCompile 编译测试代码至测试输出目录
test:maven-surefire-plugin:test 执行测试用例
package:maven-jar-plugin:jar 创建项目jar包
install:maven-install-plugin:install 将项目输出构件安装到本地仓库
deploy:maven-deploy-plugin:deploy将项目输出构件部署到远程仓库
自定义绑定:
构建过程个性化设置,插件的参数设置等,用于定制构建生命周期中的个性化设置
<build>
声明构建过程中使用的多个插件,插件的目标,用于个性化构建配置
<plugins>
声明单个插件,并定义我们想要的插件行为,本例插件配置功能为,在构建的package阶段的工作完成后,阶段结束前,通过maven-shade-plugin插件的shade目标,设置构建出的jar包为可以通过java -jar执行的含有main方法的构件(大致过程是:package目标生成构件之后,shade按照配置中指定的条件生成新的jar,并且把package生成的jar修改名称,shade生成的构件替换掉package生成的构件,并且shard生成的构件按照配置在META-INF/MANIFEST.MF文件中设置属性Main-Class: com.shw.mvnp.mvnphelloworld.HelloWorld,这是Java -jar运行的必要条件)
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>1.2.1</version>
插件执行配置 可以包含多个任务
<executions>
插件任务执行配置
<execution>
任务名称
<id>MainClass</id>
生命周期阶段 可以由不同的插件实现相同阶段,不同的功能
阶段绑定
<phase>package</phase>
目标集合
<goals>
插件目标:一个插件可以有多个目标,相当于方法调用,本阶段要执行的插件目标,当多个插件目标绑定到同一个生命周期阶段,执行顺序是按照插件的声明顺序执行
<goal>shade</goal>
</goals>
相应任务需要的参数配置
<configuration>
<transformers>
<transformer implementation =
"org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.shw.test.testmaven.App</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
5.插件配置
命令行插件配置:mvn clean install -Dmaven.test.skip=true
-D是java自带的,功能是通过命令行设置一个java系统属性,maven在准备插件的时候会检查系统属性,实现插件参数的功能
POM中插件全局配置:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
全局插件参数配置,生成1.5的编译文件
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
POM中插件任务配置:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.3</version>
<executions>
<execution>
<id>ant-validate</id>
<phase>validate</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<echo>to validate</echo>
</tasks>
</configuration>
</execution>
<execution>
<id>ant-verify</id>
<phase>verify</phase>
<goals>
<goal>run</goal>
</goals>
特定任务的配置
<configuration>
<tasks>
<echo>to verify</echo>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
6.获取插件信息
命令行查看插件命令:
mvn help:describe -Dplugin=org.apache.maven.plugins:maven-source-plugin:2.1.1 ->获取插件的简要信息
mvn help:describe -Dplugin=org.apache.maven.plugins:maven-source-plugin ->自动获取最新版本的简要信息
mvn help:describe -Dplugin=org.apache.maven.plugins:maven-source-plugin:2.1.1 -Ddetail ->输出对应插件的详细信息
bound to phase:表示该目标默认绑定的生命周期阶段
mvn help:describe -Dplugin=compiler ->描述插件的前缀形式
goal prefix:插件的前缀信息
mvn help:describe -Dplugin=compiler -Dgoal=compile ->描述插件的指定目标的信息
mvn dependency:tree ->执行插件的指定目标7.插件解析
关于插件的使用,maven插件远程仓库配置,插件仓库管理和普通依赖不同仓库
<pluginRepositories>
<pluginRepository>
<id>central</id>
<name>Maven Plugin Repository</name>
<url>http://repo1.maven.org/maven2/</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
<releases>
<updatePolicy>never</updatePolicy>
</releases>
</pluginRepository>
</pluginRepositories>
<pluginGroups>
pluginGroup 插件组,插件是按照组来管理的 比如org.apache.maven.plugins是一个组,maven搜索插件的时候,插件的元数据文件是在组下保存管理的,指定用于插件查找的另一个组标识符。
<pluginGroup>com.your.plugins</pluginGroup>
</pluginGroups>
插件的元数据文件位于groupId的对应路径下,maven-matedata.xml。