概要

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. 通过设计让APP变快的6个方法

    我们都知道不管网页还是移动应用,响应速度都是最重要的体验指标之一,并且移动应用的网络环境不稳定,速度的体验显得尤为重要.其实速度优化不仅是程序员的事,设计,也能够让APP变得更快. 1. 后台执行 这 ...

  2. 使用NUnit进行项目的单元测试

    using System; using System.Collections; using System.Collections.Generic; using NUnit.Framework; nam ...

  3. 2015必须推荐的Android框架,猿必读系列!

    一.Guava Google 的基于java1.6的类库集合的扩展项目,包括collections, caching, primitives support, concurrency librarie ...

  4. authbind start tomcat services as user with less that 1024 ports. linux常规用户使用tomcat的80端口

    Start tomcat services using authbind this will allow user to start ports less than 1024 we do not ne ...

  5. 【转】android 开发 命名规范

    原文网址:http://www.cnblogs.com/ycxyyzw/p/4103284.html 标识符命名法标识符命名法最要有四种: 1 驼峰(Camel)命名法:又称小驼峰命名法,除首单词外, ...

  6. linux/unix 段错误捕获【续】

    本文为“在C/C++中捕获段错误,打印出错的具体位置”的续篇,进一步解决涉及动态链接库的情况.   背景知识: ·linux/unix下动态链接库的基本原理 ·/proc/pid/maps文件的基本格 ...

  7. java java.uitl.Random产生随机数

    通过使用java.uitl.Random产生一个1-10内的随机数.例: Random random = new Random(); int i = Math.abs(random.nextInt() ...

  8. DotNet程序汉化过程--SnippetCompiler奇葩的字符串

    开篇前言 汉化的过程总会遇到各种各样的问题,让人抓狂,这一篇我就来讲解一下一个特殊的单词的汉化以及我的“艰辛历程”. 起因介绍 在SnippetCompiler有这么一个奇葩的字符串“查找>&g ...

  9. HTML基础知识笔记(三)

    HTML下拉列表框 讲解: 1.value: <option value="House Blend">House Blend</option> 2.sele ...

  10. sqlserver中的rowversion

    rowversion 公开数据库中自动生成的唯一二进制数字的数据类型.rowversion通常用作给表行加版本戳的机制,存储大小为8字节.rowversion数据类型只是递增的数字,不保留日期或时间. ...