《Sonar 实战·从入门到进阶》
作者:张晓松 Headsen
Headsen@163.com
Sonar 实战·从入门到进阶
本文档由 Headsen 于 2012-12 月翻译,2013 年 01 月整理发布。
文档说明
鉴于 Sonar 的重要性,而且一直没有一分较为全面的中文文档,笔者制作本
文档。本文档的主要内容由官方文档翻译而来,同时结合笔者的应用实践,对部
分文档进行增删调整,同时引入了笔者的一些应用实例,以便更加具备可读性。
本文文档通篇由 headsen 翻译,用于 Sonar 爱好者交流使用。请勿用于任何
商业目的。
本文档的任何问题,请联系我:
headsen@163.com
http://weibo.com/headsen
官方英文文档地址:http://docs.codehaus.org/display/SONAR/Documentation
神器 Sonar
随着产品规模的越来越大,产品维护的时间越来越长,代码质量的问题日趋
凸显,后续的维护和扩展之痛,非亲历者无法体会。这时候,迫切需要一个全面
的代码质量管理平台,来解决发现、管理、解决之前的、现在的质量问题,使产
品能够轻装前进。
我从 Sonar2 系列开始接触 Sonar,一接触便开始着迷。从 Sonar3 系列开始,
我就知道我再也无法拒绝她。
Sonar是神器,围绕代码质量管理的神器。她几乎支持了你所能想到的一切代
码质量问题:从静态分析到动态分析(单元测试)、从系统分析到人工评审、从
历史分析到现在的版本分析、从Web客户端到Eclipse插件、从本地分析到远程分
析、从集成其他代码分析插件(FindBugs、PMD等)到作为插件被CI持续集成、
从邮件通信到任务平台交换(如JIRA)、从Web接口到插件开发,这些不一而足,
再加上Sonar的开源特征、神一般的操作界面,没有人可以拒绝她的美丽。
《Sonar 实战·从入门到进阶》
作者:张晓松 Headsen
Headsen@163.com
1. 新手上路
1.1. Sonar 安装
1.1.1. 环境要求
Sonar 代码分析工具是以 Java Web 应用的形式发布的。搭建 Sonar 代码分析环境需要
相应的硬件、JDK、数据库、WEB 服务器的要求。相关要求如下:
硬件要求:
内存
Sonar web 应用需要至少 500Mb 内存
项目越大、使用周期越长,Sonar占用的磁盘空间越大。参考:1300 万行的项目,持续
磁盘空间
分析四年,占用 10G磁盘空间。参考项目Nemo
软件要求
Java 平台
Oracle JDK
1.5、6、7 支持
IBM JDK
GCJ
不支持
不支持
Oracle JRockit
不支持
数据库
Apache Derby
Sonar 3.2 之前版本支持。
Derby 和 Sonar 绑定发布的。尽管 Derby 数据库支持 Sonar 的全部功能,(升级不支
持)。因此 Sonar 建议使用企业级数据库,而非 Derby。
H2
同 Derby 数据库一样。绑定发布,但是不建议使用。
Microsoft SQL
支持 2005 版本,使用 jTDS 驱动。不支持微软驱动。精简版本支持。
Server
不支持 2008 版本。但是有用户成功使用。
MySQL
Oracle
PostgreSQL
应用服务器
Jetty 6
必须指定区分大小写,指定区分重音。
支持 5.X 和 6.X。
支持 Oracle10G、11G 和试用精简版。
驱动 ojdbc14.jar 不支持,只支持 thin 模式,不支持 OCI。
支持 8.3、8.4、9.0、9.1
和 Sonar 绑定。
Apache Tomcat
支持 5.5、6.0、7.0
JBoss
GlassFish
浏览器
IE
Firefox
Chrome
不支持
不支持。
支持 IE7+
所有版本。
近期稳定版本,12 版本测试通过。
《Sonar 实战·从入门到进阶》
作者:张晓松 Headsen
Headsen@163.com
Opera
Safari
未经测试
近期稳定版本
1.1.2. 安装 Sonar
作为一个代码分析平台,Sonar 由以下三部分构成:
一个数据库:存放配置信息和分析结果信息;
一个 WEB 服务器:发布应用,在线浏览、配置分析;
一个客户端:执行源代码分析。
1.1.2.1. 数据库安装
在环境要求部分,已经罗列了 Sonar 支持的数据库类型。
如果只是做一个测试或 Demo,你可以使用 Sonar 附带的 H2 或 Derby。它们不需要任何
安装。
如果使用其他数据,仅仅需要创建一个数据库或表空间,提供 Sonar 增删改查的数据库
权限的帐号。表和索引将在 Sonar 第一次运行时创建。
笔者推荐使用 MySQL 数据库,推荐使用数据库编码为 UTF-8。
1.1.2.2. 安装 Sonar 应用
下载 Sonar 发布包,解压到本地磁盘路径下。
http://www.sonarsource.org/downloads/
1、配置数据库
一般我们不使用 Sonar 自带的内建数据库,因此数据更改 Sonar 发布程序的数据源。
在 Sonar 解压包下,编辑 conf/sonar.properties 文件,可以指定新的特定数据。该文
件中所有注释掉的数据库连接模板都是支持的。只需要去除注释,更改为自己的数据库连接
即可。同时将默认的自带数据库的链接注释掉。
一般需要配置以下属性
•
•
•
•
sonar.jdbc.url: 数据库连接地址
sonar.jdbc.driver: 驱动类
sonar.jdbc.user: 数据库用户名
sonar.jdbc.password: 密码
如果使用 Oracle 数据库,将 JDBCDriver 包,放在/extensions/jdbc-driver/oracle/.
下。其他数据库的驱动包已经放在默认的路径下。
《Sonar 实战·从入门到进阶》
作者:张晓松 Headsen
Headsen@163.com
2、启动 Sonar Server
Sonar 应用默认监听 9000 端口。通过 http://localhost:9000 访问
可以在 conf/sonar.properties 文件更改:
sonar.web.host : 192.0.0.1
sonar.web.port: 80
sonar.web.context: /sonar
执行下面脚本可以启动 Sonar 应用:
在 Linux/Mac OS: bin//sonar.sh start
在 Windows: bin/windows-x86-32/StartSonar.bat
对于其他平台,参考 Installing on AIX, HPUX or Solaris
启动 Sonar 应用,后就可以通过浏览器访问 Sonar 的浏览页面了。这是内容是空的。
3、高级属性
在上面的建议安装中,注意:这样使用的 Sonar 的内置 Web 服务器。你可以将 Sonar
发布在其他服务器,如 Tomcat 上。
你还可以在 Windows 和 Linux 配置 Sonar 服务;你还可以通过代理运行 Sonar。后续 专
门的章节讲述这些高级特性。
1.1.2.3. 安装客户端
除了数据库和 Web 应用外,Sonar 还有很重要的一部分客户端程序。客户端程序用于对
具体的程序工具进行分析,不同的语言,不要的项目构建类型可以使用不同的客户端程序。
Sonar 提供很多类型的客户端,可以根据项目构建类型选择最佳方案:
Sonar Runner: 推荐默认客户端,如果你不知道选择哪个分析你的项目就是使用它把。.
Maven: 如果项目 Maven 构建则推荐使用对于的 Maven 插件包;
Ant Task:如果项目 Ant 构建则推荐;.
CI Engine: 持续集成,请参考相关文档,笔者暂时不做翻译。文档地址Hudson/Jenkins plugin
或 Bamboo plugin 或AnthillPro plugin. 注意:即便没有对应的插件,其他CI引擎也可使
用。
在对应的详细章节中,将重点讲述各类型客户端的使用。
《Sonar 实战·从入门到进阶》
作者:张晓松 Headsen
Headsen@163.com
1.1.3. Sonar 客户端
Sonar 的安装难点之一就在于各种客户端的选择、配置和集成等。本文档将次章节作为
“安装 Sonar”的并行章节阐述。
1.1.3.1. 安装配置 Sonnar Runner
Sonar Runner 是最常用的分析客户端之一,可以对绝大多数类型的项目进行分析。
下载地址:下载目录。现在的版本是sonar-runner-2.0.zip
安装要求:JDK1.5 或更高。
安装过程
1、将下载包解压到一个本地路径下。
2、将解压路径设置为环境变量:SONAR_RUNNER_HOME
3、更改配置文件:$SONAR_RUNNER_HOME/conf/sonar-runner.properties。
主要是数据源的配置,sonar-runner 会将分析的结果存放在数据库中。如下面所示,只
需将注释的模板适当位置去掉注释并更改为自己对应的 Sonar 配置即可。
#----- Default Sonar server
#sonar.host.url=http://localhost:9000
#----- PostgreSQL
#sonar.jdbc.url=jdbc:postgresql://localhost/sonar
#sonar.jdbc.driver=org.postgresql.Driver
#----- MySQL
#sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8
#sonar.jdbc.driver=com.mysql.jdbc.Driver
#----- Oracle
#sonar.jdbc.url=jdbc:oracle:thin:@localhost/XE
#sonar.jdbc.driver=oracle.jdbc.driver.OracleDriver
#----- Global database settings
#sonar.jdbc.username=sonar
#sonar.jdbc.password=sonar
#----- Default directory layout
#sonar.sources=src/main/java
#sonar.tests=src/test/java
《Sonar 实战·从入门到进阶》
作者:张晓松 Headsen
Headsen@163.com
#sonar.binaries=target/classes
4、将$SONAR_RUNNER_HOME/bin 添加到 Path 环境变量中。
5、可以通过 Shell 或命令行检查安装情况,输入'sonar-runner.bat -h'(Linux 输入
'sonar-runner -h'),将会得到以下信息:
usage: sonar-runner [options]
Options:
-h,--help Display help information
-X,--debug Produce execution debug output
-D,--define
Define property
要获得更多的信息,命令增加参数-Dsonar.verbose=true 即可。
使用 SonarRunner 执行 Sonar 具体分析请参考相关章节。
1.1.3.2. 安装配置 Maven 分析客户端
支持Maven 2.0.10, 2.1.x, 2.2.x or 3.x。若没有安装Maven,请下载 Maven。
Maven 相关配置
由于基于 Maven 进行分析时,需要使用 Maven 的插件指令处罚 Sonar 分析,所以需要
对 Maven 的全局配置进行修改。
编辑 setting.xml: 将以下配置放在对于的 XML 节点,同时将相关配置更改为自己配置。
sonar
true
jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8
com.mysql.jdbc.Driver
sonar
sonar
《Sonar 实战·从入门到进阶》
作者:张晓松 Headsen
Headsen@163.com
http://myserver:9000
使用 Maven 插件分析大型项目时,常常会出现内存不足 OutOfMemoryError。这时需要
更改 Maven 的默认内存:
export MAVEN_OPTS="-Xmx512m -XX:MaxPermSize=128m"
Window 下,export 改为 set 即可。
使用 Maven 插件客户端执行 Sonar 具体分析请参考相关章节。
1.1.3.3. 安装配置 Ant 客户端
首先下载 Sonar Ant Task 包:
http://repository.codehaus.org/org/codehaus/sonar-plugins/sonar-ant-task/2.0/sonar-ant-task-2.0.jar
特点:
Sonar Ant Task 允许将 Sonar 分析放在 Ant 的 build 脚本中。
要求:
Ant 1.7.1+、Java 1.5+
安装:
下载 Sonar Ant Task 即可。
使用 Ant Task 执行 Sonar 具体分析请参考相关章节。
1.1.3.4. 持续集成 CI
暂时不做翻译。请参考英文文档。
Page: Installing on AIX, HPUX or Solaris
Page: Deploying Sonar on JEE Server
Page: Running Sonar as a Service on Windows
Page: Running Sonar as a Service on Linux
Page: Running Sonar behind a Proxy
1.2. 代码分析
安装完 Sonar 环境后,就可以执行 Sonar 分析项目工程了。
《Sonar 实战·从入门到进阶》
作者:张晓松 Headsen
Headsen@163.com
1.2.1. 分析范围
Sonar 支持对 18 种编程语言进行分析。分析的结果是主要指标的衡量和代码规则的遵
循情况。但是分析结果依据不同被分析的语言,会有很大不同。
(1) 对所有语言,Sonar 对源代码执行静态分析;
(2) Sonar 可以静态分析编译代码,比如 Java 的 Class 文件、C#的 dll 文件等;
(3) 对应特定语言,Sonar 能够执行动态分析,比如 Java、C#的单元测试。
执行分析
首先你应该部署好需要分析的功能,在开发和发布的项目工程。为了执行 Sonar 代码分
析,需要部署 Sonar 的分析客户端。在 Sonar 安装一节中已经提到各种类型分析客户端的安
装配置。
1.2.2. 使用 Sonar Runner(推荐)
使用 Sonar 做代码分析时,有很多种途径,但是推荐使用 Sonar Runner。
本节描述基于 Sonar Runner 2.0+
1.2.2.1. 前提准备
你必须提前下载,并安装 Sonar Runner。下载:
http://repository.codehaus.org/org/codehaus/sonar-plugins/sonar-runner/2.0/sonar-runner
-2.0.zip
安装配置请参考前面章节中
1.2.2.2. 简单工程
在项目根路径下,创建配置文件,文件名为 sonar-project.properties。sonar-runner 执行
分析时,会读取该文件。
文件内容示意: sonar-project.properties
# required metadata
sonar.projectKey=my:project
sonar.projectName=My project
sonar.projectVersion=1.0
# path to source directories (required)
sonar.sources=srcDir1,srcDir2
# path to test source directories (optional)