自己写一个Maven plugin

本文详细介绍了如何编写和配置Maven插件,包括生命周期、阶段、goal的绑定,IDEA中的调试,以及常用插件如SpringBoot和maven-assembly-plugin的使用。教程涵盖了创建插件POM结构、依赖管理以及实际操作步骤。
摘要由CSDN通过智能技术生成

一、如何手写一个maven plugin

maven plugin的作用就是在maven生命周期的某一个阶段去完成一个事情。

1.maven生命周期(lifecycle)中的每个阶段(phase)都可以绑定n(>=1)个插件(plugin)的目标(goal)

maven官方文档对生命周期和阶段的介绍

maven生命周期与阶段

2.多个goal绑定同一个phase的话,maven会从上到下依次执行

3.一个plugin中可以包含多个goal

4.maven插件的命名规则:maven-xxx-plugin xxx-maven-plugin(spring喜欢这种风格)

5.如何在idea中调试maven插件:如何调试maven插件

1.1 maven插件的前置准备工作

第一步:maven插件pom文件需要修改打包方式

<packaging>maven-plugin</packaging>

第二步:引入依赖

<dependencies>
    <!-- 写注解插件必引入 -->
    <dependency>
        <groupId>org.apache.maven</groupId>
        <artifactId>maven-plugin-api</artifactId>
        <version>3.5.2</version>
    </dependency>
    
    <!-- 注解方式定义插件时才用得到 -->
    <dependency>
        <groupId>org.apache.maven.plugin-tools</groupId>
        <artifactId>maven-plugin-annotations</artifactId>
        <version>3.5.2</version>
    </dependency>
    
    <!-- 生成插件描述信息 plugin.xml-->
    <dependency>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-plugin-plugin</artifactId>
        <version>3.5</version>
    </dependency>
    
    <!-- 获取maven工程的pom配置信息-->
    <dependency>
        <groupId>org.apache.maven</groupId>
        <artifactId>maven-project</artifactId>
        <version>2.2.1</version>
    </dependency>
</dependencies>

第三步:在build文件中引用插件描述信息依赖

    <build>
        <plugins>
            <!-- 生成插件描述信息 plugin.xml-->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-plugin-plugin</artifactId>
                <version>3.5</version>
            </plugin>
        </plugins>
    </build>

1.2 实现方式

1.2.1 注释方式实现(不推荐,已经废弃)

在注解里面写@goal 就会被识别到

/**
 * @goal comment
 * @version 1.0.0
 * @since 1.0.0
 * 注意:注释的方式不能与注解方式混用
 */
public class CommentMoJo extends AbstractMojo {
    @Override
    public void execute() throws MojoExecutionException, MojoFailureException {
        Log log = getLog();
        log.info("执行了goal:comment的execute方法");
    }
}

1.2.2 注解方式实现

@Mojo注解的name就是goal的名字,defaultPhase设置默认绑定的phase,不写默认是package

@Mojo(name = "annotation", defaultPhase = LifecyclePhase.PACKAGE)
public class AnnotationMoJo extends AbstractMojo {


    @Parameter(defaultValue = "${project}")
    private MavenProject project;


    @Parameter(required = true)
    private String name;


    @Parameter(required = false)
    private String age;
    @Override
    public void execute() throws MojoExecutionException, MojoFailureException {
        Log log = getLog();
        log.info("执行了goal:annotation的execute方法");
        // 获取到最终jar包的名字
        String packaging = project.getPackaging();
        String finalName = project.getBuild().getFinalName();
        log.info("获取到最终jar包的名字:"+finalName+"."+packaging);
        log.info("name的值:"+name);
        log.info("age的值:"+age);
    }
}

获取<plugin>的<configuration>里面的参数配置

   // 获取maven pom文件上下文
    @Parameter(defaultValue = "${project}")
    private MavenProject project;


    // required = true代表这个参数是必须的
    @Parameter(required = true)
    private String name;


    @Parameter(required = false)
    private String age;

插件打包

1.3 在项目中使用maven plugin

<build>
        <plugins>
            <plugin>
                <groupId>com.example</groupId>
                <artifactId>mavenplugin</artifactId>
                <version>0.0.2-SNAPSHOT</version>
                <configuration>
<!--                可以被maven插件代码里面的@Parameter获取到-->
                    <name>cgy</name>
                </configuration>
                <executions>
                    <execution>
                        <id>comment</id>
                        <phase>package</phase>
                        <goals>
                            <goal>comment</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>anno</id>
<!--                绑定的phase,没指定可以alt+友键查看<goal>annotation</goal>写的默认的阶段-->
                        <phase>package</phase>
<!--                goal是就是这个插件的执行name-->
                        <goals>
                            <goal>annotation</goal>
                        </goals>
                    </execution>
                </executions>


<!--                当插件的依赖不能传递时需要使用方显式引入-->
                <dependencies>
                    <dependency>
                        <groupId>commons-io</groupId>
                        <artifactId>commons-io</artifactId>
                        <version>2.13.0</version>


<!--                        <scope>provided</scope>-->
<!--                        <optional>true</optional>-->
                    </dependency>
                </dependencies>
            </plugin>
            




            <!--                这个插件是spring的打包插件-->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.6.11</version>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <phase>package</phase>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

1.4 查看maven生成的plugin.xml

这里有一个spring的打包插件

            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.6.11</version>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <phase>package</phase>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

alt+点击`<goal>repackage</goal>`可以查看这个goal生成的plugin.xml文件

1.5 plugin的依赖

当插件的依赖不能传递时需要使用方显式的引入依赖。

    <dependency>
        <groupdId>commons-io</groupdId>
        <artifactId>commons-io</artifactId>
        <version>2.13.0</version>
        <!-- 当插件的依赖不能传递时需要使用方显式的引入依赖-->
        <scope>provided</scope>
        <!--  optional元素默认值(false) 不依赖传递-->
        <optional>true</optional>
    </dependency>

二、idea里面的maven插件含义

idea的maven插件

三、 常用的插件

一般我们写java项目只需要用一个打包插件即可,我们通常使用`spring-boot-maven-plugin`和`maven assembly plugin`这两个插件

[spring-boot-maven-plugin介绍](https://zhuanlan.zhihu.com/p/634098705)

[maven-assembly-plugin插件的使用方法](https://cloud.tencent.com/developer/article/1354070)

[maven-assembly-plugin插件的官方使用方法](https://maven.apache.org/plugins/maven-assembly-plugin/usage.html)

[maven-assembly-plugin插件的assembly文件官方介绍](https://maven.apache.org/plugins/maven-assembly-plugin/assembly.html)

[自己写一个maven插件](https://www.bilibili.com/video/BV1au4y1e7rE?p=1&vd_source=e11238cac9f3e1ba071805e0deee4e23)

其他资料:

java编译加速那些事

  • 15
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

M.Rambo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值