sonar实战

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和试用精简版。
驱动ojdbc14.jar不支持,只支持thin模式,不支持OCI。

PostgreSQL

支持8.38.49.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&amp;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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值