前言
使用maven插件可以将一些有意思的功能抽象成maven插件服务,安装到本地maven仓库以后,可以很方便的使用功能,也可以在其他项目当中引用插件,使用插件功能。
下面完成统计目录下包含的指定类型的文件,以及该类型所有文件的行数总和,可以用来统计项目中的代码行数~
1、新建maven插件工程
插件也就是一个maven工程,可以使用Archetype
插件新建一个maven项目。
1.1 pom文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.zhoucy</groupId>
<artifactId>maven-plugin</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>maven-plugin</packaging>
<name>maven-plugin</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-plugin-api</artifactId>
<version>3.0</version>
</dependency>
<dependency>
<groupId>org.apache.maven.plugin-tools</groupId>
<artifactId>maven-plugin-annotations</artifactId>
<version>3.5</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>cn.zhoucy</groupId>
<artifactId>maven-plugin</artifactId>
<version>1.0-SNAPSHOT</version>
<configuration>
<currentBaseDir>${basedir}</currentBaseDir>
<suffix>.java</suffix>
</configuration>
<executions>
<execution>
<!-- phase表示运行在哪个阶段 -->
<phase>clean</phase>
<goals>
<!--goal标识运行哪个命令,可以这样认为-->
<goal>fileCountTotal</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
其中build插件是该项目测试时,自己调用自己,后面会解释调用插件的两种方式。
只要注意
<packaging>maven-plugin</packaging>
以及插件编写需要引入两个jar包即可。
1.2 新建java类,代码如下:
package cn.zhoucy;
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.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* Created by zhoucy on 18/6/1
**/
@Mojo(name = "fileCountTotal",requiresProject = false,defaultPhase = LifecyclePhase.PACKAGE)
public class CountMojo extends AbstractMojo{
private static List<String> fileList = new ArrayList<String>();
private int allLines = 0;
//获取文件路径
@Parameter(property = "currentBaseDir",defaultValue = "/Users/pathHome")
private String currentBaseDir;
//定义文件后缀 如果要传递 Args的参数需要这样传:mvn clean -Dsuffix=.xml
@Parameter(property = "suffix",defaultValue = ".java")
private String suffix;
public void execute() throws MojoExecutionException, MojoFailureException {
List<String> fileList = scanFile(currentBaseDir);
System.out.println("FilePath:"+currentBaseDir);
System.out.println("defaultFileSuffix:"+suffix);
System.out.println("FileTotal:"+fileList.size());
System.out.println("allLines:"+allLines);
}
/**
* 递归统计文件,并将符合条件的文件放入集合中
* @param filePath
* @return
*/
private List<String> scanFile(String filePath) {
File dir = new File(filePath);
// 递归查找到所有的class文件
for (File file : dir.listFiles()) {
if (file.isDirectory()) {
scanFile(file.getAbsolutePath());
} else {
if(file.getName().endsWith(suffix)){
fileList.add(file.getName());
allLines+=countLines(file);
}
}
}
return fileList;
}
private int countLines(File file) {
int lines = 0;
try {
BufferedReader reader = new BufferedReader(new FileReader(file));
while (reader.ready()) {
reader.readLine();
lines++;
}
} catch (IOException e) {
e.printStackTrace();
}
return lines;
}
}
2 核心点及两种调用插件方式
2.1 文件中核心点解释:
AbstractMojo
:编写的类集成了这个类,这个是编写maven插件的类必须要继承的类,并实现方法execute()
,该方法即是maven插件执行时的入口。@Mojo
:类上有该注解,其中有很多属性值,
name="fileCountTotal"
:表示该类的运行方法名为gileCountTotal
,当你在其他项目中引用该插件的时候goal
属性的值。或者在命令行中直接使用该插件值,用来区分要运行的类,因为一个maven插件中,可以有很多继承了AbstractMojo
的类,在类上加该属性用于区分。
requiresProject = false
:该属性值表示,编写的插件所运行的目标项目是否必须为maven项目,显然我们这里是想要统计指定目录下的文件以及文件所含内容行数,不需要目标项目必须为maven项目,故为false。
@Parameter
:表示的是该参数是可以在调用maven插件的时候动态将参数值传递进来的,因为maven插件有两种调用方式,所以有两种传递参数的方式。
2.2 调用及传参方式
一种调用方式为:在maven项目中引用插件坐标:
<build>
<plugins>
<plugin>
<groupId>cn.zhoucy</groupId>
<artifactId>maven-plugin</artifactId>
<version>1.0-SNAPSHOT</version>
<configuration>
<currentBaseDir>${basedir}</currentBaseDir>
<suffix>.java</suffix>
</configuration>
<executions>
<execution>
<!-- phase表示运行在哪个阶段 -->
<phase>clean</phase>
<goals>
<!--goal标识运行哪个命令,可以这样认为-->
<goal>fileCountTotal</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
此时通过
<configuration>
<currentBaseDir>${basedir}</currentBaseDir>
<suffix>.java</suffix>
</configuration>
来传递参数值。
其中
<phase>clean</phase>
表示运行的期间是clean。故可以通过mvn clean
来调用该插件对当前maven工程中的文件行数进行统计。
另一种调用方式为命令行调用:
直接在bash中打入下面命令:
mvn cn.zhoucy:maven-plugin:1.0-SNAPSHOT:fileCountTotal -DcurrentBaseDir=/Users/pathHome/IdeaWorkspace -Dsuffix=.java
命令解析:
mvn groupId:artifactId:version:绑定名 参数...
可得到如下结果:
FilePath:/Users/pathHome/IdeaWorkspace
defaultFileSuffix:.java
FileTotal:240
allLines:14559
提醒:
在调用插件之前,需要使用mvn clean install
将插件安装到本地maven仓库。
参考:
https://blog.youkuaiyun.com/yuchao2015/article/details/80176300
《maven实战》