编写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的构建过程,比如增加定制化的动态属性等等。

相关推荐
小曲程序7 分钟前
vue3 封装request请求
java·前端·typescript·vue
陈王卜25 分钟前
django+boostrap实现发布博客权限控制
java·前端·django
小码的头发丝、25 分钟前
Spring Boot 注解
java·spring boot
java亮小白199730 分钟前
Spring循环依赖如何解决的?
java·后端·spring
飞滕人生TYF36 分钟前
java Queue 详解
java·队列
武子康1 小时前
大数据-230 离线数仓 - ODS层的构建 Hive处理 UDF 与 SerDe 处理 与 当前总结
java·大数据·数据仓库·hive·hadoop·sql·hdfs
武子康1 小时前
大数据-231 离线数仓 - DWS 层、ADS 层的创建 Hive 执行脚本
java·大数据·数据仓库·hive·hadoop·mysql
苏-言1 小时前
Spring IOC实战指南:从零到一的构建过程
java·数据库·spring
界面开发小八哥1 小时前
更高效的Java 23开发,IntelliJ IDEA助力全面升级
java·开发语言·ide·intellij-idea·开发工具
草莓base1 小时前
【手写一个spring】spring源码的简单实现--容器启动
java·后端·spring