首页 » Java程序员修炼之道 » Java程序员修炼之道全文在线阅读

《Java程序员修炼之道》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写的构建工具。