Maven 插件‌

是 Maven 构建工具的核心组件,用于扩展 Maven 的功能,实现项目的编译、测试、打包等具体任务。

插件与生命周期的关系‌。

Maven 定义了三个标准生命周期(clean、default/build、site),每个生命周期包含多个阶段(如 compile、test 等)。每个阶段的具体实现由对应的 Maven 插件完成,例如 maven-compiler-plugin 负责编译阶段的任务

‌插件的坐标‌。

每个插件通过 groupId、artifactId 和 version 唯一标识。例如 maven-compiler-plugin 的坐标为 org.apache.maven.plugins:maven-compiler-plugin。‌‌

maven-compiler-plugin 

是 Apache Maven 中的核心插件之一,主要用于编译 Java 源代码。它控制着编译过程中的关键参数(如 JDK 版本、编译选项),确保项目代码能按照指定的 Java 版本和编译规则进行编译。

  1. 编译源代码
    将 src/main/java 目录下的 Java 源文件(.java)编译为字节码(.class),输出到 target/classes 目录。

  2. 配置编译参数

    • 指定 Java 版本(如 Java 8/11/17)
    • 设置编译选项(如编码、警告级别)
    • 管理注解处理器(如 Lombok、MapStruct)
    • 多模块编译:在多模块项目中协调编译顺序。基于依赖关系确定编译顺序。统一管理编译参数(Java 版本、编码等)。优化编译性能(并行、增量编译)。
  3. 验证依赖
    确保编译时能正确找到所有依赖的类库(如 JDK 类库、第三方 JAR)。

mvn clean -U package:

  • clean:删除之前的构建输出(target 目录),maven-clean-plugin 删除 target 目录,确保构建环境干净。
  • -U:强制更新远程仓库的快照依赖
  • compile:maven-compiler-plugin 被触发,执行以下操作:读取 pom.xml 中的配置(如 Java 版本、编译参数)加载依赖的 JAR 文件(包括 JDK 和第三方库),编译源代码,处理注解(如生成 Lombok 的 getter/setter),
  • 编译完成后,其他插件继续执行:
  • package:执行打包操作(如生成 JAR/WAR)

MavenProject

MavenProject 是 Apache Maven 中的核心概念,代表一个 Maven 项目的抽象模型。理解 MavenProject 对于定制插件开发、构建流程自动化以及高级项目配置至关重要

MavenProject 是 org.apache.maven.project.MavenProject 类的实例,包含了从 pom.xml 解析而来的所有项目信息,如依赖、插件、构建配置等。

作用:

  • 在 Maven 插件中通过 MavenProject 访问项目元数据。
  • 用于插件开发时修改或扩展构建行为。
  • 在生命周期阶段中传递项目状态。

MavenProject 包含以下关键属性:

1. 基本信息

project.getGroupId();      // 获取项目组 ID
project.getArtifactId();   // 获取项目工件 ID
project.getVersion();      // 获取项目版本
project.getName();         // 获取项目名称
project.getDescription();  // 获取项目描述

2. 依赖管理

project.getDependencies();       // 获取直接依赖列表
project.getDependencyManagement(); // 获取依赖管理配置
project.getArtifacts();          // 获取解析后的依赖工件

3. 构建配置

project.getBuild();              // 获取构建配置
project.getPluginArtifacts();    // 获取插件依赖
project.getCompileSourceRoots(); // 获取编译源路径

4. 生命周期与阶段

project.getExecutionPlan();      // 获取执行计划
project.getPluginMap();          // 获取插件映射
project.getReportPlugins();      // 获取报告插件

在自定义 Maven 插件中,可以通过 @Parameter 注解注入 MavenProject 实例

flatten-maven-plugin

一个由 MojoHaus 维护的 Maven 插件,旨在解决多模块 Maven 项目中 POM 文件继承导致的复杂依赖问题,

扁平化 POM 文件‌:生成一个简化版的 pom.xml文件(默认命名为 .flattened-pom.xml),去除不必要的继承和依赖管理结构,仅保留必要的配置信息。‌‌

解决版本占位符问题‌:在多模块项目中,父模块通常通过占位符(如 ${revision})定义版本号,子模块继承后打包时这些占位符可能不会被正确替换。该插件可在构建过程中动态替换这些占位符,确保生成的 POM 文件可被正确解析

‌统一版本管理‌:通过在父模块中定义版本号变量,所有子模块继承该变量实现统一管理,减少手动修改版本号的工作量

构建部署:Maven 在 install 和 deploy 阶段会使用 .flattened-pom.xml 文件替代原始 pom.xml 文件。‌‌

对于大型项目,可通过调整 flattenMode 减少生成的 POM 文件体积。‌‌

spring-boot-maven-plugin 

是 Spring Boot 提供的官方 Maven 插件,用于简化 Spring Boot 应用的构建、打包和运行过程。它集成了 Spring Boot 的特性(如依赖管理、嵌入式服务器、分层 JAR/WAR 等),让开发者可以更高效地构建可执行的 Spring Boot 应用。

打包可执行 JAR/WAR:生成包含所有依赖的单一可执行文件。

直接运行应用:无需手动打包,通过 mvn spring-boot:run 直接启动应用。

依赖优化:自动排除不必要的依赖,减小打包体积。

分层 JAR:将应用类和依赖分离为不同层,加速容器镜像构建。

支持 AOT(提前编译):从 Spring Boot 3.0 开始支持,生成优化的原生镜像。

mybatis-generator-maven-plugin 

是 MyBatis 官方提供的 Maven 插件,用于自动生成 MyBatis 的实体类、Mapper 接口和 XML 映射文件。它通过读取数据库表结构,按照配置规则生成基础代码,大幅减少手动编写 CRUD 代码的工作量。

使用:1在 pom.xml 中添加插件配置,2generatorConfig.xml配置,3mvn mybatis-generator:generate或在idea界面执行mybatis-generator:generate 目标

自动化代码生成:根据数据库表结构生成实体类、Mapper 接口和 XML 文件。

支持多种数据库:MySQL、Oracle、PostgreSQL、SQL Server 等。

自定义配置:通过 XML 配置文件定制生成规则(如包名、表前缀过滤)。

插件扩展:支持自定义插件修改生成逻辑。

增量生成:保留手动修改的代码,仅更新自动生成的部分。

Maven插件开发

使用 Maven 插件开发框架,如 Maven Plugin API,创建一个 Maven 项目来存放插件代码

mvn archetype:generate -DgroupId=com.example -DartifactId=my-maven-plugin -DarchetypeArtifactId=maven-archetype-plugin -DinteractiveMode=false

在 pom.xml 文件中,添加 Maven Plugin API 和插件注解的依赖:

<dependencies>
    <dependency>
        <groupId>org.apache.maven.plugin-tools</groupId>
        <artifactId>maven-plugin-annotations</artifactId>
        <version>3.6.0</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.maven</groupId>
        <artifactId>maven-plugin-api</artifactId>
        <version>3.6.3</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.maven</groupId>
        <artifactId>maven-core</artifactId>
        <version>3.6.3</version>
        <scope>provided</scope>
    </dependency>
</dependencies>
<!--打包类型-->
<packaging>maven-plugin</packaging>

创建 Mojo (Maven plugin goal),使用 @Mojo 注解来标识这个类是一个 Mojo

package com.example;
 
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
 
@Mojo(name = "hello")
public class HelloWorldMojo extends AbstractMojo {
    @Parameter(property = "name", defaultValue = "World")
    private String name;
 
    public void execute() throws MojoExecutionException {
        getLog().info("Hello " + name + "!");
    }
}

配置插件的元数据:在 src/main/resources/META-INF/maven/plugin.xml 中配置插件和 Mojo。

打包和安装插件:使用 Maven 的 package 和 install 命令来构建和安装插件:mvn package install

使用插件

通过 <plugins> 部分引用插件,运行项目时,Maven 将执行插件mvn my-maven-plugin:hello,或者如果在项目的 pom.xml 中配置了执行,只需运行:mvn package // 或者 mvn install,取决于配置和需要执行的目标。

goals插件在特定执行实例中要执行的具体目标(goal)

<build>
    <plugins>
        <plugin>
            <groupId>com.example</groupId>
            <artifactId>my-maven-plugin</artifactId>
            <version>1.0-SNAPSHOT</version> <!-- 或者其他版本 -->
            <executions><!-- 执行单元 -->
                <execution>
                    <goals>
                        <goal>hello</goal> <!-- 与 Mojo 的 name 对应 -->
                    </goals>
                    <configuration> <!-- 可选配置 -->
                        <name>Maven User</name> <!-- 与 Mojo 的 @Parameter 属性对应 -->
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

在 Maven 的pom.xml文件里,插件能够实现编译代码、运行测试、生成文档、打包部署等一系列构建任务。

  • 构建插件(Build Plugins):会在项目构建过程中执行,需要在build/plugins节点下进行配置。
  • 报告插件(Reporting Plugins):在生成项目站点文档时发挥作用,要在reporting/plugins节点中配置。
<project>
  ...
  <build>
    <plugins>
      <!-- 构建插件配置 -->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.1</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
  
  <reporting>
    <plugins>
      <!-- 报告插件配置 -->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-javadoc-plugin</artifactId>
        <version>3.2.0</version>
      </plugin>
    </plugins>
  </reporting>
  ...
</project>

常见插件目标与阶段绑定

插件常见目标典型绑定阶段
maven-compiler-plugincompile, testCompilecompile, test-compile
maven-surefire-plugintesttest
maven-jar-pluginjarpackage
maven-deploy-plugindeploydeploy
exec-maven-pluginexec, java自定义(如 generate-sources)

    更多推荐