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 | |
| clean | maven-clean-plugin:clean |
| post-clean |
site生命周期阶段与插件目标的绑定关系
| 生命周期阶段 | 插件目标 |
|---|---|
| pre-site | |
| site | maven-site-plugin:site |
| post-site | |
| site-deploy | maven-site-plugin:deploy |
default生命周期与内置插件绑定关系及具体任务(打包类型: jar)
| 生命周期阶段 | 插件目标 | 执行任务 |
|---|---|---|
| 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 | 将项目输出构件部署到远程仓库 |
自定义绑定:除了内置绑定以外,用户还能够自己选择将某个插件目标绑定到生命周期的某个阶段上,一个常见的例子是创建项目的源码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
990

被折叠的 条评论
为什么被折叠?



