03-插件机制

Catalogue
  1. 1. 插件目标
  2. 2. 插件绑定
  3. 3. 插件配置
  4. 4. 插件解析机制
  5. 5. 参考资料

插件目标

上面提到Maven的核心仅仅是定义了抽象的生命周期,具体的任务交由插件完成的,插件以独立的构件形式存在,Maven会在需要时下载。对于插件本身,为了能够复用代码,一个插件往往能完成多个任务,这样的每个任务对应插件的功能就是插件目标。如maven-dependency-plugin插件有十多个目标,下面dependency是插件前缀,冒号后面是该插件目标:

  • dependency:analyze 分析项目依赖,找无用依赖
  • dependency:tree 列出项目依赖树
  • dependency:list 列出所有已解析的依赖

插件绑定

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

为了能让用户不用任何配置就能构建Maven项目,Maven在核心的生命周期阶段默认榜定了插件目标,当用户通过命令行执行生命周期的阶段时,对应的插件目标就会执行相应任务。

用户也可以自定义配置生命周期阶段与插件目标的绑定,有很多插件的目标在编写时已经定义了默认绑定到生命周期的哪个阶段,可以通过maven-help-plugin查看插件详细信息。

1
mvn help:describe -Dplugin=org.apache.maven.plugins:maven-source-plugin:2.1.1 -Ddetail
  • clean生命周期内置绑定
生命周期阶段 插件目标
pre-clean maven-clean-plugin:clean
clean 同上
post-clean 同上

maven-clean-plugin就只有clean这一目标,就是删除项目的输出目录

  • site生命周期内置绑定
生命周期阶段 插件目标
pre-site maven-site-plugin:site
site 同上
post-site 同上
site-deploy maven-site-plugin:deploy
  • default生命周期内置绑定

由于项目打包类型会影响构建的具体过程,因此default生命周期的绑定是由打包类型决定的,默认是打包类型jar,其绑定关系如下:

生命周期阶段 插件目标
process-resources maven-resources-plugin:resources
compile maven-compiler-plugin:compile
process-test-resources maven-resource-plugin:testResources
test-compiler maven-compiler-plugin:testCompile
test maven-surefire-plugin:test
package maven-jar-plugin:jar
install maven-install-plugin:install
deploy maven-deploy-plugin:deploy

插件配置

完成了插件与生命周期的绑定后,用户还可以调整插件目标的参数,从而调整插件目标所执行的任务,以满足项目需要。

  1. 命令行插件配置

使用参数-D,并伴随一个参数键=参数值的形式来配置,如mave-surefire-plugin提供了一个maven.test.skip参数,其值为true时,就会跳过测试

1
mvn install -Dmaven.test.skip=true

参数-D是Java自带的,其功能是通过命令行设置一个Java系统属性,Maven在准备插件时会检查该系统属性。

  1. pom中插件全局配置

如mave-compiler-plugin插件配置编译版本,可通过全局配置

1
2
3
4
5
6
7
8
9
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>

另外该插件提供了简化的指定属性,即可实现配置

1
2
3
4
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
  1. pom中插件任务配置

暂时没找到合适的例子

插件解析机制

  1. 插件仓库

与依赖构件一样,插件构件同样基于坐标存储在Maven仓库中。Maven在需插件时,会先从本地仓库查找,不存在则从远程仓库查找,找到后下载到本地仓库使用。

不同于依赖构件的仓库配置元素repositories及repository,插件的远程仓库使用pluginRepositories及pluginRepository配置。

  1. 插件默认groupId

在pom中配置插件时,如果该插件是Maven的官方插件,可省略groupId,解析时会自动用org.apache.maven.plugins补齐。

  1. 解析插件版本

为了简化插件配置,可以省略插件版本号,此时Mave会从超级Pom中集成,所有项目都继承了这个超级pom的配置,Maven在超级pom中为所有核心插件设定了版本。

  1. 解析插件前缀

不需理解

参考资料