一、基础构建三件套

插件 作用 核心绑定阶段
maven-compiler-plugin 编译 Java 源码(指定 JDK 版本) compiletest-compile
maven-surefire-plugin 执行单元测试(JUnit/TestNG) test
maven-jar-plugin 打普通 JAR 包(可指定 Main-Class) package

1. maven-compiler-plugin

指定 JDK 版本

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.11.0</version>
    <configuration>
        <source>17</source>   <!-- 源码兼容版本 -->
        <target>17</target>   <!-- 生成字节码版本 -->
        <encoding>UTF-8</encoding>
    </configuration>
</plugin>

2. maven-surefire-plugin

跳过测试/指定测试类

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>3.0.0-M9</version>
    <configuration>
        <skipTests>false</skipTests>          <!-- 是否全部跳过 -->
        <includes>
            <include>**/*Test.java</include>   <!-- 只跑特定命名 -->
        </includes>
    </configuration>
</plugin>

二、打包与部署类

插件 作用 适用场景
maven-war-plugin 打 WAR 包(Web 项目) Spring Boot 传统部署(外置 Tomcat)
spring-boot-maven-plugin Spring Boot 可执行 JAR/WAR Spring Boot 项目(内置 Tomcat)
maven-assembly-plugin 打包成含依赖的 "胖 JAR"(含所有 jar) 非 Spring Boot 项目需要独立运行
maven-deploy-plugin 上传 jar 到远程仓库(私服) 团队内部发布共用库

3. spring-boot-maven-plugin

Spring Boot 标配

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <version>2.7.0</version>
    <executions>
        <execution>
            <goals>
                <goal>repackage</goal>   <!-- 将普通 jar 重打成可执行 jar -->
            </goals>
        </execution>
    </executions>
</plugin>

执行 mvn package 后会在 target 生成 xxx.jarxxx.jar.original(原始包)。

4. maven-assembly-plugin

自定义胖包

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>3.6.0</version>
    <configuration>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        <archive>
            <manifest>
                <mainClass>com.example.Main</mainClass>
            </manifest>
        </archive>
    </configuration>
    <executions>
        <execution>
            <phase>package</phase>
            <goals><goal>single</goal></goals>
        </execution>
    </executions>
</plugin>

执行后生成 xxx-jar-with-dependencies.jar,含所有第三方依赖。


三、代码质量与规范类

插件 作用
maven-checkstyle-plugin 检查代码风格(是否符合 Google/Sun 规范)
maven-pmd-plugin 静态代码分析(找潜在 bug、重复代码)
jacoco-maven-plugin 单元测试覆盖率报告(生成 HTML 报表)

5. jacoco-maven-plugin

测试覆盖率

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.8.10</version>
    <executions>
        <execution>
            <goals>
                <goal>prepare-agent</goal>   <!-- 运行时注入监控 -->
            </goals>
        </execution>
        <execution>
            <id>report</id>
            <phase>verify</phase>
            <goals><goal>report</goal></goals>
        </execution>
    </executions>
</plugin>

执行 mvn verify 后生成 target/site/jacoco/index.html


四、代码生成与资源处理类

插件 作用
maven-resources-plugin 复制/过滤资源文件(支持占位符替换)
maven-antrun-plugin 在 Maven 生命周期中执行 Ant 脚本(灵活定制)
maven-dependency-plugin 复制/解压依赖到指定目录

6. maven-dependency-plugin

将依赖复制到 lib 目录

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>3.6.0</version>
    <executions>
        <execution>
            <id>copy-dependencies</id>
            <phase>package</phase>
            <goals><goal>copy-dependencies</goal></goals>
            <configuration>
                <outputDirectory>${project.build.directory}/lib</outputDirectory>
                <includeScope>runtime</includeScope>
            </configuration>
        </execution>
    </executions>
</plugin>

常用于非 Spring Boot 项目,将 jar 分离到 lib 文件夹。


五、辅助开发类

插件 作用 常用命令
maven-help-plugin 查看 POM 生效配置、激活的 profile mvn help:effective-pom
maven-enforcer-plugin 强制规则检查(如 Maven 版本、JDK 版本) 构建时自动执行
build-helper-maven-plugin 添加额外源码目录、解析版本号 多模块项目

7. maven-enforcer-plugin

禁止用 Java 8 以下构建

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-enforcer-plugin</artifactId>
    <version>3.4.0</version>
    <executions>
        <execution>
            <id>enforce-java</id>
            <goals><goal>enforce</goal></goals>
            <configuration>
                <rules>
                    <requireJavaVersion>
                        <version>[17,)</version>
                    </requireJavaVersion>
                </rules>
            </configuration>
        </execution>
    </executions>
</plugin>

六、插件命令

有些插件无需在 pom.xml 中配置,直接在命令行使用:

命令 作用
mvn dependency:tree 查看依赖树(排查冲突)
mvn dependency:analyze 分析未使用/缺失的依赖
mvn help:effective-pom 查看合并后的最终 POM
mvn clean + mvn compile 等基础命令(由 core plugins 隐式提供)

七、插件管理实践

1. 统一版本管理(在 <pluginManagement> 中)

父 POM 中声明版本,子模块只用 <plugin> 不加版本号:

<pluginManagement>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.11.0</version>
        </plugin>
    </plugins>
</pluginManagement>

2. 查看当前项目用到的所有插件

mvn help:effective-pom | grep "artifactId"   # 或直接打开 target 目录查看

八、总结

插件是 Maven 的“手脚”
- 编译用 compiler,测试用 surefire,打包用 jar/war/spring-boot
- 代码质量用 pmd/checkstyle/jacoco
- 排查问题用 dependency/help

建议:先掌握前 3 个(compiler、surefire、spring-boot/assembly),其余按需引入即可。