如何实现自己第一个maven插件?

1.什么是maven?

Maven 作为一个优秀的项目管理工具,其插件机制为其功能扩展提供了非常大的便捷性。虽然说大多数情况下,我们可能不太会自己去编写 Maven 插件,但不排除在某些特殊的情况下,我们需要去完成一个自己的插件,来协助我们处理某些比较通用的事情。

什么是 Mojo?

Mojo 就是 Maven plain Old Java Object。每一个 Mojo 就是 Maven 中的一个执行目标(executable goal),而插件则是对单个或多个相关的 Mojo 做统一分发。一个 Mojo 包含一个简单的 Java 类。插件中多个类似 Mojo 的通用之处可以使用抽象父类来封装。

2.代码工程

实验目标

实现第一个插件,并在另外一个项目中使用该插件

pom.xml

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springboot-demo</artifactId>
        <groupId>com.et</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>maven-yourfirst-plugin</artifactId>
    <packaging>maven-plugin</packaging>
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.apache.maven</groupId>
            <artifactId>maven-plugin-api</artifactId>
            <version>2.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.maven.plugin-tools</groupId>
            <artifactId>maven-plugin-annotations</artifactId>
            <version>3.3</version>
        </dependency>
    </dependencies>
</project>

其中打包方式一定要是<packaging>maven-plugin</packaging>

Mojo类

它继承了 AbstractMojo 这个抽象类,并实现了 execute() 方法,该方法就是用来定义这个 Mojo 具体操作内容,我们只需要根据自己的需要来编写自己的实现即可。 Mojo 操作的实现我们了解了,那怎么让 Maven 知道这是一个 Mojo 而不是一个普通的 Java 类呢?这里,就需要说一下 Mojo 的查找机制了,在处理源码的时候,plugin-tools 会把使用了 @Mojo 注解或 Javadoc 里包含 @goal 注释的类来当作一个 Mojo 类。

scala 复制代码
package com.et.maven.plugin;

import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;

@Mojo(name="maven-yourfirst-plugin")
public class MyMojo extends AbstractMojo {

    @Parameter
    private String msg;
    public void execute() throws MojoExecutionException,MojoFailureException{
        System.out.println("execute success:"+msg);
    }
}

3、打包插件

执行mvn clean install 将插件安装到本地库,之后就可以使用了。 可以在本地仓库中找到

bash 复制代码
[INFO] --- maven-install-plugin:2.5.2:install (default-install) @ maven-yourfirst-plugin ---
[INFO] Installing /Users/liuhaihua/IdeaProjects/springboot-demo/maven-yourfirst-plugin/target/maven-yourfirst-plugin-1.0-SNAPSHOT.jar to /Users/liuhaihua/.m2/repository/com/et/maven-yourfirst-plugin/1.0-SNAPSHOT/maven-yourfirst-plugin-1.0-SNAPSHOT.jar
[INFO] Installing /Users/liuhaihua/IdeaProjects/springboot-demo/maven-yourfirst-plugin/pom.xml to /Users/liuhaihua/.m2/repository/com/et/maven-yourfirst-plugin/1.0-SNAPSHOT/maven-yourfirst-plugin-1.0-SNAPSHOT.pom
[INFO] ------

以上只是一些关键代码,所有代码请参见下面代码仓库

代码仓库

3.测试

在另外一个项目上使用我们编写的插件(maven-yourfirst-plugin)

xml 复制代码
<build>
    <plugins>
        <plugin>
            <groupId>com.et</groupId>
            <artifactId>maven-yourfirst-plugin</artifactId>
            <version>1.0-SNAPSHOT</version>
            <configuration>
                <msg>this is my first maven plugin</msg>
            </configuration>
            <executions>
                <execution>
                    <id>first</id>
                    <phase>compile</phase>
                    <goals>
                        <goal>maven-yourfirst-plugin</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

执行我们的插件,结果可以看到进入我们的插件,执行了里面的方法


相关推荐
利刃大大16 分钟前
【SpringBoot】Spring事务 && @Transactional详解 && Spring事务失效问题
spring boot·spring·事务
..过云雨1 小时前
17-2.【Linux系统编程】线程同步详解 - 条件变量的理解及应用
linux·c++·人工智能·后端
南山乐只2 小时前
【Spring AI 开发指南】ChatClient 基础、原理与实战案例
人工智能·后端·spring ai
㳺三才人子2 小时前
初探 Spring Framework OncePerRequestFilter
spring boot·spring·junit
这是程序猿3 小时前
基于java的ssm框架学生作业管理系统
java·开发语言·spring boot·spring·学生作业管理系统
努力的小雨3 小时前
从“Agent 元年”到 AI IDE 元年——2025 我与 Vibe Coding 的那些事儿
后端·程序员
Caarlossss3 小时前
mybatis
java·数据库·tomcat·maven·mybatis·mybatis-spring
源码获取_wx:Fegn08953 小时前
基于springboot + vue小区人脸识别门禁系统
java·开发语言·vue.js·spring boot·后端·spring
wuxuanok4 小时前
Go——Swagger API文档访问500
开发语言·后端·golang
用户21411832636024 小时前
白嫖Google Antigravity!Claude Opus 4.5免费用,告别token焦虑
后端