概要

1. 这是一个样例,基本照着《Maven实战》-徐晓斌,第17章照抄的;个人练手之作,不喜勿喷!

2. 代码行统计插件。

备注

  大量插件可从以下网站获得:

    1. http://maven.apache.org/plugins/

    2. http://mojo.codehaus.org/plugins.html

  m2e插件不能提供搜索框,搜索Maven依赖包的(书里说可以,但实际插件不提供该功能了),可以通过:

  https://repository.sonatype.org/index.html 搜索(可根据类名,包名,artifactId等信息查找)

正文

1. 创建Maven项目,archetype选择:maven-archetype-plugin

New--->Project…选择Maven Project

2. 删除MyMojo.java,新增CountMojo.java继承:org.apache.maven.plugin.AbstractMojo

package com.ckhuang.maven.plugin;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
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 org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter; /**
*
* 统计项目文件的行数
*
* @author ck.huang
*
*/
@Mojo(name = "count")
public class CountMojo extends AbstractMojo { private static final String[] INCLUDES_DEFAULT = new String[] {"xml", "java", "properties"}; /**
*
* 项目根目录
*
*/
@Parameter(defaultValue = "${project.basedir}", property = "baseDir", required = true,
readonly = true)
private File baseDir; /**
*
* 项目源文件目录
*
*/
@Parameter(defaultValue = "${project.build.sourceDirectory}", property = "sourceDirectory",
required = true, readonly = true)
private File sourceDirectory; /**
*
* 项目测试代码源文件目录
*
*/
@Parameter(defaultValue = "${project.build.testSourceDirectory}",
property = "testSourceDirectory", required = true, readonly = true)
private File testSourceDirectory; /**
*
* 运行时配置文件
*
*/
@Parameter(defaultValue = "${project.build.reousrce}", required = true, readonly = true)
private List<Resource> resources; /**
*
* 测试时配置文件
*
*/
@Parameter(defaultValue = "${project.build.testReousrce}", required = true, readonly = true)
private List<Resource> testResources; /**
* 要统计的文件格式<br/>
* 默认为:java,xml,properties<br/>
* 可通过配置includes属性修改
*/
@Parameter(property = "includes")
private String[] includes; public void execute() throws MojoExecutionException, MojoFailureException {
if (includes == null || includes.length == 0) {
includes = INCLUDES_DEFAULT;
}
try {
getLog().info("includes " + Arrays.toString(includes)); countDir(sourceDirectory); countDir(testSourceDirectory); countResource(resources); countResource(testResources);
} catch (IOException e) {
throw new MojoExecutionException("Unable to count lines of code.", e);
}
} /**
* 统计文件目录下的文件总行数
*
* @param dir 目录路径
* @throws IOException
*/
private void countDir(File dir) throws IOException {
if (!dir.exists()) {
return;
} List<File> collected = new ArrayList<File>(); 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");
} private int countLine(File sourceFile) throws IOException {
BufferedReader reader = new BufferedReader(new FileReader(sourceFile)); int line = 0;
try {
while (reader.ready()) {
reader.readLine(); line++;
}
} finally {
reader.close();
}
return line;
} private void collectFiles(List<File> 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 resources
* @throws IOException
*/
private void countResource(List<Resource> resources) throws IOException {
for (Resource res : resources) {
countDir(new File(res.getDirectory()));
}
} }

 

3. 在生成的POM,xml文件基础上修改,修改:goalPrefix

<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>com.ckhuang.maven</groupId>
<artifactId>maven-loc-plugin</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>maven-plugin</packaging> <name>lineCounter Maven Plugin</name> <!-- FIXME change it to the project's website -->
<url>http://maven.apache.org</url> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.version>3.0.4</maven.version>
</properties> <dependencies>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-plugin-api</artifactId>
<version>${maven.version}</version>
</dependency>
<dependency>
<groupId>org.apache.maven.plugin-tools</groupId>
<artifactId>maven-plugin-annotations</artifactId>
<version>3.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.codehaus.plexus</groupId>
<artifactId>plexus-utils</artifactId>
<version>3.0.8</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.2</version>
<scope>test</scope>
</dependency>
</dependencies> <build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-plugin-plugin</artifactId>
<version>3.2</version>
<configuration>
<goalPrefix>loc</goalPrefix>
<skipErrorNoDescriptorsFound>true</skipErrorNoDescriptorsFound>
</configuration>
<executions>
<execution>
<id>mojo-descriptor</id>
<goals>
<goal>descriptor</goal>
</goals>
</execution>
<execution>
<id>help-goal</id>
<goals>
<goal>helpmojo</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>run-its</id>
<build> <plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-invoker-plugin</artifactId>
<version>1.7</version>
<configuration>
<debug>true</debug>
<cloneProjectsTo>${project.build.directory}/it</cloneProjectsTo>
<pomIncludes>
<pomInclude>*/pom.xml</pomInclude>
</pomIncludes>
<postBuildHookScript>verify</postBuildHookScript>
<localRepositoryPath>${project.build.directory}/local-repo</localRepositoryPath>
<settingsFile>src/it/settings.xml</settingsFile>
<goals>
<goal>clean</goal>
<goal>test-compile</goal>
</goals>
</configuration>
<executions>
<execution>
<id>integration-test</id>
<goals>
<goal>install</goal>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins> </build>
</profile>
</profiles>
</project>

4. 修改Maven的setting.xml增加插件所属的groupId,以便更简易的访问:

<pluginGroups>
<!-- 你的插件groupId -->
<pluginGroup>com.ckhuang.maven</pluginGroup>
</pluginGroups>

5. 进入某个Maven项目,执行:

mvn loc:count

=========================================

PS,如果没有经过第4步,以及第3步中修改POM.xml的:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-plugin-plugin</artifactId>
<version>3.2</version>
<configuration>
<goalPrefix>loc</goalPrefix>
<skipErrorNoDescriptorsFound>true</skipErrorNoDescriptorsFound>
</configuration>
<executions>
<execution>
<id>mojo-descriptor</id>
<goals>
<goal>descriptor</goal>
</goals>
</execution>
<execution>
<id>help-goal</id>
<goals>
<goal>helpmojo</goal>
</goals>
</execution>
</executions>
</plugin>

则使用插件需要执行:

mvn com.ckhuang.maven:maven-loc-plugin:0.0.1-SNAPSHOT:count

搞定!

后记

涉及的细节如注解:@Mojo,@Parameter(property = "includes")等的使用,${project.build.reousrce}等Maven的环境变量,

将在下一章节进行说明。

使用Eclipse开发Maven插件-1/3的更多相关文章

  1. 【Maven】Eclipse安装Maven插件后导致Eclipse启动出错

    本文纯属复制粘贴:具体请参照原文: Eclipse安装Maven插件后,Eclipse启动问题:Maven Integration for Eclipse JDK Warning.  解决方法: 1. ...

  2. 设置eclipse的Maven插件引入依赖jar包后自动下载并关联相应的源码(转)

    好多用 Maven 的时候会遇到这样一个棘手的问题: 就是添加依赖后由于没有下载并关联源码,导致自动提示无法出现正确的方法名,而且不安装反编译器的情况下不能进入方法内部看具体实现 . 其实 eclip ...

  3. 安装eclipse的maven插件

    我们团队用maven来管理项目需要的库文件,其实以前都没听过maven,第一次接触这个,师兄要我直接去装下这个,开始以为还挺简单的,没想到中间遇到了一些小麻烦,现在把我成功安装maven的过程分享下, ...

  4. 在eclipse的maven插件中搜寻本地仓库中的jar搜索不到的解决方案

    在eclipse的maven插件中搜寻本地仓库中的jar搜索不到的解决方案 之前,用过maven管理项目的童鞋都知道本地会有一个${User_Home}.m2/repository仓库 是用来存放ja ...

  5. Eclipse安装maven插件报错

    Eclipse安装maven插件,报错信息如下: Cannot complete the install because one or more required items could not be ...

  6. eclipse下maven插件的安装

    最近公司项目要求使用maven来进行项目的管理开发,在这里记录一下eclipse下maven插件的安装. maven插件在eclipse下安装害得我挺恼火的. 我想用最简单的那种方式--在线安装: 通 ...

  7. eclipse 集成maven插件

    本文转载自:http://www.blogjava.net/fancydeepin/archive/2012/07/13/eclipse_maven3_plugin.html 环境准备: eclips ...

  8. Missing artifact net.sf.json-lib:json-lib:jar:2.4错误和Eclipse安装Maven插件错误

    微信公众号:compassblog 欢迎关注.转发,互相学习,共同进步! 有任何问题,请后台留言联系! 1.配置Maven项目的pom.xml文件报错 (1).错误描述:Missing artifac ...

  9. eclipse集成maven插件

    一.准备工作 1. 安装jdk并配置:https://www.cnblogs.com/diandiangui/p/10002100.html 2. 已安装好 maven并配置:https://www. ...

随机推荐

  1. MySQL 学习笔记 (范式)

    范式基本就是不要有重复的数据,表和表之间都是用主键和外键来联系 表的关系通常分3中 1 对 1 1 对 多 多 对 多 多 对 多 是用另一个表来实现的,这个表记入了a 表和 b表之间多对多的联系主键

  2. QQ截图时窗口自动识别的原理(WindowFromPoint, ChildWindowFromPoint, ChildWindowFromPointEx,RealChildWindowFromPoint)

    新版的QQ在截图时加入了窗口自动识别的功能,能根据鼠标的位置自动画出下面窗口的轮廓.今天有人在论坛上问起这个问题,下面我们来探讨这个功能的实现原理. 首先我们要明白截图软件的基本原理,截图时实际上是新 ...

  3. Jquery让图片根据浏览器窗口大小自动缩放

    (function($){ $.fn.resizeimage = function(){ var imgLoad = function (url, callback) { var img = new ...

  4. <php>对文件的目录、属性、路径的操作

    //filetype("1.jpg");//当前路径用./或者不写:上一级用../: //echo filetype("./1.jpg"); //判断./1.j ...

  5. 使用python监听、模拟鼠标键盘事件

    最近守望职业选手疑似开挂事件挺热闹的,在下小菜一枚,并不能从视频中看出端倪.看了一些关于外挂的讨论,自动点射和压枪只需在鼠标驱动上做些改动即可,自瞄或其他高级功能则需要读内存或修改游戏文件,检测也更容 ...

  6. ibatis使用--SqlMapClient对象

    SqlMapClient对象 这个对象是iBatis操作数据库的接口(执行CRUD等操作),它也可以执行事务管理等操作.这个类是我们使用iBATIS的最主要的类.它是线程安全的.通常,将它定义为单例. ...

  7. 住javaWeb分页实现(模拟百度首页)

    本文来源于 http://blog.csdn.net/tjpu_lin/article/details/41050475 近期在开发一个项目,项目中有非常多数据展示的模块.所以要用到分页,网上搜了非常 ...

  8. the process cannot access the file because it is being used by another process

    当在IIS中改动绑定的port号后启动时遇到例如以下错误,表明你的port号已经被占用了 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdmljMDIyOA ...

  9. NSString属性什么时候用copy,什么时候用strong?【转】

    转自:http://www.cocoachina.com/ios/20150512/11805.html. 我们在声明一个NSString属性时,对于其内存相关特性,通常有两种选择(基于ARC环境): ...

  10. JQuery或JavaScript获取网页的宽度、高等

    最近多次使用JQery或JavaScript获取网页的宽度或者高度,在网上搜索N久之后发现很多都是粘贴上去并没有详细的介绍,这里我将会对经常使用的一些获取页面宽高的属性,方法做详细的介绍,以便能够更加 ...