首页 > 代码库 > Maven学习笔记(六):生命周期与插件
Maven学习笔记(六):生命周期与插件
何为生命周期:
当用户有特殊须要的时候,也能够配置插件定制构建行为。甚至自己编写插件。
生命周期具体解释:
- pre-clean:运行一些清理前须要完毕的工作
- clean:清理上一次构建生成的文件
- post-clean:运行一些清理后须要完毕的工作
- validate
- initialize
- generate-source
- process-sources:处理项目主资源文件。
一般来说。是对src/main/resource文件夹的内容进行变量替换等工作后,拷贝到项目输出的主classpath文件夹中。
- generate-resources
- process-resources
- compile:编译项目的源码。一般来说,是编译src/main/java文件夹下的Java文件至项目输出的主classpath文件夹中
- process-classes
- generate-test-sources
- process-test-sources:处理项目測试资源文件。一般来说,是对src/test/resource文件夹的内容进行变量替换等工作后,拷贝到项目输出的主classpath文件夹中。
- generate-test-resources
- process-test-resources
- test-compile:编译项目的測试代码。
一般来说。是编译src/test/java文件夹下的Java文件至项目输出的測试classpath文件夹中
- process-test-classes
- test:使用单元測试框架执行測试,測试代码不会被打包或部署
- prepare-package
- package:接受编译好的代码,打包成可公布的版本号,如JAR
- pre-integration-test
- integration-test
- post-integration-test
- verify
- install:将包安装到Maven本地仓库,供本地其它Maven项目使用
- deploy:将终于的包拷贝到远程仓库,供其它开发者和Maven项目使用
- pre-site:运行一些在生成项目网站之前须要完毕的工作
- site:生成项目网站文档
- post-site:运行一些在生成项目网站之后须要完毕的工作
- site-deploy:将生成的项目网站公布到server上
- $mvn clean : 该命令调用clean生命周期的clean阶段。实际运行的阶段为clean生命周期的pre-clean和clean阶段
- $mvn test:该命令调用default生命周期的test阶段。
实际运行的阶段为default生命周期的validate、initialize等。直到test的全部阶段。这也解释了为什么在运行測试的时候。项目的代码可以自己主动得以编译
- $mvn clean install:该命令调用clean生命周期的clean阶段和default生命周期的install阶段。实际运行的阶段为clean生命周期的pre-clean、clean阶段,以及default生命周期的从validate至install的全部阶段。该命令结合了两个生命周期。在运行真正的项目构建之前清理项目是一个非常好的实践
- $mvn clean deploy site-deploy:该命令调用clean生命周期的clean阶段。default生命周期的deploy阶段。以及site生命周期的site-deploy周期。
实际运行的阶段为clean生命周期的pre-clean、clean阶段,default生命周期的全部阶段,以及site生命周期的全部阶段。该命令结合了Maven全部三个生命周期,且deploy为default生命周期的最后一个阶段,site-deploy为site生命周期的最后一个阶段。
插件目标:
它可以分析项目依赖。帮助找出潜在的无用依赖;它可以列出项目的依赖树。帮助分析依赖来源;它可以列出项目全部已解析的依赖,等等。
为每一个这种功能编写一个独立的插件显然是不可取的,由于这些任务背后有非常多可以复用的代码。因此。这些功能聚集在一个插件里。每一个功能就是一个插件目标。
插件绑定:
生命周期阶段 | 插件目标 |
pre-clean clean post-clean | maven-clean-plugin:clean |
生命周期阶段 | 插件目标 |
pre-site site post-site site-deploy | maven-site-plugin:site maven-site-plugin:deploy |
基于该打包类型的项目。其default生命周期的内置插件绑定关系及详细任务例如以下:
生命周期阶段 | 插件目标 |
process-resources compile process-test-resources test-compile test package install deploy | maven-resources-plugin:resources maven-compiler-plugin:compile maven-resources-plugin:testResources maven-compiler-plugin:testCompile maven-surefire-plugin:test maven-jar-plugin:jar maven-intall-plugin:install maven-deploy-plugin:deploy |
一个常见的样例是创建项目的源代码jar包。内置的插件绑定关系中并没有涉及这一任务。因此须要用户自行配置。maven-source-plugin可以帮助我们完毕该任务,它的jar-no-fork目标可以将项目的主代码打包成jar文件,可以将其绑定到default生命周期的verify阶段上,在运行完集成測试后和安装构件之前创建源代码jar包。
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <version>2.1.1</version> <executions> <execution> <id>attach-sources</id> <phase>verify</phase> <goals> <goal>jar-no-fork</goal> <goals> <execution> <executions> <plugin> <plugins> <build>
插件配置:
于是,在执行命令的时候。加上例如以下-D參数就能跳过測试:
比如。我们通常须要配置maven-compiler-plugin告诉它编译Java 1.5版本号的源文件,生成与JVM 1.5兼容的字节码文件。代码例如以下:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.1</version> <configuration> <source>1.5</source> <target>1.5</target> </configuration> <plugin> <plugins> <build>
POM中插件任务配置:
以maven-antrun-plugin为例,它有一个目标run。能够用来在Maven中调用Ant任务。用户将maven-antrun-plugin:run绑定到多个生命周期阶段上,再加上不同的配置,就能够让Maven在不同的生命周期运行不同的任务,代码例如以下:
<build> <plugins> <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>I'm bound to validate phase.</echo> </tasks> </configuration> <execution> <execution> <id>ant-verify</id> <phase>verify</phase> <goals> <goal>run</goal> <goals> <configuration> <tasks> <echo>I'm bound to verify phase.</echo> </tasks> </configuration> <execution> <executions> <plugin> <plugins> <build>
获取插件信息:
从上图中能够看到,surefire:test skip參数的表达式为${maven.test.skip}。它表示能够在命令行以-Dmaven.test.skip=true的方式配置该目标。
并非全部插件目标參数都有表达式。也就是说,一些插件目标參数仅仅能在POM中配置。
比如:
从命令行调用插件:
除了选项之外,mvn命令后面能够加入一个或者多个goal和phase,它们各自是指插件目标和生命周期阶段。maven支持从命令行调用插件目标是由于有些任务不适合绑定在生命周期上,比如:maven-help-plugin:descirbe,我们不须要在构建项目的时候去描写叙述插件信息。又如maven-denpendency-plugin:tree。我们也不须要在构建项目的时候去显示依赖树。因此这些插件目标应该通过例如以下方式使用:
插件解析机制:
不同于repositories及其respository子元素,插件的远程仓库使用pluginRepositories和pluginRepository配置。比如,Maven内置了例如以下的插件远程仓库配置。
<pluginRepositories> <pluginRepository> <id>central</id> <name>Maven Plugin Repository <url>http://repo1.maven.org/maven2</url> <layout>default</layout> <snapshots> <enabled>false</enabled> </snapshots> <releases> <updatePolicy>never</updatePolicy> </releases> </pluginRepository>
仅仅有在非常少的情况下,项目使用的插件无法在中央仓库找到,或者自己编写了插件。这个时候可以參考上述的配置。在POM或者settings.xml中增加其它的插件仓库配置。
Maven会遍历本地仓库和全部远程插件仓库,将该路径下的仓库元数据归并后,就能计算出latest和release的值。latest表示全部仓库中该构件的最新版本号。而release表示最新的非快照版本号。在Maven3中,会使用release版本号。
Maven学习笔记(六):生命周期与插件