1. 程式人生 > >maven編寫外掛——統計程式碼行數

maven編寫外掛——統計程式碼行數

前言

  使用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倉庫。

相關推薦

maven編寫外掛——統計程式碼

前言   使用maven外掛可以將一些有意思的功能抽象成maven外掛服務,安裝到本地maven倉庫以後,可以很方便的使用功能,也可以在其他專案當中引用外掛,使用外掛功能。   下面完成統計目錄下包含的指定型別的檔案,以及該型別所有檔案的行數總和,可以用來統

Python小工具:統計程式碼

本身程式碼難度不大,就是一個心血來潮做的小玩意 功能介紹 實現對於指定的字尾檔案進行行數統計 可以忽略指定的資料夾,對於一些IDE自動生成的程式碼可以進行忽略(預設忽略二進位制檔案) 對於檔案建立時間進行統計 Todo_List 把忽略資料夾的功能支援正則,現在的忽略

如何在Eclipse統計程式碼

使用Eclipse可以方便的統計工程或檔案的程式碼行數,方法如下:  1.點選要統計的專案或資料夾,在選單欄點選Search,然後點選File...  2.選中正則表示式(Regular expression),並在搜尋文字框輸入\n  3.在檔名中輸入*.java  4.在

Flask統計程式碼

流程:   1.獲取前端的檔案   2.判斷檔案是否zip檔案   3.解壓壓縮包並儲存   4.遍歷解壓後的資料夾   5.判斷檔案是否py檔案,將絕對路徑新增到列表   6.迴圈列表,排除註釋和空號,統計行數 from flask import Blueprint from flask

TFS 裡統計程式碼

****** Script for SelectTopNRows command from SSMS ******/ SELECT TeamProjectProjectNodeName 專案名稱 ,checkedinbyname 開發人員 ,SUM

iOS專案統計程式碼

很久沒更新了,今天學習了個新技能的,統計程式碼行數,直接用終端和命令列實現,簡單,閒暇時看看的,對幫助開發發用不大;1、開啟終端管理工具2、進入指定專案的根目錄下在終端裡輸入cd,然後打一個空格,再用滑鼠把專案拖進來就行了.比如:cd /Users/tcm/Desktop/s

VS2013 用正則表示式統計程式碼

公司 軟體申請 著作權 這鬼東西,所以在網上找了下統計方法,網上的正則表示式 (^:b*[^:b#/]+.*$)似乎不行,查了原因 去掉了了 : 號的匹配可行,具體如下: ^b*[^:b#/]+.*$

VS統計程式碼

按CTRL+SHIFT+F (Find in files),勾上支援正則表示式,然後輸入搜尋內容: ^:b*[^:b#/]+.*$ #開頭和/開頭或者空行都不計入程式碼量。如果需要只統計程式碼檔案的程式碼量,可以選擇查詢檔案的型別,比如什麼*.xml, *.resx….可以不檢查,只查*.cs,*.c,

在idea中統計程式碼

idea的外掛庫是灰常豐富的,統計程式碼行數可以用到外掛:Statistic。 1.CTRL+ALT+S(或者File→Settings),進入Plugins,點選Browse Repositories  2.搜尋Statistic,選擇安裝。(如果公司有限制網路,可

統計程式碼

svn diff -r 1022:1000 > /home/diff 先diff出兩個版本的diff檔案 sed '/\/\*/,/\*\//d' diff | grep "^+" | sed

使用VS2010統計程式碼

程式碼行數統計 VS2010中本身集成了非常強大的查詢功能,使用正則表示式可以非常快捷、準確的統計程式碼行數。 統計程式碼行數所用正則表示式: “^:b*[^:b#/]+.*$” 通過查詢的功能選項還可以限定查詢的檔案型別,進而對指定範圍的檔案進行統計。 其中“#開頭和

使用 cloc 統計程式碼

可能大家都知道用 `wc -l` 命令進行程式碼行數統計,但是它會將程式碼中的註釋、空行所佔用的文字行都統計在內。如果想檢視一個 tar 包或一個專案目錄中“實際”的程式碼行數並且不願意自己去寫一個指令碼來做此類工作,那麼可以考慮使用 cloc。 cloc 是一個 perl

統計程式碼的python小工具

一個用python實現的統計程式碼行數的小工具 先立個flag, 新年新目標,希望2018年程式碼行數可以寫到五萬行。 實現功能 計算出某一目錄以及子目錄下程式碼檔案的行數 在計算程式碼的過程中,只對標準命名的檔案進行統計,如[檔名.檔案型別] 排除

Visual Studio2013統計程式碼

1. 在“解決方案資源管理器”中選擇你的專案的解決方案,然後按下Ctrl+Shift+F,彈出“查詢和替換”視窗。 2. 在彈出的“查詢和替換”視窗中,“查詢內容”輸入b*[^:b#/]+.*$,“

用Eclipse 統計程式碼小技巧

今天公司SQA問我目前專案程式碼行數有多少,我當時就是想,以前好像寫過類似的統計工具但是一時又找不到 公司網路又不能下載,所以想想eclipse是不是又類似功能,找了下沒有,但突然一想有一個轉彎方法:統計工程裡面的\n個數 1. 按 CTRL+H 開啟查詢對話方塊 選擇fi

[Java]統計Java原始檔程式碼,註釋,空白行

題目 1.各種行的說明 在Java源程式中的行共有3種: (1)程式碼行,可執行的Java原始碼。例如: int n = 10; (2) 註釋行,3種註釋均可。例如: /** 文件註釋 */ /* 多行註釋 */ //單行註釋 (3)

統計C/C++程式碼

近日在寫一個統計專案中C/CPP/H/CC/HPP檔案(C/C++程式碼檔案字尾名)的小程式。目標是給定一個專案程式碼所在資料夾,統計出總程式碼行數、有效程式碼行數、註釋行數、空白行數。 其中:總程式碼行數 =(有效程式碼行數+註釋行數+空白行數) 每找到一個目的碼檔案,就建立任務投進執行緒池裡,執行速度

程式碼統計方法

下面所有方法來自網上: 1 linux find命令 單格式 find -name '*.cpp' | xargs wc -l 多格式 find -name '*[.cpp|.h]' | xargs wc -l 2 git命令 user.

用shell實現一個小指令碼,用來同來統計自己某個檔案下的程式碼,總的程式碼,總的註釋量,總的空量?支援遍歷查詢,支援軟連結查詢

[[email protected] yunwei]# cat sum_code_row_version1.4.sh #!/bin/bash # File Name: sum_code_row.sh # Author: Liwqiang # mail: [email

給定一Java原始碼檔案,統計其註釋,空行行程式碼及總行

規定:一行上既有程式碼又有註釋算程式碼行數(例如:int  a = 1; //註釋); Java原始碼檔案(要統計的原始碼檔案) package cn.edu.ccit.fwh; public