一、安裝與簡介
eclipse和idea都有對應的插件,找到插件安裝界面。搜索checkstyle,點擊安裝后,重啟IDE即可。(網上有很多安裝教程,就不重復制造輪子了)
二、導入配置文件
在checkstyle的設置界面導入我們自己寫的配置文件。寫了兩個配置文件,都是基本符合阿里巴巴規范的。第一個是比較精簡的(不檢測魔術數字,不檢測方法的doc等)。第二個是完整的,檢測規范較多,有些過於嚴苛了,個人使用了第一個規范配置。
精簡版
<?xml version="1.0"?>
<!DOCTYPE module PUBLIC "-//Puppy Crawl//DTD Check Configuration 1.3//EN" "http://www.puppycrawl.com/dtds/configuration_1_3.dtd">
<module name="Checker">
<!-- 檢查文件是否以一個空行結束 -->
<module name="NewlineAtEndOfFile"/>
<!-- 文件長度不超過1500行 -->
<module name="FileLength">
<property name="max" value="1500"/>
</module>
<!-- 每個java文件一個語法樹 -->
<module name="TreeWalker">
<!-- import檢查-->
<!-- 檢查是否從非法的包中導入了類 -->
<module name="IllegalImport"/>
<!-- 檢查是否導入了多余的包 -->
<module name="RedundantImport"/>
<!-- 沒用的import檢查,比如:1.沒有被用到2.重復的3.import java.lang的4.import 與該類在同一個package的 -->
<module name="UnusedImports" />
<!-- 注釋檢查 -->
<!-- 檢查構造函數的javadoc -->
<module name="JavadocType">
<property name="allowUnknownTags" value="true"/>
<message key="javadoc.missing" value="類注釋:缺少Javadoc注釋。"/>
</module>
<!-- 命名檢查 -->
<!-- 局部的final變量,包括catch中的參數的檢查 -->
<module name="LocalFinalVariableName" />
<!-- 局部的非final型的變量,包括catch中的參數的檢查 -->
<module name="LocalVariableName" />
<!-- 包名的檢查(只允許小寫字母),默認^[a-z]+(\.[a-zA-Z_][a-zA-Z_0-9_]*)*$ -->
<module name="PackageName">
<property name="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$" />
<message key="name.invalidPattern" value="包名 ''{0}'' 要符合 ''{1}''格式."/>
</module>
<!-- 僅僅是static型的變量(不包括static final型)的檢查 -->
<module name="StaticVariableName" />
<!-- Class或Interface名檢查,默認^[A-Z][a-zA-Z0-9]*$-->
<module name="TypeName">
<property name="severity" value="warning"/>
<message key="name.invalidPattern" value="名稱 ''{0}'' 要符合 ''{1}''格式."/>
</module>
<!-- 非static型變量的檢查 -->
<module name="MemberName" />
<!-- 方法名的檢查 -->
<module name="MethodName" />
<!-- 方法的參數名 -->
<module name="ParameterName " />
<!-- 常量名的檢查(只允許大寫),默認^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$ -->
<module name="ConstantName" />
<!-- 定義檢查 -->
<!-- 檢查數組類型定義的樣式 -->
<module name="ArrayTypeStyle"/>
<!-- 檢查long型定義是否有大寫的“L” -->
<module name="UpperEll"/>
<!-- 長度檢查 -->
<!-- 每行不超過140個字符 -->
<module name="LineLength">
<property name="max" value="140" />
</module>
<!-- 方法不超過50行 -->
<module name="MethodLength">
<property name="tokens" value="METHOD_DEF" />
<property name="max" value="50" />
</module>
<!-- 方法的參數個數不超過5個。 並且不對構造方法進行檢查-->
<module name="ParameterNumber">
<property name="max" value="5" />
<property name="ignoreOverriddenMethods" value="true"/>
<property name="tokens" value="METHOD_DEF" />
</module>
<!-- 空格檢查-->
<!-- 方法名后跟左圓括號"(" -->
<module name="MethodParamPad" />
<!-- 在類型轉換時,不允許左圓括號右邊有空格,也不允許與右圓括號左邊有空格 -->
<module name="TypecastParenPad" />
<!-- 檢查在某個特定關鍵字之后應保留空格 -->
<module name="NoWhitespaceAfter"/>
<!-- 檢查在某個特定關鍵字之前應保留空格 -->
<module name="NoWhitespaceBefore"/>
<!-- 操作符換行策略檢查 -->
<module name="OperatorWrap"/>
<!-- 圓括號空白 -->
<module name="ParenPad"/>
<!-- 檢查分隔符是否在空白之后 -->
<module name="WhitespaceAfter"/>
<!-- 檢查分隔符周圍是否有空白 -->
<module name="WhitespaceAround"/>
<!-- 修飾符檢查 -->
<!-- 檢查修飾符的順序是否遵照java語言規范,默認public、protected、private、abstract、static、final、transient、volatile、synchronized、native、strictfp -->
<module name="ModifierOrder"/>
<!-- 檢查接口和annotation中是否有多余修飾符,如接口方法不必使用public -->
<module name="RedundantModifier"/>
<!-- 代碼塊檢查 -->
<!-- 檢查是否有嵌套代碼塊 -->
<module name="AvoidNestedBlocks"/>
<!-- 檢查是否有空代碼塊 -->
<module name="EmptyBlock"/>
<!-- 檢查左大括號位置 -->
<module name="LeftCurly"/>
<!-- 檢查代碼塊是否缺失{} -->
<module name="NeedBraces"/>
<!-- 檢查右大括號位置 -->
<module name="RightCurly"/>
<!-- 代碼檢查 -->
<!-- 檢查空的代碼段 -->
<module name="EmptyStatement"/>
<!-- 檢查在重寫了equals方法后是否重寫了hashCode方法 -->
<module name="EqualsHashCode"/>
<!-- 檢查局部變量或參數是否隱藏了類中的變量 -->
<module name="HiddenField">
<property name="tokens" value="VARIABLE_DEF"/>
</module>
<!-- 檢查子表達式中是否有賦值操作 -->
<module name="InnerAssignment"/>
<!-- 檢查switch語句是否有default -->
<module name="MissingSwitchDefault"/>
<!-- 檢查是否有過度復雜的布爾表達式 -->
<module name="SimplifyBooleanExpression"/>
<!-- 檢查是否有過於復雜的布爾返回代碼段 -->
<module name="SimplifyBooleanReturn"/>
<!-- 類設計檢查 -->
<!-- 檢查類是否為擴展設計l -->
<!-- 檢查只有private構造函數的類是否聲明為final -->
<module name="FinalClass"/>
<!-- 檢查接口是否僅定義類型 -->
<module name="InterfaceIsType"/>
<!-- 檢查類成員的可見度 檢查類成員的可見性。只有static final 成員是public的 除非在本檢查的protectedAllowed和packagedAllowed屬性中進行了設置-->
<module name="VisibilityModifier">
<property name="packageAllowed" value="true"/>
<property name="protectedAllowed" value="true"/>
</module>
<!-- 語法 -->
<!-- String的比較不能用!= 和 == -->
<module name="StringLiteralEquality"/>
<!-- 限制for循環最多嵌套2層 -->
<module name="NestedForDepth">
<property name="max" value="2"/>
</module>
<!-- if最多嵌套3層 -->
<module name="NestedIfDepth">
<property name="max" value="3"/>
</module>
<!-- 檢查未被注釋的main方法,排除以Appllication結尾命名的類 -->
<module name="UncommentedMain">
<property name="excludedClasses" value=".*[Application,Test]$"/>
</module>
<!-- 禁止使用System.out.println -->
<module name="Regexp">
<property name="format" value="System\.out\.println"/>
<property name="illegalPattern" value="true"/>
</module>
<!-- return個數 3個-->
<module name="ReturnCount">
<property name="max" value="3"/>
</module>
<!--try catch 異常處理數量 3-->
<module name="NestedTryDepth ">
<property name="max" value="3"/>
</module>
<!-- clone方法必須調用了super.clone() -->
<module name="SuperClone" />
<!-- finalize 必須調用了super.finalize() -->
<module name="SuperFinalize" />
</module>
</module>
完整版
<?xml version="1.0"?>
<!DOCTYPE module PUBLIC "-//Puppy Crawl//DTD Check Configuration 1.3//EN" "http://www.puppycrawl.com/dtds/configuration_1_3.dtd">
<module name="Checker">
<!-- 檢查文件是否以一個空行結束 -->
<module name="NewlineAtEndOfFile"/>
<!-- 文件長度不超過1500行 -->
<module name="FileLength">
<property name="max" value="1500"/>
</module>
<!-- 每個java文件一個語法樹 -->
<module name="TreeWalker">
<!-- import檢查-->
<!-- 避免使用* -->
<module name="AvoidStarImport">
<property name="excludes" value="java.io,java.net,java.lang.Math"/>
<!-- 實例;import java.util.*;.-->
<property name="allowClassImports" value="false"/>
<!-- 實例 ;import static org.junit.Assert.*;-->
<property name="allowStaticMemberImports" value="true"/>
</module>
<!-- 檢查是否從非法的包中導入了類 -->
<module name="IllegalImport"/>
<!-- 檢查是否導入了多余的包 -->
<module name="RedundantImport"/>
<!-- 沒用的import檢查,比如:1.沒有被用到2.重復的3.import java.lang的4.import 與該類在同一個package的 -->
<module name="UnusedImports" />
<!-- 注釋檢查 -->
<!-- 檢查方法和構造函數的javadoc -->
<module name="JavadocType">
<property name="allowUnknownTags" value="true"/>
<message key="javadoc.missing" value="類注釋:缺少Javadoc注釋。"/>
</module>
<module name="JavadocMethod">
<property name="tokens" value="METHOD_DEF" />
<!--允許get set 方法沒有注釋-->
<property name="allowMissingPropertyJavadoc" value="true"/>
<message key="javadoc.missing" value="方法注釋:缺少Javadoc注釋。"/>
</module>
<!-- 命名檢查 -->
<!-- 局部的final變量,包括catch中的參數的檢查 -->
<module name="LocalFinalVariableName" />
<!-- 局部的非final型的變量,包括catch中的參數的檢查 -->
<module name="LocalVariableName" />
<!-- 包名的檢查(只允許小寫字母),默認^[a-z]+(\.[a-zA-Z_][a-zA-Z_0-9_]*)*$ -->
<module name="PackageName">
<property name="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$" />
<message key="name.invalidPattern" value="包名 ''{0}'' 要符合 ''{1}''格式."/>
</module>
<!-- 僅僅是static型的變量(不包括static final型)的檢查 -->
<module name="StaticVariableName" />
<!-- Class或Interface名檢查,默認^[A-Z][a-zA-Z0-9]*$-->
<module name="TypeName">
<property name="severity" value="warning"/>
<message key="name.invalidPattern" value="名稱 ''{0}'' 要符合 ''{1}''格式."/>
</module>
<!-- 非static型變量的檢查 -->
<module name="MemberName" />
<!-- 方法名的檢查 -->
<module name="MethodName" />
<!-- 方法的參數名 -->
<module name="ParameterName " />
<!-- 常量名的檢查(只允許大寫),默認^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$ -->
<module name="ConstantName" />
<!-- 定義檢查 -->
<!-- 檢查數組類型定義的樣式 -->
<module name="ArrayTypeStyle"/>
<!-- 檢查long型定義是否有大寫的“L” -->
<module name="UpperEll"/>
<!-- 長度檢查 -->
<!-- 每行不超過120個字符 -->
<module name="LineLength">
<property name="max" value="120" />
</module>
<!-- 方法不超過50行 -->
<module name="MethodLength">
<property name="tokens" value="METHOD_DEF" />
<property name="max" value="50" />
</module>
<!-- 方法的參數個數不超過5個。 並且不對構造方法進行檢查-->
<module name="ParameterNumber">
<property name="max" value="5" />
<property name="ignoreOverriddenMethods" value="true"/>
<property name="tokens" value="METHOD_DEF" />
</module>
<!-- 空格檢查-->
<!-- 方法名后跟左圓括號"(" -->
<module name="MethodParamPad" />
<!-- 在類型轉換時,不允許左圓括號右邊有空格,也不允許與右圓括號左邊有空格 -->
<module name="TypecastParenPad" />
<!-- 檢查在某個特定關鍵字之后應保留空格 -->
<module name="NoWhitespaceAfter"/>
<!-- 檢查在某個特定關鍵字之前應保留空格 -->
<module name="NoWhitespaceBefore"/>
<!-- 操作符換行策略檢查 -->
<module name="OperatorWrap"/>
<!-- 圓括號空白 -->
<module name="ParenPad"/>
<!-- 檢查分隔符是否在空白之后 -->
<module name="WhitespaceAfter"/>
<!-- 檢查分隔符周圍是否有空白 -->
<module name="WhitespaceAround"/>
<!-- 修飾符檢查 -->
<!-- 檢查修飾符的順序是否遵照java語言規范,默認public、protected、private、abstract、static、final、transient、volatile、synchronized、native、strictfp -->
<module name="ModifierOrder"/>
<!-- 檢查接口和annotation中是否有多余修飾符,如接口方法不必使用public -->
<module name="RedundantModifier"/>
<!-- 代碼塊檢查 -->
<!-- 檢查是否有嵌套代碼塊 -->
<module name="AvoidNestedBlocks"/>
<!-- 檢查是否有空代碼塊 -->
<module name="EmptyBlock"/>
<!-- 檢查左大括號位置 -->
<module name="LeftCurly"/>
<!-- 檢查代碼塊是否缺失{} -->
<module name="NeedBraces"/>
<!-- 檢查右大括號位置 -->
<module name="RightCurly"/>
<!-- 代碼檢查 -->
<!-- 檢查空的代碼段 -->
<module name="EmptyStatement"/>
<!-- 檢查在重寫了equals方法后是否重寫了hashCode方法 -->
<module name="EqualsHashCode"/>
<!-- 檢查局部變量或參數是否隱藏了類中的變量 -->
<module name="HiddenField">
<property name="tokens" value="VARIABLE_DEF"/>
</module>
<!-- 檢查是否使用工廠方法實例化 -->
<module name="IllegalInstantiation"/>
<!-- 檢查子表達式中是否有賦值操作 -->
<module name="InnerAssignment"/>
<!-- 檢查是否有"魔術"數字 -->
<module name="MagicNumber">
<property name="ignoreNumbers" value="0, 1"/>
<property name="ignoreAnnotation" value="true"/>
</module>
<!-- 檢查switch語句是否有default -->
<module name="MissingSwitchDefault"/>
<!-- 檢查是否有過度復雜的布爾表達式 -->
<module name="SimplifyBooleanExpression"/>
<!-- 檢查是否有過於復雜的布爾返回代碼段 -->
<module name="SimplifyBooleanReturn"/>
<!-- 類設計檢查 -->
<!-- 檢查類是否為擴展設計l -->
<!-- 檢查只有private構造函數的類是否聲明為final -->
<module name="FinalClass"/>
<!-- 檢查工具類是否有putblic的構造器 -->
<module name="HideUtilityClassConstructor"/>
<!-- 檢查接口是否僅定義類型 -->
<module name="InterfaceIsType"/>
<!-- 檢查類成員的可見度 檢查類成員的可見性。只有static final 成員是public的 除非在本檢查的protectedAllowed和packagedAllowed屬性中進行了設置-->
<module name="VisibilityModifier">
<property name="packageAllowed" value="true"/>
<property name="protectedAllowed" value="true"/>
</module>
<!-- 語法 -->
<!-- String的比較不能用!= 和 == -->
<module name="StringLiteralEquality"/>
<!-- 限制for循環最多嵌套2層 -->
<module name="NestedForDepth">
<property name="max" value="2"/>
</module>
<!-- if最多嵌套3層 -->
<module name="NestedIfDepth">
<property name="max" value="3"/>
</module>
<!-- 檢查未被注釋的main方法,排除以Appllication結尾命名的類 -->
<module name="UncommentedMain">
<property name="excludedClasses" value=".*Application$"/>
</module>
<!-- 禁止使用System.out.println -->
<module name="Regexp">
<property name="format" value="System\.out\.println"/>
<property name="illegalPattern" value="true"/>
</module>
<!-- return個數 3個-->
<module name="ReturnCount">
<property name="max" value="3"/>
</module>
<!--try catch 異常處理數量 3-->
<module name="NestedTryDepth ">
<property name="max" value="3"/>
</module>
<!-- clone方法必須調用了super.clone() -->
<module name="SuperClone" />
<!-- finalize 必須調用了super.finalize() -->
<module name="SuperFinalize" />
</module>
</module>