跳到主要内容

插件使用

Maven 的核心只是一个框架,实际的构建工作由插件完成。本章将介绍常用插件的配置和使用方法。

插件概述

Maven 插件是一种扩展机制,用于在构建生命周期的各个阶段执行特定任务。每个插件可以包含一个或多个目标,每个目标对应一个具体的功能。

插件的组成

  • groupId:插件的组织标识
  • artifactId:插件的名称
  • version:插件的版本
  • goals:插件提供的目标列表

插件与生命周期

插件目标可以绑定到生命周期的特定阶段。当执行该阶段时,Maven 会自动执行绑定的插件目标。

插件配置方式

在 pom.xml 中配置

<build>
<plugins>
<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>
</plugins>
</build>

在 settings.xml 中配置

全局插件配置可以在 settings.xml 中设置:

<pluginGroups>
<pluginGroup>org.eclipse.jetty</pluginGroup>
</pluginGroups>

核心插件

maven-compiler-plugin(编译插件)

用于编译 Java 源代码,是最常用的插件之一。

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<!-- JDK 版本 -->
<source>17</source>
<target>17</target>
<!-- 编码 -->
<encoding>UTF-8</encoding>
<!-- 编译参数 -->
<compilerArgs>
<arg>-parameters</arg>
</compilerArgs>
</configuration>
</plugin>
</plugins>
</build>

常用配置参数:

参数说明默认值
source源代码版本1.5
target目标字节码版本1.5
encoding源代码编码平台默认
compilerArgs编译器参数

maven-surefire-plugin(测试插件)

用于执行单元测试。

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<!-- 跳过测试 -->
<skipTests>false</skipTests>
<!-- 测试类命名模式 -->
<includes>
<include>**/*Test.java</include>
<include>**/*Tests.java</include>
</includes>
<!-- 排除的测试类 -->
<excludes>
<exclude>**/Abstract*.java</exclude>
</excludes>
<!-- 并行执行 -->
<parallel>methods</parallel>
<threadCount>4</threadCount>
</configuration>
</plugin>
</plugins>
</build>

测试类命名约定:

  • **/Test*.java
  • **/*Test.java
  • **/*Tests.java
  • **/*TestCase.java

maven-jar-plugin(JAR 打包插件)

用于将项目打包成 JAR 文件。

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<!-- 最终包名 -->
<finalName>${project.artifactId}-${project.version}</finalName>
<!-- 包含/排除文件 -->
<includes>
<include>**/*.class</include>
</includes>
<excludes>
<exclude>**/*.properties</exclude>
</excludes>
<!-- MANIFEST.MF 配置 -->
<archive>
<manifest>
<mainClass>com.example.Main</mainClass>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
</manifest>
<manifestEntries>
<Built-By>Example Team</Built-By>
<Build-Jdk>${java.version}</Build-Jdk>
</manifestEntries>
</archive>
</configuration>
</plugin>
</plugins>
</build>

maven-war-plugin(WAR 打包插件)

用于将 Web 项目打包成 WAR 文件。

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.2</version>
<configuration>
<!-- WAR 包名称 -->
<warName>myapp</warName>
<!-- Web 资源目录 -->
<warSourceDirectory>src/main/webapp</warSourceDirectory>
<!-- 过滤 web.xml -->
<filteringDeploymentDescriptors>true</filteringDeploymentDescriptors>
<!-- 排除文件 -->
<packagingExcludes>
WEB-INF/classes/**/*.bak
</packagingExcludes>
</configuration>
</plugin>
</plugins>
</build>

maven-source-plugin(源码打包插件)

用于生成源码包。

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.2.1</version>
<executions>
<execution>
<id>attach-sources</id>
<phase>package</phase>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

maven-javadoc-plugin(文档插件)

用于生成 Javadoc 文档。

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.4.1</version>
<configuration>
<encoding>UTF-8</encoding>
<charset>UTF-8</charset>
<docencoding>UTF-8</docencoding>
<doclint>none</doclint>
</configuration>
<executions>
<execution>
<id>attach-javadocs</id>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

打包插件

maven-assembly-plugin(组装插件)

用于创建包含依赖的可执行 JAR。

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.4.2</version>
<configuration>
<archive>
<manifest>
<mainClass>com.example.Main</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

maven-shade-plugin(阴影插件)

用于创建包含依赖的可执行 JAR,支持重定位和转换。

<build>
<plugins>
<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>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.example.Main</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>

Spring Boot 插件

spring-boot-maven-plugin

Spring Boot 项目的核心插件,用于打包可执行的 JAR。

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.7.0</version>
<configuration>
<mainClass>com.example.Application</mainClass>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

常用目标:

目标说明
repackage创建可执行 JAR
run运行应用
start启动应用(用于集成测试)
stop停止应用

代码生成插件

mybatis-generator-maven-plugin

用于生成 MyBatis 代码。

<build>
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.4.2</version>
<configuration>
<configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
<overwrite>true</overwrite>
</configuration>
<executions>
<execution>
<id>generate-mybatis</id>
<phase>generate-sources</phase>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

代码质量插件

maven-checkstyle-plugin

用于检查代码风格。

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<configLocation>checkstyle.xml</configLocation>
<encoding>UTF-8</encoding>
<consoleOutput>true</consoleOutput>
<failsOnError>true</failsOnError>
</configuration>
<executions>
<execution>
<id>validate</id>
<phase>validate</phase>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

maven-pmd-plugin

用于静态代码分析。

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-pmd-plugin</artifactId>
<version>3.19.0</version>
<configuration>
<rulesets>
<ruleset>/rulesets/java/quickstart.xml</ruleset>
</rulesets>
<printFailingErrors>true</printFailingErrors>
</configuration>
<executions>
<execution>
<phase>verify</phase>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

spotbugs-maven-plugin

用于查找 Bug。

<build>
<plugins>
<plugin>
<groupId>com.github.spotbugs</groupId>
<artifactId>spotbugs-maven-plugin</artifactId>
<version>4.7.3</version>
<configuration>
<effort>Max</effort>
<threshold>Low</threshold>
</configuration>
<executions>
<execution>
<phase>verify</phase>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

插件管理

pluginManagement

类似于 dependencyManagement,pluginManagement 用于统一管理插件版本:

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

子项目使用时不需要指定版本:

<!-- 子 POM -->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<!-- 版本由父 POM 管理 -->
</plugin>
</plugins>
</build>

插件执行

命令行执行插件目标

# 执行指定插件目标
mvn compiler:compile

# 执行指定版本的插件目标
mvn org.apache.maven.plugins:maven-compiler-plugin:3.11.0:compile

# 查看插件信息
mvn help:describe -Dplugin=compiler

# 查看插件目标详情
mvn help:describe -Dplugin=compiler -Dmojo=compile -Ddetail

插件执行顺序

当多个插件绑定到同一阶段时,按 pom.xml 中的声明顺序执行:

<build>
<plugins>
<!-- 第一个执行 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals><goal>jar-no-fork</goal></goals>
</execution>
</executions>
</plugin>

<!-- 第二个执行 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals><goal>jar</goal></goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

小结

本章我们学习了:

  1. Maven 插件的概念和作用
  2. 核心插件的配置和使用
  3. 打包插件的使用方法
  4. Spring Boot 插件的配置
  5. 代码生成和质量检查插件
  6. 插件管理的方式

在下一章中,我们将学习多模块项目的构建和管理。