Sonar代码分析实战(1)
文档说明
鉴于Sonar的重要性,而且一直没有一分较为全面的中文文档,笔者制作本文档。本文档的主要内容由官方文档翻译而来,同时结合笔者的应用实践,对部分文档进行增删调整,同时引入了笔者的一些应用实例,以便更加具备可读性。
本文文档通篇由headsen翻译,用于Sonar爱好者交流使用。请勿用于任何商业目的。
本文档的任何问题,请联系我:
headsen@163.com
http://weibo.com/headsen
官方英文文档地址:http://docs.codehaus.org/display/SONAR/Documentation
本翻译文档下载地址:http://wenku.baidu.com/view/088e5b1b6edb6f1aff001fc0.html
神器Sonar
随着产品规模的越来越大,产品维护的时间越来越长,代码质量的问题日趋凸显,后续的维护和扩展之痛,非亲历者无法体会。这时候,迫切需要一个全面的代码质量管理平台,来解决发现、管理、解决之前的、现在的质量问题,使产品能够轻装前进。
我从Sonar2系列开始接触Sonar,一接触便开始着迷。从Sonar3系列开始,我就知道我再也无法拒绝她。
Sonar是神器,围绕代码质量管理的神器。她几乎支持了你所能想到的一切代码质量问题:从静态分析到动态分析(单元测试)、从系统分析到人工评审、从历史分析到现在的版本分析、从Web客户端到Eclipse插件、从本地分析到远程分析、从集成其他代码分析插件(FindBugs、PMD等)到作为插件被CI持续集成、从邮件通信到任务平台交换(如JIRA)、从Web接口到插件开发,这些不一而足,再加上Sonar的开源特征、神一般的操作界面,没有人可以拒绝她的美丽。
Sonar代码分析实战(2)——1.1.1Sonar安装环境要求
环境要求
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 Server | 支持2005版本,使用jTDS驱动。不支持微软驱动。精简版本支持。 不支持2008版本。但是有用户成功使用。 必须指定区分大小写,指定区分重音。 |
MySQL | 支持5.X和6.X。 |
Oracle | 支持Oracle10G、11G和试用精简版。 |
PostgreSQL | 支持8.3、8.4、9.0、9.1 |
应用服务器 |
|
Jetty 6 | 和Sonar绑定。 |
Apache Tomcat | 支持5.5、6.0、7.0 |
JBoss | 不支持 |
GlassFish | 不支持。 |
浏览器 |
|
IE | 支持IE7+ |
Firefox | 所有版本。 |
Chrome | 近期稳定版本,12版本测试通过。 |
Opera | 未经测试 |
Safari | 近期稳定版本 |
Sonar代码分析实战(3)——1.1.2Sonar安装
安装Sonar
作为一个代码分析平台,Sonar由以下三部分构成:
- 一个数据库:存放配置信息和分析结果信息;
- 一个WEB服务器:发布应用,在线浏览、配置分析;
- 一个客户端:执行源代码分析。
数据库安装
在环境要求部分,已经罗列了Sonar支持的数据库类型。
如果只是做一个测试或Demo,你可以使用Sonar附带的H2或Derby。它们不需要任何安装。
如果使用其他数据,仅仅需要创建一个数据库或表空间,提供Sonar增删改查的数据库权限的帐号。表和索引将在Sonar第一次运行时创建。
笔者推荐使用MySQL数据库,推荐使用数据库编码为UTF-8。
安装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/.下。其他数据库的驱动包已经放在默认的路径下。
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/<YOUR OS>/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。后续专门的章节讲述这些高级特性。
安装客户端
除了数据库和Web应用外,Sonar还有很重要的一部分客户端程序。客户端程序用于对具体的程序工具进行分析,不同的语言,不要的项目构建类型可以使用不同的客户端程序。
Sonar提供很多类型的客户端,可以根据项目构建类型选择最佳方案:
Sonar Runner: 推荐默认客户端,如果你不知道选择哪个分析你的项目就是使用它把。.
Maven: 如果项目Maven构建则推荐使用对于的Maven插件包;
Ant Task:如果项目Ant构建则推荐;.
CI Engine: 持续集成,请参考相关文档,笔者暂时不做翻译。文档地址Hudson/Jenkins plugin或 Bamboo plugin 或AnthillPro plugin. 注意:即便没有对应的插件,其他CI引擎也可使用。
在对应的详细章节中,将重点讲述各类型客户端的使用。
文档下载http://wenku.baidu.com/view/088e5b1b6edb6f1aff001fc0.html
Sonar代码分析实战(4)——1.1.3Sonar分析客户端
Sonar客户端
Sonar的安装难点之一就在于各种客户端的选择、配置和集成等。本文档将次章节作为“安装Sonar”的并行章节阐述。
安装配置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.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 <arg> Define property
要获得更多的信息,命令增加参数-Dsonar.verbose=true即可。
使用SonarRunner执行Sonar具体分析请参考相关章节。
安装配置Maven分析客户端
支持Maven 2.0.10, 2.1.x, 2.2.x or 3.x。若没有安装Maven,请下载 Maven。
Maven相关配置
由于基于Maven进行分析时,需要使用Maven的插件指令处罚Sonar分析,所以需要对Maven的全局配置进行修改。
编辑setting.xml: 将以下配置放在对于的XML节点,同时将相关配置更改为自己配置。
<settings>
<profiles>
<profile>
<id>sonar</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<!-- EXAMPLE FOR MYSQL -->
<sonar.jdbc.url>
jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8
</sonar.jdbc.url>
<sonar.jdbc.driverClassName>com.mysql.jdbc.Driver</sonar.jdbc.driverClassName>
<sonar.jdbc.username>sonar</sonar.jdbc.username>
<sonar.jdbc.password>sonar</sonar.jdbc.password>
<!-- optional URL to server. Default value is
http://localhost:9000
-->
<sonar.host.url>
http://myserver:9000
</sonar.host.url>
</properties>
</profile>
</profiles>
</settings>
使用Maven插件分析大型项目时,常常会出现内存不足OutOfMemoryError。这时需要更改Maven的默认内存:
export MAVEN_OPTS="-Xmx512m -XX:MaxPermSize=128m"
Window下,export改为set即可。
使用Maven插件客户端执行Sonar具体分析请参考相关章节。
安装配置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具体分析请参考相关章节。
持续集成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
Sonar代码分析实战(5)——1.2.1 Sonar Ant Task执行代码分析
请参考:http://docs.codehaus.org/display/SONAR/Analyzing+with+SonarQube+Ant+Task
Sonar代码分析实战(6)——1.2.2 Sonar Runner执行代码分析
使用Sonar做代码分析时,有很多种途径,但是推荐使用Sonar Runner。
本节描述基于Sonar Runner 2.0+
前提准备
你必须提前下载,并安装Sonar Runner。下载:
http://repository.codehaus.org/org/codehaus/sonar-plugins/sonar-runner/2.0/sonar-runner-2.0.zip<!--[if !supportNestedAnchors]--><!--[endif]-->
安装配置请参考前面章节中
简单工程
在项目根路径下,创建配置文件,文件名为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)
sonar.tests=testDir1,testDir2
# path to project binaries (optional), for example directory of Java bytecode
sonar.binaries=binDir
# optional comma-separated list of paths to libraries. Only path to JAR file and path to directory of classes are supported.
sonar.libraries=path/to/library.jar,path/to/classes/dir
# The value of the property must be the key of the language.
sonar.language=cobol
# Additional parameters
sonar.my.property=value
配置好上述文件后,从命令行在根路径下执行下面命令启动项目的代码分析。
sonar-runner
为了帮助新手尽快入门,github存取服务上存放简单的示例代码,可供浏览和下载。
多模块工程
在Sonar分析时可以使用两种方式配置项目的结构。一种需要在项目下配置一个总文件,一种可以在每个模块下各自配置一个文件。
方式一:
将所有的配置放在一个sonar-project.properties文件,并放在项目的根路径下。
文件内容示意:
# Root project information
sonar.projectKey=org.mycompany.myproject
sonar.projectName=My Project
sonar.projectVersion=1.0-SNAPSHOT
# Some properties that will be inherited by the modules
sonar.sources=src
# List of the module identifiers
sonar.modules=module1,module2
# Properties can obviously be overriden for
# each module - just prefix them with the module ID
module1.sonar.projectName=Module 1
module2.sonar.projectName=Module 2
方式二:
每个模块下的配置放在各自的独立文件中。
配置示意:
总配置的内容 "MyProject/sonar-project.properties"
# Root project information
sonar.projectKey=org.mycompany.myproject
sonar.projectName=My Project
sonar.projectVersion=1.0-SNAPSHOT
# Some properties that will be inherited by the modules
sonar.sources=src
# List of the module identifiers
sonar.modules=module1,module2
子配置一 "MyProject/module1/sonar-project.properties"
# Redefine properties
# Note that you do not need to prefix the property here
sonar.projectName=Module 1
子配置二 "MyProject/module2/sonar-project.properties"
# Redefine properties
# Note that you do not need to prefix the property here
sonar.projectName=Module 2
值得注意:
1、子配置继承于父配置,子配置将可以覆盖父配置,通过两种方法:
在父配置中配置属性前增加模块标识前缀。
在子配置中直接定义配置。
2、特殊情况可以指定根目录
默认情况下,模块的根目录默认为模块的标识符(如上面的示例)。特殊情况下,可以在配置文件中使用“sonar.projectBaseDir”属性来指定根目录。如:
module1.sonar.projectBaseDir=My Module One #含空格
module1.sonar.projectBaseDir=modules/mod1 #多层级
module2.sonar.projectBaseDir=modules/mod2
3、多模块项目使用Sonar做分析时不能只指定一个源代码目录。
为了帮助尽快入门,这里依然有部分示意代码。你可以浏览和下载。
4、相同结构的多模块projects/languages/java/sonar-runner/java-sonar-runner-modules-same-structure
5、不同结构的多模块projects/languages/java/sonar-runner/java-sonar-runner-modules-different-structures
6、模块独自配置projects/languages/java/sonar-runner/java-sonar-runner-modules-own-configuration-file
多模块多语言功能
从Sonar3.3开始,Sonar支持多语言多模块工程的代码分析。
而配置也极其简单,只需在多模块工程的基础上增加一个语言属性的配置,如:
module.sonar.language
module1.sonar.language=java
module2.sonar.language=javascript
为了帮助尽快入门,这里依然有部分示意代码。你可以浏览和下载。项目路径:
projects/languages/multi-language/multi-language-java-javascript-sonar-runner
高级用法
如果不在项目的工程的根路径创建sonar-project.properties文件,还可以进行其他选择。
1、通过command命令行直接指定:
sonar-runner -Dsonar.projectKey=myproject -Dsonar.sources=src1 ..
2、通过command命令行指定配置文件路径: 'project.settings'
sonar-runner -Dproject.settings=../myproject.properties
通过设置'sonar.working.directory'属性可以设置Sonar的工作目录,默认为'.sonar'
通过设置'project.home'属性可以指定项目的根路径。根路径下必须包含sonar-project.properties配置文件(除非执行指令时显示给定路径。)
命令行执行分析时,可以追加参数。参数。
疑难解答
对于较大的工程项目,经常出现内存不够的问题,需要设置虚拟机的内存。
export SONAR_RUNNER_OPTS="-Xmx512m -XX:MaxPermSize=128m"
在Window环境下:
set SONAR_RUNNER_OPTS=-Xmx512m -XX:MaxPermSize=128m
从Sonar Runner 1.X向2.0迁移
只需将以下属性名替换为新属性名即可:
sources => sonar.sources
tests => sonar.tests
binaries => sonar.binaries
libraries => sonar.libraries
在sonar-project.properties文件明确设置sonar.sourceEncoding属性。
Sonar代码分析实战(7)——1.2.3 使用Maven插件
如果您的项目是基于Maven构建,那么推荐使用此方式。
前提准备
必须先对Maven的本地仓库进行一些配置,以便Maven Sonar插件正常运行。
相关的配置请参考本手册前面章节。
分析Maven工程
分析Maven工程只需要在pom.xml存在的目录下运行MVN的Sonar插件指令。Sonar指令运行前最好运行install指令,保证代码最新。
推荐的方法
mvn clean install -DskipTests=true
mvn sonar:sonar
设置skipTests=true是为了避免单元测试执行两次。install和sonar指令默认都会执行单元测试。你可以禁用单元测试,相关的配置参考Maven的相关文档。
注意:
使用Eclipse
确保没有使用maven embedder插件。定义Maven执行环境为本地安装的Maven,使用最新的Macen插件,不要勾选"resolve workspace artifacts"。
详细说明:http://jira.codehaus.org/browse/SONAR-929
高级选项
一些Sonar不支持的高级选项请不要使用,如"--projects" 和 "--resume-from"。
替代方法
如果你不想使用上面的两行指令,你可以直接使用下面的一行指令。
mvn clean install sonar:sonar -Dmaven.test.failure.ignore=true
这个指令运行时,单元测试会执行两次,如果加上参数DskipTests=true。Sonar就会执行单元测试,代码分析报告中也不会有单元测试的结果。
参数-Dmaven.test.failure.ignore=true确保及时单元测试执行失败,Sonar的分析结果依然会收录。
配置Sonar分析
和Sonar Runner一样,可以对Sonar分析进行一些参数配置。
一个简单的pom.xml配置示意here。
额外的分析参数,请下面章节中。
安全:
从Sonar3.4开始,如果一个工程被匿名访问,执行代码分析时,'sonar.login' and 'sonar.password'属性是必须的。这些属性必须属于该项目‘User’角色下的一个用户。你可以通过其他方式,提供这些属性:
直接通过命令行:
-Dsonar.login=myUser -Dsonar.password=myPassword
在pom.Xml文件
在Maven全局配置文件settings.xml
特殊的一个项目允许匿名分析:
1、'sonar.forceAuthentication'设置为true;
2、'sonar.forceAuthentication'设置为false,且'Anyone'用户组没有被授予该项目'User'角色
备注:
工程实例:
同样的为了帮助入门学习,gitthub提供了实例项目,可以供浏览和下载。
browsed or downloaded: projects/languages/java/maven/java-maven-simple
Maven插件版本
两个版本的Sonar maven插件存在,支持Maven2和Maven3。使用哪种取决于项目的Maven 版本。
Maven2 Only:
将以下配置加载pom.xml文件中
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>sonar-maven-plugin</artifactId>
<version>1.0</version>
</plugin>
<plugins>
</pluginManagement>
</build>
Maven 3 only:
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>sonar-maven-plugin</artifactId>
<version>2.0</version>
</plugin>
<plugins>
</pluginManagement>
</build>
Both Maven 2 and Maven 3
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>sonar-maven-plugin</artifactId>
<version>${sonarVersion}</version>
</plugin>
<plugins>
</pluginManagement>
</build>
<profile>
<id>maven-2</id>
<activation>
<file>
<!-- basedir expression is only recognized by Maven 3.x (see MNG-2363) -->
<missing>${basedir}</missing>
</file>
</activation>
<properties>
<sonarVersion>1.0</sonarVersion>
</properties>
</profile>
<profile>
<id>maven-3</id>
<activation>
<file>
<!-- basedir expression is only recognized by Maven 3.x (see MNG-2363) -->
<exists>${basedir}</exists>
</file>
</activation>
<properties>
<sonarVersion>2.0</sonarVersion>
</properties>
</profile>
分析多模块多语言项目
从Sonar3.3开始,支持分析多模块多语言项目。只需为每个模块pom.xml配置对应的'sonar.language'属性即可。
同样,为了帮助读者尽快上手,github上有实例可供浏览和下载。
browsed or downloaded: projects/languages/multi-language/multi-language-java-javascript-maven
持续集成请参考: http://docs.codehaus.org/display/SONAR/Continuous+Integration