其中的每个工程都是一个 Maven 项目,如图所示:


  
图 5. Maven 工程文件

  编译命令如下:
  mvn clean install
  编译成功后,再使用如下命令:
  mvn sonar:sonar
  Maven 插件会自动把所需数据(如单元测试结果、静态检测结果等)上传到 Sonar 服务器上,需要说明的是,关于 Sonar 的配置并不在每个工程的 pom.xml 文件里,而是在 Maven 的配置文件 settings.xml 文件里,具体配置如下:
<profile>
<id>sonar</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<sonar.jdbc.url>
jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8
</sonar.jdbc.url>
<sonar.jdbc.driver>com.mysql.jdbc.Driver</sonar.jdbc.driver>
<sonar.jdbc.username>sonar</sonar.jdbc.username>
<sonar.jdbc.password>sonar</sonar.jdbc.password>
<sonar.host.url>http://localhost:9000</sonar.host.url>
</properties>
</profile>
  将 Soanr 所需要的数据上传到 Sonar 服务器上之后,Sonar 安装的插件会对这些数据进行分析和处理,并以各种方式显示给用户,从而使用户方便地对代码质量的监测和管理。
  例如 Radiator 插件可以根据项目的规模进行排序,并用不同演示显示代码质量:


  
图 6. Radiator 插件的显示

  Sonar 插件的配置
  前面已经提到,Sonar 的主要特色是对不同工具产生的检查结果进行再加工处理,Sonar 还向用户提供了对数据进行个性化处理的方法。
  本节以 Technical Debt 插件为例说明如何通过设置参数影响后的报告结果。首先了解一下这个插件中的“技术债务”的概念,这个概念早是在 1992 年由 Ward Cunningham 在他的论文“The WyCash Portfolio Management System”中提出的,之后被软件工程界接受并推广,《重构》的作者 Martin Fowler 也在其 网站 上对技术债务有所介绍。其实原理可以理解为“出来混早晚要还的”,当前不规范的代码,会对以后产品修改的成本造成影响。
  Soanr 的 Technical Debt 插件提供了默认的计算公式,通过对其中的权重参数进行配置,可以适应不同公司和项目对技术债务的计算。


  
图 7. Technical Debt 计算公式

  以上的各项数据指标,可以根据自己公司和项目的不同情况进行设置,如图所示:


  
图 8. Sonar 配置界面

  例如默认参数下同一个项目的技术债务指标如下:


  
图 9. 默认参数下 Technical Debt 结果

  修改了参数后的结果为:


  
图 10. 配置参数后 Technical Debt 结果

  可见将 Average time to cover complexity of one (in hours) 从 0.2 修改为 0.01 后,Coverage 的权重变小了,从而达到忽略单元测试覆盖率的作用。不同的公司和项目可以根据需要调整各自的参数,参数的调优和策略不在本文的讨论范围之内。
  通过以上的示例可以看出,Sonar 使用不同类型的图表显示给用户代码质量的结果,并且这些图表不是简单地对单元测试覆盖率或者静态检测工具的结果进行显示,而是根据软件工程理论进行了二次加工后的结果,更加科学和直观。
  结束语
  Sonar 为代码的质量管理提供了一个平台,对传统的代码静态检测如 PMD、FindBugs 等工具进行整合,可以说是目前强大的代码质量管理工具之一。