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