最近在學習Sonar,配置了好幾天,才搭建起來環境,為自己的學習能力感到汗顏,趕緊在此記錄一下,所謂好記性不如爛筆頭。
1、Sonar介紹
Sonar是一個用於代碼質量管理的開源平台,用於管理Java源代碼的質量。
通過插件機制,Sonar 可以集成不同的測試工具,代碼分析工具,以及持續集成工具。通過不同的插件對這些結果進行再加工處理,通過量化的方式度量代碼質量的變化,從而可以方便地對不同規模和種類的工程進行代碼質量管理。
同時 Sonar 還對大量的持續集成工具提供了接口支持,可以很方便地在持續集成中使用 Sonar。
此外,Sonar 的插件還可以對 Java 以外的其他編程語言提供支持,對國際化以及報告文檔化也有良好的支持。
2、安裝、配置Sonar
Sonar的運行需要 JDK 1.5+ , Maven 2.0.9+ 的支持,因此需要系統中安裝以上兩個軟件;從 http://www.sonarqube.org/downloads/ 下載sonar(最新版本3.5.1)zip文件,解壓到任意目錄,即完成安裝.
Sonar有兩種啟動方式:
第一種:直接啟動${SONAR_HOME}/bin下對應系統的腳本即可.
windows環境下,啟動${SONAR_HOME}/bin/windows-x86-32/StartSonar.bat, 在瀏覽器中訪問: http://localhost:9000/,界面如下:
由於Sonar自帶了Jetty6 的應用服務器環境,所以不需要額外的配置即可使用.
Sonar默認的端口是”9000”,默認的上下文路徑是”/”,默認的網絡接口是”0.0.0.0”;這些參數都可以在${SONAR_HOME}/conf/sonar.properties中修改.
默認的管理員帳號和密碼為:admin/admin.
第二種:作為Web項目,部署到Tomcat等應用服務器中.
步驟如下(以tomcat為例):
a. 編輯conf/sonar.properties還原成標准格式(就是不修改端口之類);確保部署到應用服務器時conf/wrapper.conf未被使用過;
b. ${SONAR_HOME}/war目錄下執行build-war.bat腳本;將生成的sonar.war部署到應用服務器中;
c. 啟動Tomcat, 通過 http://localhost:8080/sonar 訪問.
為了避免內存溢出,增加內存堆棧的大小:在Tomcat啟動前設置CATALINA_OPTS環境變量:
CATALINA_OPTS=”-Xms1024m -Xmx1024m -Dorg.apache.jasper.runtime.BodyContentImpl.LIMIT_BUFFER=true -XX:MaxPermSize=256m”
3、數據庫安裝配置及數據庫連接配置
Sonar需要一個數據庫來存儲結果,Apache Derby 是Sonar自帶並且默認安裝使用的數據庫,它能很好的用於Sonar的演示.但在實際項目中推薦使用性能更好更強大的數據庫.
Sonar對如下數據庫提供支持:MySQL 5.x, Oracle 10g XE, Postgresql, MS SqlServer 2005 等.(以MySQL為例進行介紹):
a. 編輯${SONAR_HOME}/conf/sonar.properties配置數據庫:
b. 配置DB驅動包.
如果使用Oracle數據庫,必須手動復制驅動類到${SONAR_HOME}/extensions/jdbc-driver/oracle/目錄下;其它支持的數據庫默認提供了驅動.
經過以上步驟,重啟Sonar服務(使用Tomat等外置服務器者,需要重新打war包,重啟服務器);會自動創建名為sonar的數據庫,帳號和密碼分別為sonar、sonar的用戶(sonar默認值);通過瀏覽器訪問sonar服務即可.
注:經測試,發現如果不先手動創建sonar用戶時,sonar不能正確的執行創建(這與數據庫本身的用戶權限有關,默認帳號不對,或者權限不夠,自然不能創建數據庫了)!在此建議先手動創建數據庫(sonar)和用戶(sonar),同時給sonar用戶授權.語句如下:
CREATE DATABASE sonar CHARACTER SET utf8 COLLATE utf8_general_ci; CREATE USER 'sonar' IDENTIFIED BY 'sonar'; GRANT ALL ON sonar.* TO 'sonar'@'%' IDENTIFIED BY 'sonar'; GRANT ALL ON sonar.* TO 'sonar'@'localhost' IDENTIFIED BY 'sonar'; FLUSH PRIVILEGES; |
http://docs.codehaus.org/display/SONAR/Analysis+Parameters 列舉了一些常用的配置及默認值.
啟動過程中如有報錯,可參考我的另一篇博客(http://allen-j-will.iteye.com/blog/1897180)
4、集成Maven
Sonar是通過Maven2 插件來分析源代碼並把結果注入到數據庫中.因此需要在Maven的配置里設置數據庫的屬性.
修改${MAVEN_HOME}/conf/settings.xml文件或者 ~/.m2/settings.xml文件,添加如下 profile:
<profile> <id>sonar</id> <properties> <sonar.jdbc.url>jdbc:mysql://localhost:3306/sonar</sonar.jdbc.url> <sonar.jdbc.driver>com.mysql.jdbc.Driver</sonar.jdbc.driver> <sonar.jdbc.username>sonar</sonar.jdbc.username> <sonar.jdbc.password>sonar</sonar.jdbc.password> <sonar.host.url>http://localhost:8080/sonar</sonar.host.url> <!-- Sonar服務器訪問地址 --> </properties> </profile> <activeProfiles> <activeProfile>nexus</activeProfile> <activeProfile>sonar</activeProfile> </activeProfiles> |
注: 網上參考的資料中,對於 <sonar.host.url> 屬性,僅配置到端口,本人在本地測試,發現始終不行,這應該和sonar的啟動方式有關;
如果單獨啟動sonar服務,以上配置應該沒問題(未測試);若將sonar部署到服務器中時,<sonar.host.url>屬性需要配置到上下文環境才行.這點特別容易遺漏!!!
同樣,為了避免內存溢出,推薦增加內存堆棧的大小。設置MAVEN_OPTS環境變量:
set MAVEN_OPTS=”-Xmx512m -XX:MaxPermSize=256m”
5、使用Sonar
a. 運行Sonar服務器;
b. 通過 mvn sonar:sonar 將代碼注入到Sonar中進行分析處理,並將處理結果以XML的形式保存在數據庫中;
c. 通過瀏覽器訪問,顯示分析結果;
d. 持續運行Maven構建,會迭代顯示分析結果;
e. 可以顯式指定sonar插件的版本,如下:
<project> <build> <plugins> <plugin> <groupId>org.codehaus.sonar</groupId> <artifactId>sonar-maven-plugin</artifactId> <version>3.5.1</version> </plugin> </plugins> </build> </project>
f.可以顯式的將sonar綁定到Maven生命周期中,如下:
<plugin> <groupId>org.codehaus.sonar</groupId> <artifactId>sonar-maven-plugin</artifactId> <version>3.5.1</version> <executions> <execution> <id>sonar</id> <phase>site</phase> <goals> <goal>sonar</goal> </goals> </execution> </executions> </plugin>
此時,指定Maven的site聲明周期時,則會自動調用sonar.sonar 命令.
6、與Hudson集成
Sonar還可以通過插件與Hudson進行集成,在每次構建結束后觸發Sonar.
首先,應該在Hudson的插件管理中添加Hudson Sonar Plugin;
然后,在系統設置里,增加一個Sonar的Installation;
最后,在項目的Post-build actions里,勾選Sonar.
在項目構建完成后,會自動執行Sonar的任務.
不過Hudson集成中運行Sonar任務,可能需要參考Sonar的文檔對Maven配置進行相應修改.
本文參考了如下文章,在此表示感謝.
http://www.ibm.com/developerworks/cn/java/j-lo-sonar/
http://pengwei841221.iteye.com/blog/940428
http://digitalsonic.iteye.com/blog/695304