如何实现自己第一个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>

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


相关推荐
苹果酱056718 分钟前
一文读懂SpringCLoud
java·开发语言·spring boot·后端·中间件
掐指一算乀缺钱38 分钟前
SpringBoot 数据库表结构文档生成
java·数据库·spring boot·后端·spring
飞翔的佩奇1 小时前
xxl-job适配sqlite本地数据库及mysql数据库。可根据配置指定使用哪种数据库。
数据库·spring boot·mysql·sqlite·xxl-job·任务调度
计算机学姐3 小时前
基于python+django+vue的影视推荐系统
开发语言·vue.js·后端·python·mysql·django·intellij-idea
JustinNeil3 小时前
简化Java对象转换:高效实现大对象的Entity、VO、DTO互转与代码优化
后端
luoluoal3 小时前
java项目之基于Spring Boot智能无人仓库管理源码(springboot+vue)
java·vue.js·spring boot
ChinaRainbowSea3 小时前
十三,Spring Boot 中注入 Servlet,Filter,Listener
java·spring boot·spring·servlet·web
2的n次方_3 小时前
掌握Spring Boot数据库集成:用JPA和Hibernate构建高效数据交互与版本控制
数据库·spring boot·hibernate
青灯文案13 小时前
SpringBoot 项目统一 API 响应结果封装示例
java·spring boot·后端
二十雨辰4 小时前
[苍穹外卖]-12Apache POI入门与实战
java·spring boot·mybatis