Maven 编写插件
这一节我们来讲如何编写 Maven 的。在生命周期一节中,我们了解到通常是包含多个目标的,而不同的目标也就对应了生命周期中的不同阶段。在之前的章节中,我们着重介绍如何使用 Maven 的,那么在本节中,我们来介绍如何。其实通常情况下,我们是不需要自己定制的,因为 Maven 有太多可以配置的供开发者来使用的,所以,除非开发者发现自己有非常特殊的需求,而这个需求并不能通过现有的来完成的时候,才需要 Maven 了。
在编写之前,我们先来看看什么是 Maven 。
类似于 Spring 框架的 Ioc 容器,Maven 也沿用了这种做法,将其中与生命周期进行绑定的 Mojo Bean 进行托管,将对象的创建和控制权交与 Ioc 容器来进行管理。在 Ioc 容器中比较重要的概念就是依赖注入,在 Maven 编程的时候,会使用到两种依赖注入方式:
总的来讲,在 Maven 中实现的 Ioc 容器和 Spring 中的 Ioc 容器是非常类似的。
通常情况下,Maven 不同的目标,而这些目标则是通过 Mojo 来实现的。Mojo 可以对标 Java 中的 Pojo,这样理解起来就会很方便。而这些 Mojo 对象则是被 Maven 中的 Ioc 容器进行管理的。
例如, install:install
目标对应 Maven Install 中的 InstallMojo 的 Java 类。而 deploy:deploy
目标则对应 Maven Deploy 中的 DeployMojo 的 Java 类。
在 Maven 的 JAR 中,有 -INF/maven/plugin.xml
,这个描述了这个中的各个 Mojo 对象与其他的配置(我们可以在本地仓库中找到任何,来查看该的 plugin.xml )。当的被到依赖中的时候,Maven 会首先去读取这个,来对该进行初始化。通常,这个并不需要我们自己来编写,而是在的时候,Maven 会帮我们来完成。
从上面的步骤来看,其实编写也就相当于编写小型的项目,从创建项目到开发,测试再到上线发布,每步骤都需要经过。
那接下来,我们就实际编写小来进行演示。
首先,我们在存放的目录下执行命令 mvn archetype:generate
(在 idea 中根据 archetype 来创建项目,相同),选择 -plugin 模板,然后依次按照输入 groupId 和 artifactId 等等信息。
这里,我们为这个命名为 my-plugin,项目结构如下:
接下来,我们就创建自己的 Mojo 类,叫做 SumFileMojo,这个目标用于当前项目中有多少个Java 类。并且,我们将原本的 MyMojo 类删掉。
package com.mic.tech;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
import java.io.File;
import java.util.Objects;
/**
* @Auther: Uncle Biao
* @Date: 2020/6/9 23:37
* @Description:
*/
@Mojo(name = "sumFileCount",defaultPhase= LifecyclePhase.COMPILE)
public class SumFileCountMojo extends AbstractMojo {
@Parameter(property = "path")
private String path;
/**
* java
*/
int javaFileCount = ;
@Override
public void execute() throws MojoExecutionException, MojoFailureException {
Sy.out.println(countJavaFile(path));
}
public String countJavaFile(String path){
File file = new File(path);
if (file.exists()) {
File [] files = file.listFiles();
if(Objects.isNull(files)){
for(int i= ; i < files.length ; i++){
File currentFile = files[i];
if(currentFile.isFile()){
String fileName = currentFile.getName();
String suffix = fileName.substring(fileName.lastIndexOf(".") + );
if("java".equals(suffix)){
javaFileCount ++;
}
}else{
countJavaFile(currentFile.getAbsolutePath());
}
}
}
}
return "number of Java File is " + javaFileCount;
}
}
编码完成后,我们执行 mvn clean install
命令将构建到本地仓库中去。
接下来,我们可以在 mall 项目中加入该的依赖,并且为该配置执行目标。
<plugin>
<groupId>com.mic.tech</groupId>
<artifactId>my-plugin</artifactId>
<version>1.0.0-SNAPSHOT</version>
<conuration>
<path>${project.basedir}</path>
</conuration>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>sumFileCount</goal>
</goals>
</execution>
</executions>
</plugin>
依赖完成后,在 mall-order 模块下执行命令 mvn compile
便可以看到出来 Java 的。
至此,我们编写了简单的,用于项目中 Java 的。
本节中,我们介绍了如何 Maven ,需要注意的地方,以及通常的编写步骤。最后,我们编写了用于项目中 Java 的。当 Maven 提供的不能满足我们需求的时候,就可以尝试去简单来供自己使用。