插件使用
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>
小结
本章我们学习了:
- Maven 插件的概念和作用
- 核心插件的配置和使用
- 打包插件的使用方法
- Spring Boot 插件的配置
- 代码生成和质量检查插件
- 插件管理的方式
在下一章中,我们将学习多模块项目的构建和管理。