【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生命周期阶段与插件目标的绑定关系
site生命周期阶段与插件目标的绑定关系
default生命周期与内置插件绑定关系及具体任务(打包类型: jar)
自定义绑定:除了内置绑定以外,用户还能够自己选择将某个插件目标绑定到生命周期的某个阶段上,一个常见的例子是创建项目的源码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命令
[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
在描述插件的时候,还可以省去版本信息,让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
对于插件本身,为了能够服用代码他往往能够完成多个任务。例如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 | |
clean | maven-clean-plugin:clean |
post-clean |
生命周期阶段 | 插件目标 |
---|---|
pre-site | |
site | maven-site-plugin:site |
post-site | |
site-deploy | maven-site-plugin:deploy |
生命周期阶段 | 插件目标 | 执行任务 |
---|---|---|
process-resources | maven-resources-plugin:resources | 复制主资源文件至主输出目录 |
compile | maven-compile-plugin:compile | 编译主代码至主输出目录 |
process-test-resources | maven-resources-plugin:testRresources | 复制测试资源文件至测试输出目录 |
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>
<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
相关文章推荐
- 插件目标[置顶] Maven自定义绑定
- Maven之——插件目标及绑定、命令行调用插件、目标前缀(插件前缀解析策略)、插件解析运行机制
- Maven自定义绑定插件目标:创建项目的源码jar
- Maven之——插件目标及绑定
- Maven之——插件目标及绑定
- Maven3实战笔记04Maven的生命周期和插件
- Maven实战(七)——常用Maven插件介绍(上)
- Maven实战(七)——常用Maven插件介绍(上)
- Maven 实战 04 生命周期和插件
- Maven自定义绑定插件
- Maven的生命周期,阶段,插件,目标的关系
- Maven(插件配置和生命周期的绑定)
- DOS下使用maven的archetype:generate插件目标来创建maven项目的小结(maven3.0以后的版本)
- Maven 实战 06 插件
- Maven实战(八)常用Maven插件介绍(下)
- Maven实战——常用Maven插件介绍
- 【maven实战】17-插件配置
- Maven 实战 04 生命周期和插件
- Maven的生命周期,阶段,插件,目标的关系
- [深入Maven源代码]maven绑定命令行参数到具体插件