Maven pom.xml plugins plugin配置 构建插件详解

1次阅读

maven插件必须配置在下才执行,仅声明模板;maven-compiler-plugin需匹配jdk版本,推荐用;插件执行靠绑定阶段,多execution需设独立id/phase/goals;configuration字段名须严格按插件文档。

Maven pom.xml plugins plugin配置 构建插件详解

plugin 元素必须嵌套在 <build><plugins></plugins></build> 里,不是 <pluginmanagement></pluginmanagement>

很多人把插件配置写在 <pluginmanagement></pluginmanagement> 下就以为生效了,结果 mvn compile 完全不触发。它只管“声明模板”,真正启用得在 <plugins></plugins> 里显式写一遍。

  • <pluginmanagement></pluginmanagement> 是给子模块统一约定版本和默认配置的,本身不执行
  • 如果项目是单模块,直接删掉 <pluginmanagement></pluginmanagement> 套壳,把 <plugin></plugin> 放到 <build><plugins></plugins></build>
  • 多模块时,父 POM 写 <pluginmanagement></pluginmanagement>,子 POM 在自己 <build><plugins></plugins></build> 中引用(只需写 <groupid></groupid><artifactid></artifactid>,版本自动继承

maven-compiler-plugin<source></source><target></target> 必须匹配 JDK 实际版本

设成 17 却用 JDK 11 编译,会报 Unsupported class file major version 61;反过来用 JDK 17 编译但设成 8,可能漏掉 varsealed 等语法支持。

  • 推荐显式指定 <release></release>(JDK 9+),比如 <release>17</release>,它比 <source></source>+<target></target> 更严格,能防止意外调用高版本 API
  • ide(如 IntelliJ)可能缓存旧编译配置,改完 pom 后要刷新 Maven 项目,否则仍按旧规则编译
  • spring Boot 3.x 要求最低 JDK 17,此时 <release>17</release> 是安全底线

插件执行阶段由 <executions></executions> 绑定,不写就只走默认生命周期绑定

比如 maven-surefire-plugin 默认绑定 test 阶段,但你想在 verify 阶段再跑一遍覆盖率,就得手动 <execution></execution> 并指定 <phase>verify</phase>

  • 没配 <executions></executions> 时,插件按自身文档定义的默认 phase 执行(查官网或 mvn help:describe -Dplugin=xxx
  • 一个插件可配多个 <execution></execution>,每个带独立 <id></id><phase></phase><goals></goals>,适合分场景定制
  • 误删 <goals></goals> 会导致该 execution 什么也不做,尤其注意 copy-paste 时漏掉这层

configuration 里传参不等于 Java 属性名,得看插件文档实际字段

例如 maven-jar-plugin<archive></archive> 是顶层配置项,里面嵌 <manifest></manifest>,再嵌 <adddefaultimplementationentries></adddefaultimplementationentries> —— 这些名字不是随意起的,错一个字母或层级就无效。

  • 最稳的方式:运行 mvn help:describe -Dplugin=maven-jar-plugin -Ddetail,看输出里的 Configuration 表格
  • 常见陷阱:<skip></skip> 多数插件用 true/false,但 maven-deploy-plugin<skipdeploy></skipdeploy>maven-install-plugin<skipinstall></skipinstall>,不能统一套用
  • xml 配置对缩进无感,但大小写敏感,<excludes></excludes> 写成 <excludes></excludes> 就静默失效

事情说清了就结束。真正麻烦的是插件之间隐式依赖和执行顺序——比如 maven-resources-plugin 输出的文件被 maven-compiler-plugin 读取,中间夹了个自定义插件却没声明 <phase></phase>,就容易乱序。这种问题只能靠 mvn clean compile -X 看 debug 日志定位。

text=ZqhQzanResources