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"; }
<?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:需要测试的代码文件夹