概要

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. ulimit -t 引起的kill血案

    http://my.oschina.net/leejun2005/blog/80975 http://www.cnblogs.com/hazir/p/systemtap_introduction.ht ...

  2. Qt C++中的关键字explicit——防止隐式转换(也就是Java里的装箱),必须写清楚

    最近在复习QT,准备做项目了,QT Creator 默认生成的代码 explicit Dialog(QWidget *parent = 0)中,有这么一个关键字explicit,用来修饰构造函数.以前 ...

  3. jQuery的animate方法在IE7下出现小问题

    接上,今天接着修改网站的bug,还是网页的这几张图片,还是滑动效果,但在IE7下不但几张图片只显示一张,更别提滑动效果了,根本滑不了啊: 然后打开IE的F12工具,先看样式,再看滑动效果:本来应该显示 ...

  4. DSP与单片机的区别

    以前刚学习单片机时,经过一订的编程,能实现很多不同的功能,当时就觉得单片机真的是神通广大.后来接触到DSP,发现DSP处理数字在通信上,更加方便.于是我就很好奇的问自己,DSP和单片机,究竟有什么区别 ...

  5. Gwt ListBox选中自动触发事件

    以前用TreeView显示,需求更改 需要做一个ListBox控件显示数据,和HTML中的<Select>标签一样 编辑时候自动触发选中的数据子类: 1.只要自动触发了rootListBo ...

  6. winzip15.0注冊码

    username:Juzhaofeng 授权码:MPZRP-Y7LWW-K1DKG-FM92E-2C5F5-ZEKFF

  7. 奔五的人学IOS:swift练手与csdn,最近学习总结

    早在五月份就准备開始学习ios开发,当时还是oc,学习了几天,最终不得其法.到了ios8开放,再加swift的出现.从10月份開始.最终找到了一些技巧,学习起来还算略有心得. 今天把我在学习swift ...

  8. JMeter简单的性能测试实例

    JMeter基础之——一个简单的性能测试 我们了解了jmeter的一此主要元件,那么这些元件如何使用到性能测试中呢.这一节创建一个简单的测试计划来使用这些元件.该计划对应的测试需求. 1)测试目标网站 ...

  9. [Regular Expressions] Introduction

    var str = "Is this This?"; //var regex = new RegExp("is", "gi"); var r ...

  10. 一个不错的PPT,扁平化设计,开放资源,要的进来

    开了那么多的博客,没做啥资源贡献,今天共享一个不错的PPT模板.例如以下图所看到的,须要的话留下邮箱 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGFp ...