爪哇一角

          共同探討STRUTS#HIBERNATE#SPRING#EJB等技術
          posts - 3, comments - 6, trackbacks - 0, articles - 99
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          CheckStyle使用手冊(轉載)

          Posted on 2011-11-01 15:54 非洲小白臉 閱讀(1037) 評論(0)  編輯  收藏 所屬分類: 項目管理
          介紹
          CheckStyle是SourceForge下的一個項目,提供了一個幫助JAVA開發人員遵守某些編碼規范的工具。它能夠自動化代碼規范檢查過程,從 而使得開發人員從這項重要,但是枯燥的任務中解脫出來。
          CheckStyle默認提供一下主要檢查內容:
            •Javadoc注釋
            •命名約定
            •標題
            •Import語句
            •體積大小
            •空白
            •修飾符
             •塊
            •代碼問題
            •類設計
            •混合檢查(包活一些有用的比如非必須的 System.out和printstackTrace)
            從上面可以看出,CheckStyle提供了大部分功能都是對于代碼規范 的檢查,而沒有提供象PMD和Jalopy那么多的增強代碼質量和修改代碼的功能。但是,對于團隊開發,尤其是強調代碼規范的公司來說,它的功能已經足夠強大。
          Eclipse插件安裝和使用
          步驟一:http://sourceforge.net/projects/checkclipse/下載checkstyle的eclipse插件checkclipse。下載后,將包放入eclipse的plugins文件夾下,然后重啟eclipse。在Windows—>preferences下找到checkclipse。如下圖:

          勾選Set Project Dir as Checkjstyle Basedir
          步驟二:右鍵選中你要進行checkstyle的項目文件,選擇“properties”。如下圖:

          勾選Enable Checkstyle和Set Project ClassLoader.
          然后再Checkstyle Configuraion File中選擇項目中checkstyle的配置文件。這里我把配置文件時放置在項目根目錄下,所以點擊右側“Browse”按鈕,在項目根目錄下選擇該文件。按“OK”按鈕。
          這樣整個項目的代碼將根據配置文件中設置的原則進行出錯提示.結果如下圖:

          由圖可知對不符合代碼規范的代碼會有錯誤提示,并且有提示信息。
          Maven插件安裝和使用
          首先,修改要檢查代碼庫top級的pom.xml文件,在build部分配置CheckStyle的Maven插件,以便于下載安裝對應版本的插件(Maven會自動從其鏡像庫中下載),方法如下:
          Java代碼 復制代碼 收藏代碼
          1. <project>   
          2.   ...   
          3.   <build>   
          4.     <plugins>   
          5.       <plugin>   
          6.         <groupId>org.apache.maven.plugins</groupId>   
          7.         <artifactId>maven-checkstyle-plugin</artifactId>   
          8.         <version>2.3</version>   
          9.       </plugin>   
          10.     </plugins>   
          11.   </build>   
          12.   ...   
          13. </project>  

          maven-checkstyle-plugin的最新版本為2.5,其對應的CheckStyle核心版本為5.0;maven-checkstyle-plugin 2.3對應的CheckStyle核心版本為4.4。查看插件的pom文件,可看到如下內容,其中的版本號就為對應的CheckStyle的版本號。
          Java代碼 復制代碼 收藏代碼
          1. <dependency>   
          2.   <groupId>checkstyle</groupId>    
          3.   <artifactId>checkstyle</artifactId>    
          4.   <version>4.4</version>    
          5.   </dependency>  

          接下來,將自定義的規則配置文件拷貝到top級目錄,在reporting部分的CheckStyle插件配置中引用配置。
          Java代碼 復制代碼 收藏代碼
          1. <reporting>   
          2.     <plugins>   
          3.         <plugin>   
          4.             <groupId>org.apache.maven.plugins</groupId>   
          5.             <artifactId>maven-checkstyle-plugin</artifactId>   
          6.             <configuration>   
          7.               <configLocation>my_checks.xml</configLocation>   
          8.             </configuration>   
          9.         </plugin>   
          10.     </plugins>   
          11. </reporting>  

          也可以將配置文件放在子文件夾下,配置中帶上相對路徑即可。
          Java代碼 復制代碼 收藏代碼
          1. <reporting>   
          2.     <plugins>   
          3.         <plugin>   
          4.             <groupId>org.apache.maven.plugins</groupId>   
          5.             <artifactId>maven-checkstyle-plugin</artifactId>   
          6.             <configuration>   
          7.               <configLocation>build-tools/src/main/resources/xx/my_checks.xml</configLocation>   
          8.             </configuration>   
          9.         </plugin>   
          10.     </plugins>   
          11. </reporting>  

          如果使用插件自帶的規則文件,可以作如下配置。maven-checkstyle-plugin插件自帶的規則有sun_checks.xml、maven_checks.xml等,可查看插件包。
          Java代碼 復制代碼 收藏代碼
          1. <reporting>   
          2.     <plugins>   
          3.                <plugin>   
          4.                  <groupId>org.apache.maven.plugins</groupId>   
          5.                  <artifactId>maven-checkstyle-plugin</artifactId>   
          6.                  <configuration>   
          7.                             <configLocation>config/maven_checks.xml</configLocation>   
          8.                 </configuration>   
          9.                  <version>2.3</version>          
          10.                </plugin>   
          11.     </plugins>   
          12. </reporting>  

          在reporting部分增加jxr插件,生成代碼報告,這樣在CheckStyle報告 中點擊問題對應的鏈接就可以直接看到出錯的代碼。
               
          Java代碼 復制代碼 收藏代碼
          1. <reporting>   
          2.           <plugins>   
          3.             <plugin>   
          4.               <groupId>org.apache.maven.plugins</groupId>   
          5.               <artifactId>maven-checkstyle-plugin</artifactId>   
          6.               <configuration>   
          7.                          <configLocation>my_checks.xml</configLocation>                               
          8.           </configuration>   
          9.               <version>2.3</version>          
          10.             </plugin>   
          11.             <plugin>   
          12.                    <groupId>org.apache.maven.plugins</groupId>   
          13.                  <artifactId>maven-jxr-plugin</artifactId>   
          14.             </plugin>                 
          15.           </plugins>   
          16.     </reporting>   
                    
          在build和reporting部分增加javadoc插件,如果pom文件中已經配置,則只需作相應修改。charset、encoding、docencoding配置用于解決生成的javadoc文件中文亂碼問題;aggregate配置為true則javadoc報告會集中顯示所有子模塊的javadoc。
                 
          Java代碼 復制代碼 收藏代碼
          1. <reporting>   
          2.             <plugins>   
          3.               <plugin>   
          4.                           <groupId>org.apache.maven.plugins</groupId>   
          5.                           <artifactId>maven-javadoc-plugin</artifactId>   
          6.                           <version>2.4</version>   
          7.                           <configuration>   
          8.                              <aggregate>true</aggregate>   
          9.                         <charset>UTF-8</charset>   
          10.                                       <encoding>UTF-8</encoding>   
          11.                                       <docencoding>UTF-8</docencoding>   
          12.                         </configuration>   
          13.               </plugin>               
          14.               <plugin>   
          15.                 <groupId>org.apache.maven.plugins</groupId>   
          16.                 <artifactId>maven-checkstyle-plugin</artifactId>   
          17.                 <configuration>   
          18.                            <configLocation>my_checks.xml</configLocation>                               
          19.             </configuration>   
          20.                 <version>2.3</version>          
          21.               </plugin>   
          22.               <plugin>   
          23.                      <groupId>org.apache.maven.plugins</groupId>   
          24.                    <artifactId>maven-jxr-plugin</artifactId>   
          25.               </plugin>                 
          26.             </plugins>   
          27.       </reporting>  

          在maven插件中使用 install命令將pom文件中配置的插件下載安裝到本地,然后使用checkstyle:checkstyle命令進行檢查并生成報告,運行完畢,各項目目錄下會生成target目錄,target\site\checkstyle.html即為該項目的問題報告。
          需要注意的是checkstyle:checkstyle僅生成CheckStyle相關報告,因此不能從報告中直接鏈接到錯誤代碼;需要同時生成jxr源代碼,使用site。
          如果運行checkstyle:checkstyle或site過程中出現如下錯誤,則應該修改CheckStyle規 則配置文件,去除其中的中文字符。
          Java代碼 復制代碼 收藏代碼
          1. “[ERROR] BUILD ERROR   
          2. [INFO] ------------------------------------------------------------------------   
          3. [INFO] An error has occurred in Checkstyle report generation.   
          4.     
          5. Embedded error: Failed during checkstyle configuration   
          6. Invalid byte 1 of 1-byte UTF-8 sequence.   
          7. ”  

          最佳實踐
          自定義的checkstyle配置文件
            以下代碼是自定義的checkstyle配置文件內容,相關說明都已經用注釋形式寫在文件中。代碼如下:
          Java代碼 復制代碼 收藏代碼
          1. <!DOCTYPE module PUBLIC   
          2.     "-//Puppy Crawl//DTD Check Configuration 1.2//EN"  
          3.     "http://www.puppycrawl.com/dtds/configuration_1_2.dtd">   
          4. <module name="Checker">   
          5.   
          6.     <!--   
          7.         重復代碼的檢查,超過8行就認為重復,UTF-8格式 本檢查一定要放在"TreeWalker"節點前,否則在   
          8.         Checkclipse中會無法使用。(在ant下可以)   
          9.     -->   
          10.     <module name="StrictDuplicateCode">   
          11.         <property name="min" value="8" />   
          12.         <property name="charset" value="UTF-8" />   
          13.     </module>   
          14.   
          15.     <module name="TreeWalker">   
          16.   
          17.         <!-- javadoc的檢查 -->   
          18.         <!-- 檢查所有的interfaceclass -->   
          19.         <module name="JavadocType" />   
          20.   
          21.         <!-- 命名方面的檢查,它們都使用了Sun官方定的規則。 -->   
          22.         <!-- 局部的final變量,包括catch中的參數的檢查 -->   
          23.         <module name="LocalFinalVariableName" />   
          24.         <!-- 局部的非final型的變量,包括catch中的參數的檢查 -->   
          25.         <module name="LocalVariableName" />   
          26.         <!-- 包名的檢查(只允許小寫字母) -->   
          27.         <module name="PackageName">   
          28.             <property name="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$" />   
          29.         </module>   
          30.         <!-- 僅僅是static型的變量(不包括static final型)的檢查 -->   
          31.         <module name="StaticVariableName" />   
          32.         <!-- 類型(Class或Interface)名的檢查 -->   
          33.         <module name="TypeName" />   
          34.         <!-- 非static型變量的檢查 -->   
          35.         <module name="MemberName" />   
          36.         <!-- 方法名的檢查 -->   
          37.         <module name="MethodName" />   
          38.         <!-- 方法的參數名 -->   
          39.         <module name="ParameterName " />   
          40.         <!-- 常量名的檢查 -->   
          41.         <module name="ConstantName" />   
          42.   
          43.         <!-- import方面的檢查 -->   
          44.         <!-- import中避免星號"*" -->   
          45.         <module name="AvoidStarImport" />   
          46.         <!--   
          47.             沒用的import檢查,比如:1.沒有被用到2.重復的3.import java.lang的4.import  
          48.             與該類在同一個package的   
          49.         -->   
          50.         <module name="UnusedImports" />   
          51.   
          52.   
          53.         <!-- 長度方面的檢查 -->   
          54.         <!-- 文件長度不超過1500行 -->   
          55.         <module name="FileLength">   
          56.             <property name="max" value="1500" />   
          57.         </module>   
          58.         <!-- 每行不超過120個字-->   
          59.         <module name="LineLength">   
          60.             <property name="max" value="120" />   
          61.         </module>   
          62.         <!-- 方法不超過30行 -->   
          63.         <module name="MethodLength">   
          64.             <property name="tokens" value="METHOD_DEF" />   
          65.             <property name="max" value="30" />   
          66.         </module>   
          67.         <!-- 方法的參數個數不超過3個。 并且不對構造方法進行檢查-->   
          68.         <module name="ParameterNumber">   
          69.             <property name="max" value="3" />   
          70.             <property name="tokens" value="METHOD_DEF" />   
          71.         </module>   
          72.   
          73.         <!-- 空格檢查  -->   
          74.         <!-- 允許方法名后緊跟左邊圓括號"(" -->   
          75.         <module name="MethodParamPad" />   
          76.         <!-- 在類型轉換時,不允許左圓括號右邊有空格,也不允許與右圓括號左邊有空格 -->   
          77.         <module name="TypecastParenPad" />   
          78.         <!-- 不允許使用"tab"鍵  -->   
          79.         <module name="TabCharacter" />   
          80.   
          81.         <!-- 關鍵字 -->   
          82.         <!--   
          83.             每個關鍵字都有正確的出現順序。比如 public static final XXX 是對一個常量的聲明。如果使用 static  
          84.             public final 就是錯誤的   
          85.         -->   
          86.         <module name="ModifierOrder" />   
          87.         <!-- 多余的關鍵字 -->   
          88.         <module name="RedundantModifier" />   
          89.   
          90.         <!-- 對區域的檢查 -->   
          91.         <!-- 不能出現空白區域 -->   
          92.         <module name="EmptyBlock" />   
          93.         <!-- 所有區域都要使用大括號。 -->   
          94.         <module name="NeedBraces" />   
          95.         <!-- 多余的括號 -->   
          96.         <module name="AvoidNestedBlocks">   
          97.             <property name="allowInSwitchCase" value="true" />   
          98.         </module>   
          99.   
          100.         <!-- 編碼方面的檢查 -->   
          101.         <!-- 不許出現空語句 -->   
          102.         <module name="EmptyStatement" />   
          103.         <!-- 每個類都實現了equals()和hashCode() -->   
          104.         <module name="EqualsHashCode" />   
          105.         <!-- 不許使用switch,"a++"這樣可讀性很差的代碼 -->   
          106.         <module name="IllegalToken" />   
          107.         <!-- 不許內部賦值 -->   
          108.         <module name="InnerAssignment" />   
          109.         <!-- 絕對不能容忍魔法數 -->   
          110.         <module name="MagicNumber">   
          111.             <property name="tokens" value="NUM_DOUBLE, NUM_INT" />   
          112.         </module>   
          113.         <!-- 循環控制變量不能被修改 -->   
          114.         <module name="ModifiedControlVariable" />   
          115.         <!-- 多余的throw -->   
          116.         <module name="RedundantThrows" />   
          117.         <!-- 不許使用未被簡化的條件表達式 -->   
          118.         <module name="SimplifyBooleanExpression" />   
          119.         <!-- 不許使用未被簡化的布爾返回值 -->   
          120.         <module name="SimplifyBooleanReturn" />   
          121.         <!-- String的比較不能用!= 和 == -->   
          122.         <module name="StringLiteralEquality" />   
          123.         <!-- if最多嵌套3層 -->   
          124.         <module name="NestedIfDepth">   
          125.             <property name="max" value="3" />   
          126.         </module>   
          127.         <!-- try最多被嵌套2層 -->   
          128.         <module name="NestedTryDepth">   
          129.             <property name="max" value="2" />   
          130.         </module>   
          131.         <!-- clone方法必須調用了super.clone() -->   
          132.         <module name="SuperClone" />   
          133.         <!-- finalize 必須調用了super.finalize() -->   
          134.         <module name="SuperFinalize" />   
          135.         <!-- 不能catch java.lang.Exception -->   
          136.         <module name="IllegalCatch">   
          137.             <property name="illegalClassNames" value="java.lang.Exception" />   
          138.         </module>   
          139.         <!-- 確保一個類有package聲明 -->   
          140.         <module name="PackageDeclaration" />   
          141.         <!-- 一個方法中最多有3return -->   
          142.         <module name="ReturnCount">   
          143.             <property name="max" value="3" />   
          144.             <property name="format" value="^$" />   
          145.         </module>   
          146.         <!--   
          147.             根據 Sun 編碼規范, class 或 interface 中的順序如下: 1.class 聲明。首先是 public,   
          148.             然后是protected , 然后是 package level (不包括access modifier ) 最后是private .   
          149.             (多個class放在一個java文件中的情況) 2.變量聲明。 首先是 public, 然后是protected然后是 package  
          150.             level (不包括access modifier ) 最后是private . (多個class放在一個java文件中的情況)   
          151.             3.構造函數 4.方法   
          152.         -->   
          153.         <module name="DeclarationOrder" />   
          154.         <!-- 不許對方法的參數賦值 -->   
          155.         <module name="ParameterAssignment" />   
          156.         <!-- 確保某個class 在被使用時都已經被初始化成默認值(對象是null,數字和字符是0,boolean 變量是false.) -->   
          157.         <module name="ExplicitInitialization" />   
          158.         <!-- 不許有同樣內容的String -->   
          159.         <module name="MultipleStringLiterals" />   
          160.         <!-- 同一行不能有多個聲明 -->   
          161.         <module name="MultipleVariableDeclarations" />   
          162.         <!-- 不必要的圓括號 -->   
          163.         <module name="UnnecessaryParentheses" />   
          164.   
          165.         <!-- 各種量度 -->   
          166.         <!-- 布爾表達式的復雜度,不超過3 -->   
          167.         <module name="BooleanExpressionComplexity" />   
          168.         <!-- 類數據的抽象耦合,不超過7 -->   
          169.         <module name="ClassDataAbstractionCoupling" />   
          170.         <!-- 類的分散復雜度,不超過20 -->   
          171.         <module name="ClassFanOutComplexity" />   
          172.         <!-- 函數的分支復雜度,不超過10 -->   
          173.         <module name="CyclomaticComplexity" />   
          174.         <!-- NPath復雜度,不超過200 -->   
          175.         <module name="NPathComplexity" />   
          176.   
          177.         <!-- 雜項 -->   
          178.         <!-- 禁止使用System.out.println -->   
          179.         <module name="GenericIllegalRegexp">   
          180.             <property name="format" value="System\.out\.println" />   
          181.             <property name="ignoreComments" value="true" />   
          182.         </module>   
          183.            
          184.         <!-- 不許使用main方法 -->   
          185.         <module name="UncommentedMain" />   
          186.         <!-- 檢查并確保所有的常量中的L都是大寫的。因為小寫的字母l跟數字1太象了 -->   
          187.         <module name="UpperEll" />   
          188.         <!-- 檢查數組類型的定義是String[] args,而不是String args[] -->   
          189.         <module name="ArrayTypeStyle" />   
          190.         <!--   
          191.             檢查java代碼的縮進 默認配置:基本縮進 4個空格,新行的大括號:0。新行的case 4個空格。   
          192.         -->   
          193.         <module name="Indentation" />   
          194.     </module>   
          195.   
          196.     <!-- 檢查翻譯文件     -->   
          197.     <module name="Translation" />   
          198. </module>  

          CheckStyle應用的最佳實踐
            采用CheckStyle以后,編碼規范的檢查就變得及其簡單,可以作為一項切實可行的實踐加以執行。
            一般情況下,在項目小組中引入CheckStyle可以按照下面的步驟進行:
            1. 強調Code Review與Code Conventions的重要作用;
            2. 介紹CheckStyle;
              3. 初步應用CheckStyle:參照CheckStyle附帶的配置文件,酌情加以剪裁,在項目的Maven配置文件中,添加CheckStyle任務,可以 單獨執行;
            4. 修改、定型CheckStyle的配置文件:按照基本配置文件執行一段時間(2~3周),聽取開發人員的反饋意見,修改配置信息;
            5. 作為開發過程的日常實踐,強制執行CheckStyle:穩定CheckStyle的配置信息,同時將CheckStyle任務作為Build的依賴任務 或者配置SCM(目前,CheckStyle可以與SVN有效集成),使得代碼在加入系統 之前必須通過檢查。
            同時需要指出的是,CheckStyle的有效執行需要依賴的條件:
              •IDE Format Code的強大功能:由于CheckStyle本身并沒有提供很強大的Code Format等功能,因此,需要借助IDE的幫助,從而使得在發生錯誤的時候,可以很容易的進行修復。
          IDE格式配置使用介紹
          在eclipse中的window?preferences?java?code style中可以導入自定義的java編碼風格文件。如下圖:

          點擊“Clean Up”,在右側可以看見一個Import按鈕,導入自定義的cleanup文件,點擊“OK”即可。左側的“Formatter”也是如法炮制。具體自定義的checkstyle,cleanup,formatter文件可參考壓縮包文件中的公司代碼規范文件夾。

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 迁西县| 新干县| 莱州市| 灌阳县| 石首市| 盐城市| 长岭县| 秦安县| 榆树市| 兴文县| 田东县| 天津市| 锡林浩特市| 图木舒克市| 巧家县| 博罗县| 阳西县| 洞头县| 民勤县| 西林县| 铁岭市| 鄂尔多斯市| 奇台县| 徐闻县| 浦城县| 伊宁县| 阿拉善左旗| 高台县| 新河县| 闽清县| 平塘县| 轮台县| 运城市| 邳州市| 金乡县| 昌都县| 洛南县| 广宗县| 桃园市| 沙湾县| 绥阳县|