编写Maven Extension

介绍

Maven extension是对Maven的扩展,可以是对Core的扩展,也可以是对Project的扩展。本文主要针对的后者,因为对Project的扩展更加常用一些。

需要注意的是,它与Maven Plug-in是不一样的。Plug-in是为了实现某一(几)中特定的功能(goal)而定义和开发的。(当然,Maven的实际工作都是交给Plug-in完成的)。

开发Maven Extension

开发一个Maven Extension,只需要如下两步。

1)定义依赖

首先创建一个maven工程,然后在pom.xml文件中定义如下依赖和插件:

xml 复制代码
<dependencies>
    <dependency>
        <groupId>org.apache.maven</groupId>
        <artifactId>maven-core</artifactId>
        <version>3.6.3</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.codehaus.plexus</groupId>
        <artifactId>plexus-component-annotations</artifactId>
        <version>1.5.5</version>
        <exclusions>
            <exclusion>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.plexus</groupId>
            <artifactId>plexus-component-metadata</artifactId>
            <version>1.5.5</version>
            <executions>
                <execution>
                    <goals>
                        <goal>generate-metadata</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

2)定义一个类,继承Maven既定的类

Maven提供了如下三个类:

通常,我们使用的是org.apache.maven.AbstractMavenLifecycleParticipant。比如:下面是一个读取minikube docker-env命令输出结果,并将结果设置到Maven属性中的扩展。

java 复制代码
@Component(role = AbstractMavenLifecycleParticipant.class, hint = "minikube")
public class MinikubeExtension extends AbstractMavenLifecycleParticipant {

    @Override
    public void afterSessionStart(MavenSession session) throws MavenExecutionException {
        injectProperties(session);
    }

    @Override
    public void afterProjectsRead(MavenSession session) throws MavenExecutionException {
        injectProperties(session);
    }
    
    // ...
}

这里要注意:

  • 必须在类上使用@Component注解,并提供一个名字
  • afterProjectsRead是必须实现的,而afterSessionStart可以保留为空
  • 向Maven的process中增加属性,可以通过session.getSystemProperties().put("key", "value)来实现

使用Maven Extension

按照官方文档,Maven Exertion根据类型不同,可以有不同的使用方式。如下:

  • core extension
    • 把extension的jar包放到${maven.home}/lib/ext里面
    • 通过CML:mvn -Dmaven.ext.class.path=extension.jar
    • 定义在.mvn/extensions.xml文件里面
  • build extension
    • 定义在pom.xml文件中

一般情况下,我们开发的extension都属于build extension,那么就可以直接在pom.xml文件中声明并使用它了。如下:

xml 复制代码
<project>
    <!-- ... -->
    <build>
        <extensions>
            <extension>
                <groupId>com.dadaer.maven</groupId>
                <artifactId>minikube-maven-extension</artifactId>
                <version>1.0.0</version>
            </extension>
        </extensions>
    </build>
    <!-- ... -->
</project>

代码

本文使用的代码可以从github中获取:

github.com/yulshi/mini...

结论

Maven提供了强大的扩展性,一方面体现在对plug-in的支持,另一方面体现在对核心功能的扩展。Maven extension可以让我们定制化Maven的构建过程,比如增加定制化的动态属性等等。

相关推荐
nlog3n1 小时前
Java 原型模式 详解
java·开发语言·原型模式
ylfhpy2 小时前
Java面试黄金宝典30
java·数据库·算法·面试·职场和发展
喻米粒06223 小时前
RabbitMQ消息相关
java·jvm·spring boot·spring·spring cloud·sentinel·java-rabbitmq
Aphelios3805 小时前
Java全栈面试宝典:线程机制与Spring IOC容器深度解析
java·开发语言·jvm·学习·rbac
qq_529835355 小时前
装饰器模式:如何用Java打扮一个对象?
java·开发语言·装饰器模式
日暮南城故里6 小时前
Java学习------源码解析之StringBuilder
java·开发语言·学习·源码
一个public的class8 小时前
什么是 Java 泛型
java·开发语言·后端
士别三日&&当刮目相看8 小时前
JAVA学习*Object类
java·开发语言·学习
快来卷java8 小时前
MySQL篇(一):慢查询定位及索引、B树相关知识详解
java·数据结构·b树·mysql·adb
凸头9 小时前
I/O多路复用 + Reactor和Proactor + 一致性哈希
java·哈希算法