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

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,可能漏掉 var、sealed 等语法支持。
- 推荐显式指定
<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 日志定位。










