maven之生命周期和插件

来源:互联网 发布:流行朋克知乎 编辑:程序博客网 时间:2024/05/16 06:54

1、生命周期和插件的关系

maven的生命周期为所有的建构过程进行了抽象和统一,包括清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成等,但是生命周期是抽象的,所以生命周期并不实际实现这些操作,而这些实际的操作步骤就是由插件来完成。其中每个建构步骤都可以绑定一个或多个插件行为,而且maven为大多数的建构步骤已经绑定了默认的插件,例如,针对编译的插件有maven-compiler-plugin,针对测试的插件有maven-surefire-plugin等,有些情况下用户甚至可以自己编写插件。

2、插件目标

一般一个插件往往能完成多个任务(功能),例如maven-dependency-plugin,它既能够分析项目依赖,帮助找出潜在的无用依赖;还能够列出项目的依赖树,帮助分析依赖来源;除此之外,它还能列出项目所有已介系的依赖等。

如果每一个功能就编写一个插件,则太过繁琐,而且每个功能里面有很多可以复用的代码,所以解决办法就是将某些功能集成在一个插件里面实现,这里面的一个功能就是一个插件目标。

插件目标的描述方法:compiler:compile,表示的是maven-compiler-plugin的compile目标。

3、细节关系

maven生命周期和插件的绑定关系其实是基于生命周期里面的阶段和插件里面的目标的绑定来实现的。


上图说明了default、生命周期中的compile阶段是与maven-compiler-plugin插件的compile目标绑定的。

4、maven默认绑定

用户在使用的时候一般都没有注意到上述的绑定关系,这是因为maven已经内置默认绑定了,以下是三个生命周期各自与插件目标的默认绑定关系:




5、用户自定义绑定

除了maven默认绑定外,当然也应该让用户可以自己选择某个插件目标绑定到生命周期的某个阶段上,可以使用pom文件中<build>元素,以下是创建项目的源码jar包,内置的插件没有绑定这一任务(功能):

<pre name="code" class="html"><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artfactId>maven-source-plugin</artfactId><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>
该例中使用maven-sources-plugin插件,用<plugin>元素指定,executions下每一个execution子元素可以用来配置一个任务,该例中<execution>元素配置了一个id为attach-sources的任务(这个id可以任意定,但唯一?),并且通过<phase>指定将其绑定到default生命周期verify阶段上,最后通过<goals>配置指定要执行的插件目标

运行mvn verify,得到:


可以看到,当执行verify阶段的时候,maven-sources-plugin:jar-no-fork目标会执行,创建一个亿source.jar结尾的源码jar包。

注意:有时不一定需要<phase>元素,插件目标仍然能够绑定到生命周期中去。例如上例中去掉<phase>元素,再执行mvn verify,仍然得到一样的结果。因为很多插件目标在编写的时候定义了默认绑定阶段(可以使用maven-help-plugin查看插件详细信息)。运行名利:mvn help:describe -Dplugin=groupId:artfactId:version -Ddetail

6、插件配置

  • 从命令行

在日常使用的过程中,一般从命令行中设置插件,使用“-D参数键=参数值”来配置

eg.mvn install -Dmaven.test.skip=true

运行该命令,在再install的过程中跳过测试阶段。

  • 从pom文件

如果一些插件的配置很少改变,则可以配置在pom文件中,不用每次输入命令行进行配置。

<pre name="code" class="html"><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artfactId>maven-source-plugin</artfactId><version>2.1.1</version><configuration><source>1.5</source><target>1.5</target></configuration></plugin></plugins></build>
该例中<source>的含义是maven-compiler-plugin所要编译的源文件是java1.5版本的,而<target>的含义是在maven-compiler-plugin在进行编译的时候都是基于java1.5版本进行编译的,不管是编译源代码还是编译测试代码。



0 0