天天看點

sonar實戰文檔說明神器Sonar 環境要求安裝Sonar Sonar用戶端

Sonar代碼分析實戰(1)

文檔說明

鑒于Sonar的重要性,而且一直沒有一分較為全面的中文文檔,筆者制作本文檔。本文檔的主要内容由官方文檔翻譯而來,同時結合筆者的應用實踐,對部分文檔進行增删調整,同時引入了筆者的一些應用執行個體,以便更加具備可讀性。

本文文檔通篇由headsen翻譯,用于Sonar愛好者交流使用。請勿用于任何商業目的。

本文檔的任何問題,請聯系我:

[email protected]

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.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&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