1. myeclipse中安装checkstyle
提示:其他方法(1)可以拷贝features和plugins到myeclipse里面(2)可以使用myeclipse设置link文件的形式引入checkstyle。
本人这里用下面的方法:
1.1 下载和安装
(1)需要下载eclipse的checkstyle插件
链接:http://sourceforge.net/projects/eclipse-cs/files/
(2)启动myeclipse,视图help->Myeclipse configuration center如图:
(3)视图software->add site如图:
(4)填入一个名字(最好选择我们要装插件的名字),然后点击add form archive file
找到我们开始下载的插件zip文件添加进来,如图:
(5)如下图右键属性,add to profile
(6)右下角 apply 1 change.开始安装
(7)后续步骤一般为下一步和同意协议即可安装完成,重启后出现如图安装成功。
1.2 使用和配置
(1)导入工程,右键->properties,勾选1,是进行验证,然后再2的地方可以导入xml规则文件。
(2)打开工程即可看到如图效果:
2. DOS命令行使用checkstyle
2.1 DOS命令格式概述
命令格式:
· -n 指定包名
· -f 指定输出的格式,默认为”plain”,还可以为XML
· -p 指定要验证的java文件
· -o 讲验证信息输出到一个日志等文件中
· -r 指定要验证的目录
2.2 使用java代码封装DOS下checkstyle
使用思路:(大家有什么好的方法告诉我谢谢,类似执行脚本的)
(1)确定一个文件或者一个目录,
(2)使用java编写一个传入文件位置和验证规则的方法(或者有版本)
(3)调用该方法传入文件位置和规则位置
(4)代码产生一个临时.bat文件,然后Runtime调用执行该.bat文件
private void service(String fileName,String ruleName,String version){
BufferedWriter writer=null;
Runtime rt=Runtime.getRuntime();
Process p=null;
String []execut=this.getStringScript(fileName, ruleName, version);
File f = new File(execut[1]);
try {
//写入脚本
writer=new BufferedWriter(new FileWriter(f));
writer.write(execut[0]);
writer.flush();
//执行脚本
System.out.println(execut[1]);
rt.exec("cmd /c "+execut[1]);
} catch (IOException e) {
System.out.println("Process-rt.exec(execut)执行异常");
e.printStackTrace();
}finally{
//关闭流
if(p!=null){
p.destroy();
}
if(writer!=null){
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//return f;
}
/**
* 用来截取生成文件的名字
* @param fIleName xxx.java文件
* @return xxx
*/
private String getFileName(String fIleName){
return fIleName.substring(fIleName.lastIndexOf("/")+1,fIleName.lastIndexOf("."));
}
/**
* 用来生成一个.bat的脚本
*@param FIleName需要验证的文件名
* @param ruleName验证规则
* @param version验证版本
* @return str[0]脚本 str[1].bat文件的位置
*/
private String[] getStringScript(String fileName,String ruleName,String version){
String []str=new String[2];
//获取当前jdk的路径
String dir=this.getDir();
StringBuilder sb=new StringBuilder();
//配置临时环境变量
//sb.append("set JAVA_HOME="+dir+"/jdk \r\n");
//sb.append("set PATH=%JAVA_HOME%/bin;%JAVA_HOME%/jre/bin \r\n");
sb.append("set CLASSPATH="+dir+"/lib/checkstyle-5.7-all.jar;"+dir+"/jdk/lib \r\n");
sb.append("echo \"start run\" \r\n");
sb.append("java com.puppycrawl.tools.checkstyle.Main -c "+
dir+"/role/"+ruleName+" "+dir+"/test/"+fileName);
sb.append(" >>"+this.outputFilePath(dir, fileName, version)+" \r\n");
sb.append("echo \"end run\" \r\n pause");
str[0]=sb.toString();
str[1]=dir+"/tempbat/"+getFileName(fileName)+".bat";
return str;
}
/**
* 获取工程路径
* @return 字符串路径
*/
public String getDir(){
String dir=System.getProperty("user.dir");
return dir.replaceAll("\\\\", "/");
}
/**
* 成功脚本
* @param dir工程目录
* @param fileName 测试文件名字
* @return 生成输出文件的所在路径和名字
*/
public String outputFilePath(String dir,String fileName,String version){
return dir+"/log/"+getFileName(fileName)+version+".log";
}
}
2.3 使用checkstyle的Main方法实现验证
使用思路:
(1)CMD调用的是checkstyle的一个com.puppycrawl.tools.checkstyle.Main.main方法(静态方法)
(2)根据自己的需求构建相应的函数
(3)将对应的参数传进去即可
Java代码:
/**
* 2.第二种方式
* @param FileName
* @param ruleName
* @param version
*/
public void serviceJava(String fileName,String ruleName,String version ){
String dir=this.getDir();
String[] parm = new String[]{"-c", ruleName, "-r",fileName,"-o",
this.outputFilePath(dir, fileName, version)};
com.puppycrawl.tools.checkstyle.Main.main(parm);
}
/**
* 用来截取生成文件的名字
* @param fIleName xxx.java文件
* @return xxx
*/
private String getFileName(String fIleName){
return fIleName.substring(fIleName.lastIndexOf("/")+1,fIleName.lastIndexOf("."));
}
/**
* 获取工程路径
* @return 字符串路径
*/
public String getDir(){
String dir=System.getProperty("user.dir");
return dir.replaceAll("\\\\", "/");
}
/**
* 成功脚本
* @param dir工程目录
* @param fileName 测试文件名字
* @return 生成输出文件的所在路径和名字
*/
public String outputFilePath(String dir,String fileName,String version){
return dir+"/log/"+getFileName(fileName)+version+".log";
}
3. lis系统常用规则
<?xml version="1.0"?>详细的规则说明可以参考下面这篇博客:
<!DOCTYPE module PUBLIC
"-//Puppy Crawl//DTD Check Configuration 1.2//EN"
"http://www.puppycrawl.com/dtds/configuration_1_2.dtd">
<module name="Checker">
<!-- 重复代码的检查,超过8行就认为重复,UTF-8格式
本检查一定要放在"TreeWalker"节点前,否则在
Checkclipse中会无法使用。(在ant下可以)
-->
<module name="StrictDuplicateCode">
<property name="min" value="8"/>
<!-- <property name="charset" value="UTF-8"/> -->
</module>
<!-- 长度方面的检查 -->
<!-- 文件长度不超过1500行 -->
<module name="FileLength">
<property name="max" value="1500"/>
</module>
<module name="TreeWalker">
<!-- javadoc的检查 -->
<!-- 检查所有的interface和class -->
<module name="JavadocType"/>
<!-- 检查所有方法的javadoc,可以不声明RuntimeException -->
<module name="JavadocMethod">
<property name="allowUndeclaredRTE" value="true"/>
</module>
<!-- 检查某个变量的javadoc -->
<module name="JavadocVariable"/>
<!-- 命名方面的检查,它们都使用了Sun官方定的规则。 -->
<!-- 类名(class 或interface) 的检查 -->
<module name="TypeName"/>
<!-- 变量的检查 -->
<module name="MemberName"/>
<!-- 方法名的检查 -->
<module name="MethodName"/>
<!-- 方法的参数名 -->
<module name="ParameterName "/>
<!-- 常量名的检查 -->
<module name="ConstantName"/>
<!-- 每行不超过120个字-->
<module name="LineLength">
<property name="max" value="120"/>
</module>
<!-- 方法不超过30行 -->
<module name="MethodLength">
<property name="tokens" value="METHOD_DEF"/>
<property name="max" value="30"/>
</module>
<!-- 方法的参数个数不超过3个。 -->
<module name="ParameterNumber">
<property name="max" value="3"/>
</module>
<!-- 多余的关键字 -->
<module name="RedundantModifier"/>
<!-- 对区域的检查 -->
<!-- 不能出现空白区域 -->
<module name="EmptyBlock"/>
<!-- 所有区域都要使用大括号。 -->
<module name="NeedBraces"/>
<!-- 多余的括号 -->
<module name="AvoidNestedBlocks">
<property name= "allowInSwitchCase"
value="true"/>
</module>
<!-- 编码方面的检查 -->
<!-- 不许出现空语句 -->
<module name="EmptyStatement"/>
<!-- 每个类都实现了equals()和hashCode() -->
<module name="EqualsHashCode"/>
<!-- 不许使用switch -->
<module name="IllegalToken">
<property name="tokens"
value="LITERAL_SWITCH"/>
</module>
<!-- 不许内部赋值 -->
<module name="InnerAssignment"/>
<!-- 绝对不能容忍魔法数 -->
<module name="MagicNumber"/>
<!-- 循环控制变量不能被修改 -->
<module name="ModifiedControlVariable"/>
<!-- 多余的throw -->
<module name="RedundantThrows"/>
<!-- 不许使用未被简化的条件表达式 -->
<module name="SimplifyBooleanExpression"/>
<!-- 不许使用未被简化的布尔返回值 -->
<module name="SimplifyBooleanReturn"/>
<!-- String的比较不能用!= 和 == -->
<module name="StringLiteralEquality"/>
<!-- if最多嵌套3层 -->
<module name="NestedIfDepth">
<property name="max" value="3"/>
</module>
<!-- try最多被嵌套1层 -->
<module name="NestedTryDepth"/>
<!-- clone方法必须调用了super.clone() -->
<module name="SuperClone"/>
<!-- finalize 必须调用了super.finalize() -->
<module name="SuperFinalize"/>
<!-- 不能catch java.lang.Exception -->
<module name="IllegalCatch">
<property name="illegalClassNames"
value="java.lang.Exception"/>
</module>
<!-- JUnitTestCase 的核心方法存在。 -->
<module name="JUnitTestCase"/>
<!-- 一个方法中最多有3个return -->
<module name="ReturnCount">
<property name="max" value="3"/>
</module>
<!-- 不许对方法的参数赋值 -->
<module name="ParameterAssignment"/>
<!-- 不许有同样内容的String -->
<module name="MultipleStringLiterals"/>
<!-- 同一行不能有多个声明 -->
<module name="MultipleVariableDeclarations"/>
<!-- 各种量度 -->
<!-- 布尔表达式的复杂度,不超过3 -->
<module name="BooleanExpressionComplexity"/>
<!-- 类数据的抽象耦合,不超过7 -->
<module name="ClassDataAbstractionCoupling"/>
<!-- 类的分散复杂度,不超过20 -->
<module name="ClassFanOutComplexity"/>
<!-- 函数的分支复杂度,不超过10 -->
<module name="CyclomaticComplexity"/>
<!-- NPath复杂度,不超过200 -->
<module name="NPathComplexity"/>
<!-- 杂项 -->
<!-- 禁止使用System.out.println -->
<module name="Regexp">
<property name="format" value="System\.out\.println"/>
<property name="ignoreComments" value="true"/>
</module>
<!-- 不许使用与代码同行的注释 -->
<module name="TrailingComment"/>
</module>
<!-- 检查翻译文件 -->
<module name="Translation"/>
</module>
链接:http://blog.csdn.net/yang1982_0907/article/details/18086693
我的工程目录:
jdk:需要加入Jdk
lib:外部使用的jar
log:生成的日志文件存放目录
role:xml规则目录
tempbat:生成的临时.bat文件
test:需要测试的代码文件夹