YON Blog

Maven plugin 配置

使用 Maven 配置 plugin 时通常都是网上找现成的不太会研究每个配置的含义,这样导致的一个问题就是有自定义配置的需求的时候就不知道该怎么修改了。按 FAQ 的形式整理下相关知识。

Q:plugin 下面的 configuration 和 execution 下线的 configuration 的区别

A:plugin 下面的 configuration 是插件的全局配置,每个 execution 都会继承全局配置,但 execution 里可以覆盖全局的配置。需要注意的是,execution 的配置如果只是定义一个和全局配置一样的属性但是没有设置任何值,那么依然会使用全局的配置。如果你使用 IDEA,可以在 pom 文件上右击 - Maven - Show Effective POM 来查看最终生效的配置。

Q:lifecycle,phase,goal 什么关系?

A:Maven 定义了三套独立的 lifecycle:

  • clean:清理
  • defautl:编译构建
  • site:生成站点

每个 lifecycle 由一系列的 phase 构成。例如 clean 里有 pre-clean,clean,post-clean 三个 phase。

lifecycle 和 phase 是 Maven 本身定义的,goal 是插件定义的,所以 goal 是多种多样的。goal 可以绑定到一个默认的 phase,那么只要执行到这个 phase 就会触发插件这个 goal 的执行。

Q:execution 有什么用?

A:Maven 插件根据 execution 关联的配置来运行。

Maven 执行插件有两种方式,一个是从命令行直接执行,例如执行 jar 插件 mvn jar:jar,另一个是执行 phase 的时候触发对应插件执行,例如 mvn package 就会触发 jar 插件的执行。不管是哪种运行方式,Maven 都会找到一个或多个 execution 然后根据里面的配置运行相关 goal。

从命令行执行的时候会去看有没有 id 为 default-cli 的 execution,如果有就用它下面的配置执行(这时候 execution 里的 goal 是不起作用的,因为在命令行里我们就指定 goal 了),如果没有就创建一个默认的 execution 去执行。如果是通过 phase 触发插件执行,那么 Maven 就会根据 phase 找到与之关联的所有 execution 来执行插件(default-cli 的 execution 里如果有 phase,也会被找到),找到几个 execution 就执行几次插件。一些官方的插件还会去找 id 为 default-<goalName> 的 execution,如果有就会用其下面的配置运行,如果没有找到就会额外创建一个 execution 执行。

如果我们直接执行插件,那么要想修改配置有两种方式,一种是定义全局配置,另一个是定义一个 id 为 default-cli 的 execution 并在里面进行配置,定义全局配置的问题是会影响所有的 execution。

https://maven.apache.org/guides/mini/guide-default-execution-ids.html

https://maven.apache.org/guides/mini/guide-configuring-plugins.html#using-the-executions-tag

https://maven.apache.org/ref/3.6.1/maven-core/default-bindings.html

Q:不设置 id 时,id 是什么?

A:default。

https://stackoverflow.com/questions/34590452/what-is-the-implicit-id-of-a-maven-plugin-execution