介绍
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.execution.AbstractExecutionListener
,org.apache.maven.AbstractMavenLifecycleParticipant
,org.apache.maven.eventspy.AbstractEventSpy
通常,我们使用的是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
文件里面
- 把extension的jar包放到
- 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中获取:
结论
Maven提供了强大的扩展性,一方面体现在对plug-in的支持,另一方面体现在对核心功能的扩展。Maven extension可以让我们定制化Maven的构建过程,比如增加定制化的动态属性等等。