java统计插件_[Java教程]编写maven代码行统计插件

[Java教程]编写maven代码行统计插件

0 2015-05-23 12:00:53

编写maven插件的步骤创建一个maven-plugin项目:插件本身也是maven项目,只是它的packaging是maven-plugin。

为插件编写目标:每个插件必须包含一个或多个目标,maven称之为Mojo。编写插件时必须提供一个或多个继承自AbstractMojo的类。

为目标提供配置点:大部分maven插件以及其目标都是可配置的,因此在编写Mojo的时候需要注意提供可配置的参数。

编写代码,实现目标。

错误处理以及日志,为客户提供足够的信息。

测试插件

一:创建maven-plugin项目

创建一个普通的maven项目,只是packaging改为maven-plugin,同时引入依赖maven-plugin-api。pom文件如下:"1.0" encoding="UTF-8"?>4.0.0com.sawyer.edumaven-loc-plugin1.0-SNAPSHOTmaven-plugin3.0org.apache.mavenmaven-plugin-api${maven.version}

二:创建一个CountMojo类。该类所必要的三项工作:继承AbstractMojo、实现execute()方法、提供@goal标注。代码如下:

bc91bb04e6e9c61e24c974e4440db8f2.gif

bc91bb04e6e9c61e24c974e4440db8f2.gifpackage com.sawyer.edu.tlsys.plugin;import org.apache.maven.model.Resource;import org.apache.maven.plugin.AbstractMojo;import org.apache.maven.plugin.MojoExecutionException;import org.apache.maven.plugin.MojoFailureException;import java.io.BufferedReader;import java.io.File;import java.io.FileReader;import java.io.IOException;import java.util.ArrayList;import java.util.List;/** * maven 代码统计插件 * @author sawyer * @goal count */public class CountMojo extends AbstractMojo { /** * default includes */ private static final String[] INCLUDES_DEFAULT = {"java", "}; /** * @parameter expression = "${project.basedir}" * @required * @readonly */ private File basedir; /** * @parameter expression = "${project.build.sourceDirectory}" * @required * @readonly */ private File sourceDirectory; /** * @parameter expression = "${project.build.testSourceDirectory}" * @required * @readonly */ private File testSourceDirectory; /** * @parameter expression = "${project.build.resources}" * @required * @readonly */ private List resources; /** * @parameter expression = "${project.build.testResources}" * @required * @readonly */ private List testResources; /** * file types which will be included for counting * @parameter */ private String[] includes; /** * execute * @throws MojoExecutionException MojoExecutionException * @throws MojoFailureException MojoFailureException */ public void execute() throws MojoExecutionException, MojoFailureException { if(includes == null || includes.length == 0){ includes = INCLUDES_DEFAULT; } try{ countDir(sourceDirectory); countDir(testSourceDirectory); for(Resource resource : resources){ countDir(new File(resource.getDirectory())); } for(Resource testResource : testResources){ countDir(new File(testResource.getDirectory())); } }catch (Exception e){ throw new MojoExecutionException("count failed:", e); } } /** * 统计某个目录下文件的代码行 * @param dir 目录 * @throws IOException 文件异常 */ private void countDir (File dir) throws IOException{ if(!dir.exists()){ return; } List collected = new ArrayList(); collectFiles(collected, dir); int lines = 0; for(File sourceFile : collected){ lines += countLine(sourceFile); } String path = dir.getAbsolutePath().substring(basedir.getAbsolutePath().length()); getLog().info(path + ": " + lines + " lines of code in " + collected.size() + "files"); } /** * 递归获取文件列表 * @param collected 文件列表list * @param file 文件 */ private void collectFiles(List collected, File file){ if(file.isFile()){ for(String include : includes){ if(file.getName().endsWith("." + include)){ collected.add(file); break; } } }else{ for(File sub : file.listFiles()){ collectFiles(collected, sub); } } } /** * 读取文件的行数 * @param file 文件对象 * @return line * @throws IOException 文件操作异常 */ private int countLine(File file) throws IOException{ BufferedReader reader = new BufferedReader(new FileReader(file)); int line = 0; try{ while(reader.ready()){ reader.readLine(); line++; } }finally { reader.close(); } return line; }}

CountMojo代码

这里要关注的是@goal标注,这个标注就是这个类的目标,定义了目标之后,我们才可以在项目中配置该插件目标。

代码中还包含了basedir、sourceDirectory、testSourceDirectory等字段,它们都使用了@parameter标注,同时关键字expression表示从系统属性中读取这几个字段值。

其次,代码中的includes字段就是用来为用户提供该配置点的,它的类型为String数组,并且使用了@parameter参数表示用户可以自己在pom中配置该字段,使用该插件时的pom配置如下:com.iflytek.edumaven-loc-plugin1.0-SNAPSHOTjavasqlcompilecount

根据上面的pom配置,可以看到incuudes字段标识需要统计的文件后缀,phase表示该插件在compile阶段工作,使用该插件的时候可以看到如下输出信息:[INFO] --- maven-loc-plugin:1.0-SNAPSHOT:count (default) @ ZX-jobmonitor-webapp ---[INFO] \src\main\java: 778 lines of code in 6files[INFO] \src\test\java: 0 lines of code in 0files[INFO] \src\main\resources: 0 lines of code in 0files

使用mvn clean install命令将该插件项目构建并安装到本地仓库后,并按照上面的pom配置,就可以使用它统计项目的代码了。

三:错误处理和日志

上面的CountMojo类继承自AbstratctMojo,跟踪会发现该抽象类实现了类Mojo接口,execute()方法就是在这个接口中定义的。void execute() throws MojoExecutionException, MojoFailureException;

这个方法可以抛出两种异常,

如果是MojoFailureException异常,则表示为发现了预期的错误,例如单元测试插件在发现测试失败时就会抛出该异常。

如果是MojoExcutionException异常,则表示发现了未预期的异常,例如上述代码中的IOException等。

四:测试

可在项目中直接集成该插件,也可以在项目目录下用命令行来测试该插件,命令如下:mvn com.sawyer.edu:maven-loc-plugin:1.0-SNAPSHOT:count

本文网址:http://www.shaoqun.com/a/117537.html

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:admin@shaoqun.com。

maven

0

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
代码统计插件 eclipse plugin java 提供xls导出。 liugang594 开发的,方便下载 这是一款小型的代码统计软件。它具有以下功能: 1、良好的统计性能。可以统计各种方式的注释,如单、多注释;注释在前 、尾、单独成等。 2、可以进多种语言注释统计。默认情况下已经可以统计.java、.C、.h、.CPP 、.C++和.AS 类型文件的统计了。还可以统计.properties文件 3、可以进统计类型的自定义。点击统计类型配置按钮,在弹出的对话框左边是剩余可 配置的文件类型,右边是当前设置的统计类型,可以通过加入或移除按钮进增删。 4、方便的打开文件。你可以在树或表上双击文件各直接打开文件或目录。双击文件时会 三种打开方式:本程序、系统、eclipse。如果是eclipse工程里的文件,则默认 是使用eclipse打开,否则使用本程序打开 5、可以进多个目录的统计。每个统计的目录都会作为树结点加到树上去。当选择统计 的目录已经统计,则更新该目录。选择一个统计的目录,点del键时可删除这个统计 结点 6、单击统计结果表格的表头时,会按正反序进排序,文件名按字母顺序排序;其他统计 数字按数字大小进排序! 关于扩展的使用方法: 扩展就是通过继承basecount包里的BaseCount类,实现它的countTypeFile方法来达到 扩展的目的。你只要把传入的参数里的文件内容读取出来,然后按照你自定义的判断 注释、内容、总数、包声明、导入数、空白行数然后一个一个的设入到传入的result参 数里就可以了(没有的可以不设)。具体的可以参照简单的下面给出的一个例子。 再有一点要注意的就是,你要把你的统计类型文件的后缀添加到configuration.ini文 件里去,如里这个文件里没有声明统计这个类型;另外你还要在config.ini文件里把文 件后缀--统计类 对写好。这样才能正确显示结果 例如:统计.properties文件 首先写一个统计类,假设这个类名为CountProperties,这个类在包count下。我们定 义.properties文件的注释是只有当首的字符为“#”时认为是一个注释,否则如果空 则认为是一个空,其他的则认为是一个代码。则代码如下: package count; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import basecount.BaseCount; import result.CountResult; public class CountPropertiesFile extends BaseCount { /** * implements this method to custom */ public void countTypeFile(File sourcefile, CountResult result) { countPropertiesFile(sourcefile, result); } /** * this method used to count properties file * the comment signal is "#" * @param sourcefile * @param result */ private void countPropertiesFile(File sourcefile, CountResult result) { BufferedReader reader = null; try { reader = new BufferedReader(new FileReader(sourcefile)); String line = null; String trimed = null; while ((line = reader.readLine()) != null) { int i = result.getTotlalLineCount(); result.setTotlalLineCount(++i); trimed = line.trim(); if (trimed.length() < 1) { i = result.getBlankLineCount(); result.setBlankLineCount(++i); } else if (trimed.startsWith("#")) { i = result.getCommentLineCount(); result.setCommentLineCount(++i); } else { i = result.getCodeLineCount(); result.setCodeLineCount(++i); } } } catch (Exception ex) { ex.printStackTrace(); } finally { try { if(reader!=null) reader.close(); } catch (Exception ex) { ex.printStackTrace(); } } } } 写完这个代码以后,在config.ini文件里增加一,内容如下: .properties=count.CountPropertiesFile 如果configuration.ini里的可统计类型不包括.properties文件,则增加以下内容 SourceFilter.countFileExtensions=.../.properties 这就完成了增加自定义的统计.properties类型文件的目的了!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值