Maven 插件

什么是 Maven 插件?

Maven 插件是扩展 Maven 功能的组件,每个插件包含一个或多个目标(goals)。Maven 的核心功能都是通过插件实现的。

插件类型

常用核心插件

maven-compiler-plugin

编译 Java 源代码

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.11.0</version>
    <configuration>
        <source>11</source>
        <target>11</target>
        <encoding>UTF-8</encoding>
    </configuration>
</plugin>

maven-surefire-plugin

运行单元测试

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>3.0.0</version>
    <configuration>
        <includes>
            <include>**/*Test.java</include>
            <include>**/*Tests.java</include>
        </includes>
    </configuration>
</plugin>

maven-jar-plugin

创建 JAR 文件

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>3.3.0</version>
    <configuration>
        <archive>
            <manifest>
                <mainClass>com.example.Main</mainClass>
            </manifest>
        </archive>
    </configuration>
</plugin>

常用插件列表

插件 功能 常用目标
maven-clean-plugin 清理构建目录 clean
maven-resources-plugin 处理资源文件 resources, testResources
maven-compiler-plugin 编译源代码 compile, testCompile
maven-surefire-plugin 运行单元测试 test
maven-jar-plugin 创建 JAR 包 jar
maven-war-plugin 创建 WAR 包 war
maven-install-plugin 安装到本地仓库 install
maven-deploy-plugin 部署到远程仓库 deploy

插件配置

基本配置

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.11.0</version>
            <configuration>
                <source>11</source>
                <target>11</target>
            </configuration>
        </plugin>
    </plugins>
</build>

执行配置

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>3.1.0</version>
    <executions>
        <execution>
            <id>copy-resources</id>
            <phase>package</phase>
            <goals>
                <goal>run</goal>
            </goals>
            <configuration>
                <target>
                    <copy todir="${project.build.directory}/config">
                        <fileset dir="src/main/config"/>
                    </copy>
                </target>
            </configuration>
        </execution>
    </executions>
</plugin>

实用插件推荐

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>
            </goals>
        </execution>
    </executions>
</plugin>

maven-shade-plugin

创建包含依赖的 uber-jar

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>3.4.1</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
        </execution>
    </executions>
</plugin>

maven-assembly-plugin

创建自定义分发包

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>3.4.2</version>
    <configuration>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
    </configuration>
</plugin>

插件管理

在父 POM 中使用 pluginManagement 统一管理插件版本:

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.11.0</version>
                <configuration>
                    <source>11</source>
                    <target>11</target>
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>
</build>

插件开发

创建自定义 Maven 插件的基本步骤:

  1. 创建 Maven 项目,packaging 设为 maven-plugin
  2. 添加 maven-plugin-api 依赖
  3. 创建 Mojo 类(继承 AbstractMojo)
  4. 使用注解配置插件元数据
  5. 实现 execute() 方法
@Mojo(name = "hello", defaultPhase = LifecyclePhase.COMPILE)
public class HelloMojo extends AbstractMojo {
    
    @Parameter(property = "hello.message", defaultValue = "Hello World!")
    private String message;
    
    public void execute() throws MojoExecutionException {
        getLog().info(message);
    }
}