讀古今文學網 > Java程序員修煉之道 > 12.5 Maven和Jenkins代碼指標 >

12.5 Maven和Jenkins代碼指標

Java和JVM已經存在很長時間了,並且這麼些年積累下來,已經開發出了一些強大的工具和類庫來指導開發人員編寫優質的代碼。我們寬泛地把這個領域定義為代碼指標或靜態代碼分析。Maven和Jenkins都支持目前最流行的工具。儘管這些流行的工具(或新的專門化工具)對其他語言的支持越來越多,但它們仍然主要是針對Java語言自身。

提示 現代IDE(比如Eclipse、IntelliJ和NetBeans)也支持幾種靜態語言分析工具和類庫,值得花些時間研究一下。

代碼指標工具主要是為了消除所有開發人員都會犯的小錯誤。它能幫你樹起最低的代碼質量標桿,告訴你下面這些情況:

  • 測試對代碼的覆蓋率1;
  • 代碼的格式是否清晰(有助於差異比較和可讀性);
  • 是否很可能會出現NPE;
  • 是否忘記了域對像中的equalshashCode方法。

1 本書不討論普通的代碼覆蓋工具,因為它們和Java 7還不兼容。

各種工具提供的檢查列表都很長,但開發團隊要自己決定對項目做哪些檢查。

代碼指標的局限性

一些團隊因為解決了代碼指標工具警告過的問題就認為他們的代碼庫臻於完善了,這是不對的。代碼指標警告能幫你去掉很多低級bug,避免糟糕的編碼實踐。但它們不能保證代碼質量,或者判斷業務邏輯實現是否正確。

另外一個問題是管理層可能想把這些指標放到報告裡。為了管理層和你們自己考慮,請把代碼指標留在開發人員這一層面。它們不是項目管理指標。

Maven和Jenkins結合得很好,既可以提供代碼指標的概覽,也能告訴你其中的細節。本節的兩個主要內容如下:

  • 如何安裝並配置Jenkins插件;
  • 如何配置代碼一致性(Checkstyle)和bug查找(FindBugs)插件。

我們仍以java7developer為例。先來看看如何安裝Jenkins插件,這是得到代碼指標報告功能的前提條件。

12.5.1 安裝Jenkins插件

Jenkins基於UI的插件管理器很不錯,它可以幫你下載和安裝插件,所以安裝Jenkins插件並不複雜。安裝Jenkins插件時需要重啟Jenkins,所以應該先進入Jenkins管理頁(http://localhost:8080/jenkins/manage),並點擊Prepare to Shutdown(準備關閉)鏈接。這會終止所有即將執行的任務,以便你可以安全地安裝插件,重啟Jenkins。

Jenkins準備好關閉之後,就可以訪問插件管理器了。在管理頁中點擊Manage Plugins(管理插件)鏈接(http://localhost:8080/jenkins/pluginManager/)。應該能見到如圖12-11所示的界面。

圖12-11 Jenkins插件管理器

第一個是Updates(更新)標籤。切換到Available(可用)標籤,能見到一長串可用插件的列表。為學習本章內容,需要選中下面這些插件:

  • Checkstyle;
  • FindBugs。

然後點擊界面底部的Install按鈕開始安裝。安裝完成後,可用通過鏈接http://localhost:8080/jenkins/restart重啟Jenkins。

重啟Jenkins之後插件就安裝好了。現在該去配置這些插件了,先從Checkstyle插件開始。

12.5.2 用Checkstyle保持代碼一致性

Checkstyle是靜態代碼分析工具,主要關注代碼佈局、Javadoc層次是否恰當,以及其他語法糖的檢查。它還會檢查常見的代碼錯誤,但FindBugs檢查得更加全面。

Checkstyle的重要性體現在兩個方面。首先,它有助於強化小組的編碼風格規範,以便團隊成員可以很容易地讀懂彼此的代碼(易讀性是Java得以流行的一個主要原因)。其次,如果代碼元素的位置和空格保持一致,diffs和patches用起來就更容易了。

我們在Maven的pom.xml文件中已經配置過Checkstyle插件了,所以你只需要在java7developer任務中加上checkstyle:checkstyle目標。要配置該任務,點擊在儀表板中列出的java7developer鏈接,然後在新界面上點擊左側菜單中的Configure(配置)鏈接。

接著配置報告,並確定違規的情況出現次數太多時是否應該放棄構建。圖12-12中是我們對java7developer項目中Maven構建及報告的配置。

圖12-12 Checkstyle配置

別忘了點擊Save把這個配置存下來!Checkstyle的默認規則是Sun公司最初提出來的Java編碼規範。Checkstyle能微調到第n級,所以應該能準確表示團隊的編碼規範。

警告 最新版的Checkstyle還沒全面支持Java 7語法,所以你見到對try-with-resources、鑽石語法和其他Coin項目語法的肯定可能是假的。

讓我們來看看默認規則集如何把Java7developer項目組織起來。跟往常一樣,你可以回到Jenkins的儀表板中,手工執行構建。構建完成後,回到最近構建成功頁面(記住,可以通過Last Success一欄的鏈接訪問該頁面),點擊左側菜單上的Checkstyle Warnings(Checkstyle警告)鏈接進入Checkstyle報告頁。java7developer項目的Checkstyle報告頁看起來應該如圖12-13所示。

圖12-13 Checkstyle報告

如你所見,在Java7developer的代碼上有些警告信息。看起來我們還有些工作要做!你可以深入到每個警告中,看看為什麼會發生違規,並在下一次構建之前改正它。

Checkstyle肯定在這方面有所幫助,但它的重點不是潛在的代碼錯誤。這種重要的代碼錯誤檢查最好用FindBugs插件。

12.5.3 用FindBugs設定質量標桿

FindBugs(Bill Pugh出品)是為了找出代碼中潛在的bug而做的字節碼分析工具。由於它分析的是字節碼,所以也能用在Scala和Groovy上。但因為它所設置的規則是為了捕獲Java語言中的bug,所以如果你用它來分析Groovy和Scala代碼,要對其持審慎的態度,因為它可能發現不了其中的bug。

FindBugs背後有大量研究成果的支持,都是由特別熟悉Java語言的開發人員做的。它能檢測出下面這些狀況:

  • 會導致NPE的代碼;
  • 賦值給一個從來沒用到的變量;
  • ==而不是用equals方法比較字符串對像;
  • 在循環中用基本的+操作符而不是用StringBuffer合併字符串。

你應該先試試FindBugs的默認設置,然後再根據要檢測的規則進行微調。

警告 即便是Java語言,FindBugs也會誤報。你應該認真研究它發出的警告,如果確信可以忽略它們,可以顯式排除這些情況。

FindBugs的重要性體現在兩個方面。首先,它以結對程序員的角色教開發人員養成好習慣(盡可能幫助檢測出潛在bug)。其次,項目的總體質量變好了,並且問題跟蹤單裡不會再充滿煩人的小bug,讓團隊可以解決實際問題,比如業務邏輯的變化。

跟Checkstyle插件一樣,你可以點擊儀表盤任務列表中的java7developer鏈接,然後在新界面中點擊左側菜單上的Configure鏈接。

為了執行FindBugs插件,還要在Jenkins中添加Maven構建目標compile findbugs:findbugs(需要compile以便FindBugs能處理字節碼)。

除了定義違例過多構建是否失敗,還可以配置報告。如圖12-14所示。

圖12-14 FindBugs配置

別忘了點擊Save把這個配置存下來!FindBugs預定義的規則集可以大範圍調整,以準確表示團隊的編碼規範。讓我們來看看默認規則集如何應用到Java7developer項目上。

跟往常一樣,你可以回到Jenkins的儀表盤中,手工執行構建。構建完成後,回到最近構建成功頁面(記住,可以通過Last Success欄的鏈接訪問該頁面),點擊左側菜單上的FindBugs Warnings鏈接進入FindBugs報告頁。java7developer項目的FindBugs報告頁看起來應該如圖12-15所示。

圖12-15 FindBugs報告頁

如你所見,Java7developer的代碼有些警告信息。寫書的作者也可能寫出不完美的代碼!你可以仔細檢查每個警告,看看為什麼會發生違規,並且如果你願意,可以在下一次構建之前改正它。

FindBugs會把大部分常見的Java陷阱和編碼錯誤都找出來。隨著開發團隊對這些錯誤的瞭解程度不斷加深,報告中的警告數量會逐步減少。你們不僅提升了代碼的品質,還完善了自身的編碼能力!

Jenkins、Maven和代碼指標這一節到此就完成了。這一領域的工具化程度相當高(Scala和Groovy還需要更多支持),啟動和運行也非常容易。如果你是CI迷,想探索Jenkins的完整能力,我們強烈推薦John Ferguson Smart不斷更新的Jenkins: The Definitive Guide(O\'Reilly)。你可能已經注意到了,與JVM多語言編程相關的構建和CI的拼圖還缺了一片——我們還沒處理過Clojure項目。好在Clojure社區已經專門針對純粹的Clojure項目製作了幾個構建工具,並已得到了廣泛應用。其中最流行的就是Leiningen,一個專為Clojure寫的構建工具。