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

相关推荐
努力进修25 分钟前
欢迎来到我的Java世界“抽象类”
java·开发语言·python
Lilixy.182327 分钟前
【Java-反射】
java·开发语言
立志成为coding大牛的菜鸟.2 小时前
力扣139-单词拆分(Java详细题解)
java·算法·leetcode
星夜孤帆2 小时前
LeetCode之数组/字符串
java·算法·leetcode
GISer小浪花努力上岸5 小时前
Java实现简易计算器功能(idea)
java·开发语言·intellij-idea
海海向前冲5 小时前
设计模式 -- 单例设计模式
java·开发语言·设计模式
就这样很好8805 小时前
排序算法总结
java·算法·排序算法
weixin_486681145 小时前
C++系列-STL中find相关的算法
java·c++·算法
学java的小菜鸟啊6 小时前
Java队列详细解释
java·开发语言·经验分享·python
帅得不敢出门6 小时前
安卓framework美化手势导航侧滑返回UI
android·java·ui·framework·安卓·开发·定制