您的位置:首页 > 其它

【maven实战】16-插件目标与插件绑定

2018-02-04 15:43 357 查看
maven的核心仅仅定义了抽象的生命周期,具体的任务是交由插件完成的,插件以独立的构件形式存在,因此maven核心的分发包只有3M左右,maven会在需要的时候下载并使用插件。

对于插件本身,为了能够服用代码他往往能够完成多个任务。例如maven-dependency-plugin,它能够基于项目依赖做很多事情。它能够分析项目依赖,帮助找出潜在的无用依赖等等;它能列出项目的依赖树,帮助分析依赖来源;它能够列出项目所有已解析的依赖等等。为每个这样的功能编写一个独立的插件显然是不可取的,因为这些任务背后有很多可以复用的代码,因此这些功能聚集在一个插件里,每个功能就是一个插件目标

maven-dependency-plugin有十多个目标,每个目标对应了一个功能,上述提到的几个功能分别对应的插件目标为dependency:analyze,dependency:tree,dependency:list。这是一种通用的写法,冒号前面是插件前缀,冒号后面是该插件的目标。

maven的生命周期与插件相互绑定,用以完成实际的构建任务。具体而言是生命周期的阶段与插件目标项目绑定,以完成某个具体的构建任务。例如项目编译这一任务它对应了default生命周期的compile这一阶段,而maven-compiler-plugin这一插件的compile目标能够完成个该任务。因此将他们绑定就能实现项目编译的目的,如下图:



内置绑定:为了能让用户几乎不用配置就能构建maven项目,maven核心为一些主要的生名周期阶段绑定了很多插件目标,当用户通过命令行调用生命周期阶段的时候,对应的插件目标就会执行相应的任务。

Maven在核心为一些主要的生命周期阶段绑定了很多插件的目标

clean生命周期阶段与插件目标的绑定关系

生命周期阶段插件目标
pre-clean 
cleanmaven-clean-plugin:clean
post-clean 
site生命周期阶段与插件目标的绑定关系 

生命周期阶段插件目标
pre-site 
sitemaven-site-plugin:site
post-site 
site-deploymaven-site-plugin:deploy
default生命周期与内置插件绑定关系及具体任务(打包类型: jar)

生命周期阶段插件目标执行任务
process-resourcesmaven-resources-plugin:resources复制主资源文件至主输出目录
compilemaven-compile-plugin:compile编译主代码至主输出目录
process-test-resourcesmaven-resources-plugin:testRresources复制测试资源文件至测试输出目录
test-compilemaven-compiler-plugin:testCompile编译测试代码至测试输出目录
testmaven-surefire-plugin:test执行测试用例
packagemaven-jar-plugin:jar创建项目jar包
installmaven-install-plugin:install将项目输出构件安装到本地仓库
deploymaven-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>执行mvn命令
mvn clean install
从控制台输出可以看到在插件maven-jar-plugin插件执行jar目标后,紧接着执行verify阶段的jar-no-fork目标:
[INFO]
[INFO] --- maven-jar-plugin:2.3.2:jar (default-jar) @ bus-location ---
[INFO] Building jar: G:\bus-location\target\bus-location-1.0.jar
[INFO]
[INFO] --- maven-source-plugin:2.1.1:jar-no-fork (attach-sources) @ bus-location
--- 当执行verify生命周期阶段的时候,maven-source-plugin:jar-no-fork会得以执行,他会创建一个以-sources.jar结尾的源码文件包。

有时候即使不同过phase元素配置生命周期阶段,插件目标也能够绑定到生命周期中去。例如可以删除上述配置中的phase一行,再次自行mvn verify仍然可以看到maven-source-plugin:jar-no-fork得以执行。出现这种现象的原因是:有很多插件的目标在编写时已经定义了默认绑定阶段。可以使用maven-help-plugin查看插件详细信息,了解插件目标的默认绑定阶段。运行命令如下:
mvn help:describe -Dplugin=org.apache.maven.plugins:maven-source-plugin:2.1.1 -Ddetail
source:jar-no-fork
Description: This goal bundles all the sources into a jar archive. This
goal functions the same as the jar goal but does not fork the build and is
suitable for attaching to the build lifecycle.
Implementation: org.apache.maven.plugins.source.SourceJarNoForkMojo
Language: java
Bound to phase: package
也就是说当用户配置使用maven-source-plugin:jar-no-fork目标的时候,如果不指定phase参数,该目标就会被绑定到package阶段。

在描述插件的时候,还可以省去版本信息,让Maven自动获取最新版本来进行表述,例如:
$ mvn help:describe -Dplugin=org.apache.maven.plugins:maven-compiler-plugin
进一步简化,可以使用插件目标前缀替换坐标:
$ mvn help:describe -Dplugin=compiler
如果想仅仅描述某个插件目标的信息,可以加上goal参数:
$ mvn help:describe -Dplugin=compiler -Dgoal=compile
如果想让maven-help-plugin输出更详细的信息,可以加上detail参数:
$ mvn help:describe -Dplugin=compiler -Ddetail
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: