Maven 插件使用

1.spring-boot-maven-plugin

我们直接使用 maven package (maven自带的package打包功能),打包Jar包的时候,不会将该项目所依赖的Jar包一起打进去,在使用java -jar命令启动项目时会报错,项目无法正常启动。这个时候,我们就可以考虑引用spring-boot-maven-plugin插件来为项目打Jar包。

xml 复制代码
<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <version>${spring.boot.version}</version>
    <executions>
        <execution>
            <goals>
                <!-- 将引入的 jar 打入其中 -->
                <goal>repackage</goal>
            </goals>
        </execution>
    </executions>
</plugin>
2.flatten-maven-plugin

在使用Maven多模块结构工程时,版本管理是一件很繁琐且容易出错的事情。每次升级版本号都要手动调整或者通过mvn versions:set -DnewVerion=1.2.0-SNAPSHOT命令去更改每一个子模块的版本号,非常的不方便,Maven官方文档说:自 Maven 3.5.0-beta-1 开始,可以使用 {revision}, {sha1} and/or {changelist} 这样的变量作为版本占位符。即在maven多模块项目中,可配合插件`flatten-maven-plugin`及`{revision}`属性来实现全局版本统一管理。

xml 复制代码
<!-- 统一 revision 版本 -->
<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>flatten-maven-plugin</artifactId>
    <version>1.5.0</version>
    <configuration>
        <!-- 避免IDE将 .flattened-pom.xml 自动识别为功能模块 -->
        <flattenMode>resolveCiFriendliesOnly</flattenMode>
        <updatePomFile>true</updatePomFile>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>flatten</goal>
            </goals>
            <id>flatten</id>
            <phase>process-resources</phase>
        </execution>
        <execution>
            <goals>
                <goal>clean</goal>
            </goals>
            <id>flatten.clean</id>
            <phase>clean</phase>
        </execution>
    </executions>
</plugin>

不可混合使用{revision}和明确字符串版本号,若出现父子模块版本号混合使用{revision}和明确字符串形式如1.2.0-SNAPSHOT,在mvn package会出现类似如下错误

3.maven-clean-plugin

maven-clean-plugin 插件对应的命令是 mvn clean,执行 mvn clean 命令会删除构建输出目录 target。mvn clean 命令其实是调用 maven-clean-plugin 插件执行 clean 操作的。maven-clean-plugin 插件是默认安装好的插件,并不需要我们在 pom.xml 文件中进行配。

xml 复制代码
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-clean-plugin</artifactId>
    <version>3.2.0</version>
    <configuration>
        <!-- 忽略错误 -->
        <failOnError>false</failOnError>
    </configuration>
    <!-- mvn package和mvn clean package等价配置 -->
    <executions>
        <execution>
            <id>auto-clean</id>
            <phase>initialize</phase>
            <goals>
                <goal>clean</goal>
            </goals>
        </execution>
    </executions>
</plugin>
4.maven-compiler-plugin

maven-compiler-plugin 插件是一个 Maven 插件,用来编译项目代码;自从3.0开始默认的编译器是 javax.tools.JavaCompiler,用来编译 Java 源码;如果你想强制插件使用 javac 编译器,你必须配置插件的属性 forceJavacCompilerUse;还要注意,当前默认源(source)设置为 1.6,默认目标(target)设置为 1.6。独立运行 Maven 和 JDK,可以通过 source 和 target 选项更改他们的默认值;

xml 复制代码
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.1</version>
    <configuration>
        <!-- 源代码使用的JDK版本 -->
        <source>1.8</source> 
        <!-- 需要生成的目标class文件的编译版本 -->
        <target>1.8</target> 
        <!-- 字符集编码 -->
        <encoding>UTF-8</encoding>
        <!-- 跳过测试 -->
        <skipTests>true</skipTests>
        <!-- maven-compiler-plugin 插件,解决 Lombok + MapStruct 组合 -->
        <annotationProcessorPaths>
            <path>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-configuration-processor</artifactId>
                <version>2.7.18</version>
            </path>
            <path>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.18.30</version>
            </path>
            <path>
                <groupId>org.mapstruct</groupId>
                <artifactId>mapstruct-processor</artifactId>
                <version>1.5.5.Final</version>
            </path>
        </annotationProcessorPaths>
    </configuration>
</plugin>
5.maven-resources-plugin

maven-resources-plugin插件来将src/main/resources目录中的资源文件单独剥离出来,生成一个独立的资源文件包,用于处理项目资源文件并拷贝到输出目录。

xml 复制代码
<plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-resources-plugin</artifactId>
      <version>3.2.0</version>
      <executions>
        <execution>
          <id>copy-resources</id>
          <phase>package</phase>
          <goals>
            <goal>copy-resources</goal>
          </goals>
          <configuration>
            <outputDirectory>${project.build.directory}/resources</outputDirectory>
            <resources>
              <resource>
                <directory>src/main/resources</directory>
                <includes>
                  <include>**/*</include>
                </includes>
              </resource>
            </resources>
          </configuration>
        </execution>
      </executions>
    </plugin>

上述配置将在Maven的package阶段执行copy-resources目标,并将src/main/resources目录中的所有文件复制到{project.build.directory}/resources目录下。执行mvn package命令后,将生成一个独立的资源文件包,其中包含src/main/resources目录中的所有文件。可以在{project.build.directory}/resources目录中找到这个资源文件包。

6.maven-source-plugin

maven-source-plugin提供项目自动将源码打包并发布的功能,在需要发布源码项目的pom.xml文件中添加如下代码即可执行 mvn install,maven会自动将source install到repository 。执行 mvn deploy,maven会自动将source deploy到remote-repository 。执行 mvn source:jar,单独打包源码。

xml 复制代码
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-source-plugin</artifactId>
    <version>3.3.0</version>
    <executions>
        <execution>
            <id>attach-sources</id>
            <goals>
                <goal>jar</goal>
            </goals>
        </execution>
    </executions>
</plugin>
7.maven-war-plugin

maven-war-pluginWAR 插件负责收集 Web 应用程序的所有依赖项、类和资源,并将它们打包到 WAR 包中,仅包含 scopecompile+runtime 的依赖项,默认绑定到 package 阶段。

xml 复制代码
<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <version>3.4.0</version>
    </plugin>
</plugins>
<resources>
    <resource>
        <directory>src/main/java</directory>
        <includes>
            <include>**/*.xml</include>
        </includes>
        <filtering>false</filtering>
    </resource>
    <resource>
        <directory>src/main/resources</directory>
        <includes>
            <include>**/**</include>
        </includes>
        <filtering>true</filtering>
    </resource>
</resources>
8.maven-antrun-plugin

maven-antrun-plugin 是 Maven 的一个插件,它允许你在 Maven 构建生命周期的某个阶段执行 Apache Ant 任务。Apache Ant 是一个基于 Java 的构建工具,常用于 Java 项目的构建和部署。

xml 复制代码
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>3.1.0</version>
</plugin>
9.maven-surefire-plugin

Maven本身并不是一个单元测试框架,它只是在构建执行到特定生命周期阶段的时候,通过插件来执行JUnit或者TestNG的测试用例。这个插件就是maven-surefire-plugin,也可以称为测试运行器(Test Runner),它能兼容JUnit]3、JUnit 4以及TestNG。

xml 复制代码
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>3.0.0-M5</version>
</plugin>
10.versions-maven-plugin

versions-maven-plugin插件可以管理项目版本, 特别是当Maven工程项目中有大量子模块时,可以批量修改pom版本号,插件会把父模块更新到指定版本号,然后更新子模块版本号与父模块相同,可以避免手工大量修改和遗漏的问题。

xml 复制代码
<!-- generateBackupPoms为true(默认值),pom.xml.versionsBackup备份文件,否则没有备份文件无法回退版本号 -->
<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>versions-maven-plugin</artifactId> 
    <version>2.7</version>
    <configuration>
        <generateBackupPoms>true</generateBackupPoms>
    </configuration>
</plugin>

shell 复制代码
#查看版本号
mvn help:evaluate -Dexpression=project.version -q -DforceStdout
# 修改版本号
mvn -f "pom.xml" versions:set -DoldVersion=* -DnewVersion=1.2.0-SNAPSHOT -DprocessAllModules=true -DallowSnapshots=true -DgenerateBackupPoms=true
# 修改版本号
mvn versions:set -DnewVersion=1.2.0-SNAPSHOT
# 回退版本号
mvn versions:revert
11.pluginManagement

plugins 和 pluginManagement 的区别,和我们前面研究过的 dependencies 和 dependencyManagement 的区别是非常类似的。plugins 下的 plugin 是真实使用的,而 pluginManagement 下的 plugins 下的 plugin 则仅仅是一种声明,子项目中可以对 pluginManagement 下的 plugin 进行信息的选择、继承、覆盖等。

xml 复制代码
<build>
    <pluginManagement>
        <plugins>
            <!-- maven-surefire-plugin 插件,用于运行单元测试。 -->
            <!-- 注意,需要使用 3.0.X+,因为要支持 Junit 5 版本 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>3.0.0-M5</version>
            </plugin>
            <!-- maven-compiler-plugin 插件,解决 Lombok + MapStruct 组合 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <annotationProcessorPaths>
                        <path>
                            <groupId>org.springframework.boot</groupId>
                            <artifactId>spring-boot-configuration-processor</artifactId>
                            <version>2.7.18</version>
                        </path>
                        <path>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                            <version>1.18.30</version>
                        </path>
                        <path>
                            <groupId>org.mapstruct</groupId>
                            <artifactId>mapstruct-processor</artifactId>
                            <version>1.5.5.Final</version>
                        </path>
                    </annotationProcessorPaths>
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>
</build>
相关推荐
悟空码字6 小时前
Spring Boot 整合 MongoDB 最佳实践:CRUD、分页、事务、索引全覆盖
java·spring boot·后端
皮皮林5512 天前
拒绝写重复代码,试试这套开源的 SpringBoot 组件,效率翻倍~
java·spring boot
用户908324602734 天前
Spring AI 1.1.2 + Neo4j:用知识图谱增强 RAG 检索(上篇:图谱构建)
java·spring boot
用户8307196840825 天前
Spring Boot 集成 RabbitMQ :8 个最佳实践,杜绝消息丢失与队列阻塞
spring boot·后端·rabbitmq
Java水解5 天前
Spring Boot 视图层与模板引擎
spring boot·后端
Java水解5 天前
一文搞懂 Spring Boot 默认数据库连接池 HikariCP
spring boot·后端
洋洋技术笔记5 天前
Spring Boot Web MVC配置详解
spring boot·后端
初次攀爬者6 天前
Kafka 基础介绍
spring boot·kafka·消息队列
用户8307196840826 天前
spring ai alibaba + nacos +mcp 实现mcp服务负载均衡调用实战
spring boot·spring·mcp
Java水解6 天前
SpringBoot3全栈开发实战:从入门到精通的完整指南
spring boot·后端