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

相关推荐
weixin_456904278 分钟前
Spring Boot 用户管理系统
java·spring boot·后端
趁你还年轻_8 分钟前
异步编程CompletionService
java
DKPT11 分钟前
Java内存区域与内存溢出
java·开发语言·jvm·笔记·学习
sibylyue16 分钟前
Guava中常用的工具类
java·guava
奔跑吧邓邓子20 分钟前
【Java实战㉞】从0到1:Spring Boot Web开发与接口设计实战
java·spring boot·实战·web开发·接口设计
专注API从业者29 分钟前
Python/Java 代码示例:手把手教程调用 1688 API 获取商品详情实时数据
java·linux·数据库·python
奔跑吧邓邓子1 小时前
【Java实战㉝】Spring Boot实战:从入门到自动配置的进阶之路
java·spring boot·实战·自动配置
ONLYOFFICE1 小时前
【技术教程】如何将ONLYOFFICE文档集成到使用Spring Boot框架编写的Java Web应用程序中
java·spring boot·编辑器
叫我阿柒啊1 小时前
Java全栈开发工程师的实战面试经历:从基础到微服务
java·微服务·typescript·vue·springboot·前端开发·后端开发
cyforkk1 小时前
Spring 异常处理器:从混乱到有序,优雅处理所有异常
java·后端·spring·mvc