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

相关推荐
小碗羊肉21 小时前
【JavaWeb | 第五篇】JDBC
java·开发语言·数据库
江南十四行21 小时前
Python上下文管理器与with语句——资源管理的艺术
java·jvm·数据库
书源丶21 小时前
四十五、函数式接口与 Lambda 表达式
java·开发语言
直奔標竿21 小时前
MySQL与Redis数据一致性实战方案(避坑指南)
java·数据库·spring boot·redis·mysql·spring·缓存
java1234_小锋21 小时前
Java进程突然挂了如何排查?
java·开发语言
夕除1 天前
spring boot--04
java·spring boot
java小白小1 天前
Guava Cache 本地缓存
java
梦梦代码精1 天前
LikeShop 二次开发扩展能力白皮书——面向业务增长的可扩展电商架构实践
java·架构·github
极客先躯1 天前
高级java每日一道面试题-2025年12月05日-实战篇[Dockerj]-Docker 安装后的默认存储路径是什么?如何修改?
java·docker·默认存储路径在不同系统上的区别·linux overlay2·修改存储路径的理论方法·修改流程中的关键理论点
祁_z1 天前
LangSmith 实操指南「Agent 可观测性系统」
java·服务器