maven编写插件——统计代码行数

本文介绍如何创建一个Maven插件来统计指定目录下的代码行数。首先,新建一个Maven插件工程,配置pom.xml文件,并引入必要的依赖。接着,编写Java类,该类继承自Mojo并实现主要方法。插件的核心点在于Mojo注解,定义了插件执行的入口、参数和运行条件。最后,文章提供了两种调用插件的方式:在Maven项目中引用插件坐标通过命令行参数传递,以及直接在命令行中调用插件并传参。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

  使用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实战》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值