SonarQube(之前叫Sonar)是持續檢測代碼質量的開源平臺。html
2009年Sonar得到測試工具目錄下Jolt大獎,是全特性的持續集成工具。在Andalusian Autonomous Government,eXo Platform,Apache Software Foundation,Eclipse Foundation中被使用。java
2013年,代碼質量檢測工具的使用比例[2]: mysql
這個列表中的不少工具值得研究,有些工具據說過,更多的工具沒有據說過,Wikipedia的真是個好地方。linux
Sonar(代碼質量管理平臺)是一個開源平臺,用於管理Java源代碼的質量。從 Sonar 1.6 版本開始,Sonar從一個質量數據報告工具,轉變成爲的代碼質量管理開源平臺。Sonar主要特色:git
架構圖:github
經過插件,Sonar能夠從七個維度檢測代碼質量,支持包括java,C#,C/C++,PL/SQL,Cobol,JavaScript,Groovy等等二十幾種編程語言,其能夠處理代碼中以下的問題:sql
1.糟糕的複雜度分佈
文件、類、方法等,若是複雜度太高將難以改變,這會使得開發人員難以理解它們,且若是沒有自動化的單元測試,對於程序中的任何組件的改變都將可能致使須要全面的迴歸測試shell
2.重複
包含大量複製粘貼的代碼的程序顯然是質量低下的,sonar能夠展現源碼中重複嚴重的地方數據庫
3.缺少單元測試
sonar能夠很方便地統計並展現單元測試覆蓋率編程
4.沒有代碼標準
sonar能夠經過PMD,CheckStyle,Findbugs等等代碼規則檢測工具規範代碼編寫
5.沒有足夠的或者過多的註釋
沒有註釋將使代碼可讀性變差,特別是當不可避免地出現人員變更時,程序的可讀性將大幅降低而過多的註釋又會使得開發人員將精力過多地花費在閱讀註釋上,亦違背初衷 (參考[1])
6.潛在的bug
sonar能夠經過PMD,CheckStyle,Findbugs等等代碼規則檢測工具檢測出潛在的bug
7.糟糕的設計(原文Spaghetti Design,意大利麪式設計)
sonar能夠找出循環,展現包與包、類與類之間的相互依賴關係能夠檢測自定義的架構規則,能夠管理第三方的jar包,能夠利用LCOM4檢測單個任務規則的應用狀況。
經過sonar能夠有效檢測以上在程序開發過程當中的七大問題
1.已安裝JAVA環境
2.已安裝有MySQL數據庫(5.6直接支持,以前的版本須要Sonar提供的Driver)
軟件下載地址:http://www.sonarqube.org/downloads/
下載SonarQube與SonarQube Runner
中文補丁包下載:http://docs.codehaus.org/display/SONAR/Chinese+Pack
關於最新版的Sonar的安裝參考文獻[8],百度文庫上有別人翻譯的早期Sonar的官方文檔[8]。
1.數據庫配置
進入數據庫命令:
#mysql -u root -p |
固然,也能夠將上述的語句寫到一個test.sql腳本中,進入mysql後,使用source 全路徑名/test.sql。
2.安裝sonar與sonar-runner
將下載的sonar-3.7.4zip(長期支持版,2014年4月最新的版本爲4.2)包解壓至Linux中任意路徑中,好比/usr/local
將下載的sonar-runner-dist-2.3.zip包解壓Linux中任意路徑中,好比/usr/local 。添加SONAR_RUNNER_HOME(就是sonar-runner-2.3的全路徑名,好比/usr/local/sonar-runner-2.3)環境變量,並將SONAR_RUNNER_HOME/bin加入PATH變量中(在主路徑的.bashrc文件中添加)。
修改sonar配置文件
編輯sonar所在的目錄(好比/usr/local/sonar-3.7.4)中conf/sonar.properties文件,配置數據庫設置,默認已經提供了各種數據庫的支持,只要將註釋去掉就能夠。這裏使用mysql,所以取消mysql模塊的註釋,並將sonar中原有的嵌入式的數據庫的jdbc.url註釋掉。
#vi sonar.properties #須要註釋下面這條語句 #sonar.jdbc.url: jdbc:h2:tcp://localhost:9092/sonar sonar.jdbc.username: sonar sonar.jdbc.password: sonar sonar.jdbc.url: jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true # Optional properties sonar.jdbc.driverClassName: com.mysql.jdbc.Driver |
修改sonar-runner的配置文件
切換至sonar-runner的安裝目錄下,修改sonar-runner.properties根據實際使用數據庫狀況取消相應註釋,這裏須要和sonar.properties中保持一致。
#Configure here general information about the environment, such as SonarQube DB details for example #No information about specific project should appear here #----- Default SonarQube server sonar.host.url=http://localhost:9000 #----- PostgreSQL #sonar.jdbc.url=jdbc:postgresql://localhost/sonar #----- MySQL sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8 sonar.jdbc.driverClassName=com.mysql.jdbc.Driver #----- Oracle #sonar.jdbc.url=jdbc:oracle:thin:@localhost/XE #----- Microsoft SQLServer #sonar.jdbc.url=jdbc:jtds:sqlserver://localhost/sonar;SelectMethod=Cursor #----- Global database settings sonar.jdbc.username=sonar sonar.jdbc.password=sonar #----- Default source code encoding sonar.sourceEncoding=UTF-8 #----- Security (when 'sonar.forceAuthentication' is set to 'true') sonar.login=admin sonar.password=admin |
添加數據庫驅動
除了Oracle數據庫外,其它數據庫驅動都默認已經提供了,且這些已添加的驅動是sonar惟一支持的,不須要修改。若是是Oracle數據庫,須要從oracle官方網站下載JDBC驅動並將其須要複製至<install_directory>/extensions/jdbc-driver/oracle目錄
4.啓動Sonar
目錄切換至sonar的<install_directory>/bin/linux-x86-64/目錄,啓動服務
#./sonar.sh start 啓動服務
#./sonar.sh stop 中止服務
#./sonar.sh restart 重啓服務
固然,若是每次都是這樣使用cd 而後在./sonar.sh啓動和關閉服務比較麻煩,這裏,能夠考慮在/usr/local/bin中編寫一個名爲sonar的shell腳本,而後在添加執行權限。Sonar腳本的內容以下(假設sonar安裝在/usr/local目錄下);
#!/bin/sh cd /usr/local/sonar-3.7.4/bin/linux-x86-32/ ./sonar.sh "$@" |
至此,sonar就安裝好了。此時訪問http:\localhost:9000時被重定向到http://localhost:9000/maintenance,而且瀏覽器中輸出以下界面:
這是因爲修改了上面的數據庫的緣由,使用mysql數據庫而不是sonar自帶的H2數據庫,須要處理升級的問題,而且之後若是遷移數據庫或者升級sonar都須要處理下述的步驟。(備註:後來我在一個全新的環境安裝了sonar,發現並不須要升級數據庫,也能使用,想了好久,纔想明白,我在修改sonar的配置以前,先使用過內嵌數據庫H2對例子進行運行,後來才修改成mysql,這前後遷移數據庫時須要運行setup步驟)
鍵入http://localhost:9000/setup,單擊圖中的upgrade按鈕,而後等待完成,並重定向到http://localhost:9000,等待時間通常爲1分鐘。
Upgrade結束後,能夠看到sonar的啓動的界面了以下:
5.sonar中文補丁包安裝
安裝中文補丁包能夠經過訪問http:\localhost:9000,打開sonar後,進入更新中心安裝,或者下載中文補丁包後,放到SONARQUBE_HOME/extensions/plugins目錄,而後重啓SonarQube服務。
6.設置sonar做爲Linux服務並開機自啓動
在與持續集成服務器(好比Hudson)進行集成時,須要將sonar設置爲Linux服務開機自啓動,步驟以下,新建文件/etc/init.d/sonar,輸入以下內容:
#!/bin/sh /usr/bin/sonar $* |
SonarQube開機自啓動(Ubuntu,32位),步驟以下,創建軟鏈接,修改文件權限,更新啓動項:
sudo ln -s $SONAR_HOME/bin/linux-x86-32/sonar.sh /usr/bin/sonar |
Sonar能夠有多種使用方式,在maven中使用,在ant中使用,在持續集成服務器中使用,以及經過sonar-runner使用。其中最簡單的是經過sonar-runner進行使用,下面介紹Sonar-runner的使用方法。本節中使用樣例來自sonar官方提供的sonar-examples-master.zip (原來的網站下載速度不敢恭維,爲次,建立了百度網盤的鏈接).
預置條件
已安裝Sonar Runner且環境變量已配置,即sonar-runner命令可在任意目錄下執行。
下載sonar-examples-master.zip ,解壓使用其sonar-examples/projects/languages/java/sonar-runner/java-sonar-runner-simple做爲執行運行分析。要對一個項目運行sonar分析,必須在項目源碼的根目錄下建立sonar-project.properties配置文件,這裏以java-sonar-runner-simple下提供的配置文件爲例:
# Required metadata sonar.projectKey=java-sonar-runner-simple sonar.projectName=Simple Java project analyzed with the SonarQube Runner sonar.projectVersion=1.0
# Comma-separated paths to directories with sources (required) sonar.sources=src
# Language sonar.language=java
# Encoding of the source files sonar.sourceEncoding=UTF-8 |
2.執行分析
cd到java-sonar-runner-simple根目錄下,執行命令
# sonar-runner
備註:若是出現EXECUTION FAILURE,能夠經過運行sonar-runner -X參看出錯的緣由,此外,也能夠經過查看sonar目錄下的logs/sonar.log來查看sonar服務器記錄,從而肯定錯誤緣由。
Sonar-runner執行成功會輸出EXECUTION SUCCESS:
SonarQube Runner 2.3 Java 1.6.0_30 Sun Microsystems Inc. (32-bit) Linux 3.2.0-60-generic-pae i386 INFO: Runner configuration file: /home/xiajian/software/sonarqube/sonar-runner-2.3/conf/sonar-runner.properties INFO: Project configuration file: /home/xiajian/software/sonarqube/sonar-examples/projects/languages/java/sonar-runner/java-sonar-runner-simple/sonar-project.properties INFO: Default locale: "en_US", source code encoding: "UTF-8" INFO: Work directory: /home/xiajian/software/sonarqube/sonar-examples/projects/languages/java/sonar-runner/java-sonar-runner-simple/.sonar INFO: SonarQube Server 4.2 .......... INFO: ------------------------------------------------------------------------ INFO: EXECUTION SUCCESS INFO: ------------------------------------------------------------------------ Total time: 10.777s Final Memory: 10M/299M INFO: ------------------------------------------------------------------------ |
此時訪問http:\\localhost:9000便可查看分析結果,具體的結果以下(項目比較簡單,分析結果不復雜):
除了能夠在本地使用localhost訪問外,能夠經過瀏覽器和相應的ip地址來訪問,此時的地址實例以下: http://222.192.41.13:9000
關於Sonar分析結果的不一樣參數的意思能夠參考以下:
http://docs.codehaus.org/display/SONAR/Analysis+Parameters或者參考[8]的中文介紹。
若是不修改sonar配置文件中關於數據庫部分的配置,一切運行都很正常。若是在修改sonar配置文件以後,沒有upgrade,並在瀏覽器中輸入http:\\localhost:9000,結果被重定向到:http://localhost:9000/maintenance 瀏覽器中輸入以下:
此時,若是對任意項目運行sonar-runner,就會出現以下結果:
SonarQube Runner 2.3 Java 1.6.0_30 Sun Microsystems Inc. (32-bit) Linux 3.2.0-60-generic-pae i386 ....中間省略... INFO: ------------------------------------------------------------------------ INFO: EXECUTION FAILURE INFO: ------------------------------------------------------------------------ Total time: 0.176s Final Memory: 0M/58M INFO: ------------------------------------------------------------------------ ERROR: Error during Sonar runner execution java.lang.IllegalStateException: Fail to download libraries from server at org.sonar.runner.impl.Jars35.dowloadFiles(Jars35.java:78) 。。。。at org.sonar.runner.impl.Jars35.dowloadFiles(Jars35.java:72) ... 12 more |
起初,在google上一圈,一開始懷疑是Mysql數據庫的問題(使用自帶的H2數據庫就沒有問題),後來懷疑是Sonar的版本的問題,折騰了一個下午加一個晚上,就這樣幾個文件改來改去,而後在不斷的重複運行,不斷的搜索,不斷的糾集在一個問題上。後來,認真看了一下http://docs.codehaus.org/display/SONAR/Upgrading,看到升級Sonar後須要http://localhost:9000/setup,而後按照setup的指令來處理。
此外,sonar建立的java進程耗內存以及CPU,而且不正常啓動時,Kill不能殺死它,必須使用End Process才能終結該進程。
花了5,6個小時,一直糾結在一個問題,感受十分不值得,本身又不肯意放棄。得到一個經驗,遇到問題時,不要急躁,靜下心來,細心仔細的查看出現問題的現場,認真思考出現問題的緣由,就會能找到解決問題的方案,不要像無頭蠅同樣亂飛,費時又費力。
解決問題的靈感站點:http://sonarqube.15.x6.nabble.com/Sonar-went-under-manteinance-td5008852.html
代碼質量分析可以使代碼:更少錯誤,更可持續性,更可靠,更可讀,對新貢獻者友好。
Code quality analysis mainly relies on a set of tools that look at your code and give you hints. The most famous tools are Findbugs, PMD, Checkstyle; but also code coverage tools such as Jacoco. JDT itself provides very powerful quality checks, but there are not enabled by default. You should go to Error/Warnings in preferences and replace all "ignore" by "Warning". You can (and should) enable such tools in IDE.
代碼質量分析主要依賴一組查看代碼並給出線索的工具。著名的工具備Findbugs,PMD,Checkstyle;代碼分析工具備諸如Jacoco,emma,cobertura這樣的。JDT自身提供很是強大的質量檢查,但默認沒有啓動。能夠在preference菜單中Error/Warnings中將全部ignore替換爲Warning。也能夠在IDE中啓動這樣工具。(備註:Eclipse中存在Eclemma,codecover這樣代碼插樁工具中)
Code quality can also be analyzed out of the IDE, running those tools and using their reports to find out the "hot spots" in your code.
也可在IDE以外分析代碼質量,運行上述工具並使用工具的報道來尋找代碼中的熱點。
Sonar is an open-source product which is used to gather several metrics about code quality, put them all in a single dashboard, and provide some tips to help you making your code better, more sustainable, more reliable, less bugged.
Sonar是一個收集某些代碼質量度量的開放源代碼的工具,將度量信息所有放到單個白板(dashboard)上,並提供一些使代碼更加好,可靠,持續和更少bug的建議。
Enable Hudson Sonar plugin on your job or running mvn sonar:sonar on your Maven build will result in the following flow of actions:
在工做中啓動Hudson(可擴展的持續集成服務器)的Sonar插件,或者對Maven(一種相似make的java構建工具)構建運行sonar,命令爲mvn sonar,將會致使下面的行爲:
Sonar can be found on https://dev.eclipse.org/sonar . Several projects already have quality reports enabled. You can drill-down on code to see Sonar annotations on each class, or navigate through the different widget on dashboard to focus on dedicated issues
Sonar在https://dev.eclipse.org/sonar。一些項目已經啓動了質量報告。可挖掘代碼查看Sonar中每一個類中的註釋,或導航到白板中不一樣的widget中關注特定的主題。
關於如何在Eclipse中使用Sonar,能夠參考[9] Eclipse Sonar Tutorial,其中大致介紹瞭如何安裝Sonar的Eclipse插件之類的,對於如何閱讀和使用Sonar主要是參考Sonar的官方文檔。
See http://mickaelistria.wordpress.com/2012/10/08/sonar-at-eclipse-org/ . You'll need a Tycho-based build, and a Job on Hudson sandbox to be able to push reports to Sonar.
參考http://mickaelistria.wordpress.com/2012/10/08/sonar-at-eclipse-org/。在對項目啓動Sonar推送報告,可能須要一個基於Tycho的構建以及Hudson沙箱。
Sonar is currently (and will remain) public to all, but only an admin can log it. So it's not yet possible to store user preferences or be made an administrator on a project. Follow bug 391343 for more details.
Sonar是對公共開放的,但只有admin能夠記錄。因此,Sonar也許不能存儲用戶設置或成爲某個項目的管理員,更多信息查看bug 391343。
Sonar is installed on a VM accessible from inside Eclipse infrastructure and with hostname sonar. It uses its embedded Jetty server to publish to HTTP, and uses a PostgreSQL database on the same VM.
Sonar安裝在可從Eclipse內部架構中訪問並命名爲主機名的+sonar的VM中。Sonar使用內置的Jetty服務器經過HTTP推送內容,並使用PostgreSQL(Oracle支持伯利克利大學開發的開源數據庫)數據庫。
The database is made accessible from Eclipse.org servers and has a user for Sonar, and another user for Hudson. When running the Hudson Sonar plugin, the plugin uses this user to push to the Sonar database the metrics about your project.
該數據庫可從Eclipse.org的服務器中訪問,併爲Sonar和Hudson分別創建了兩個用戶。當運行Hudson Sonar插件時,插件使用Sonar用戶向Sonar數據庫推送項目度量信息。
l User to follow to get notified of new bugs on Sonar component: sonar-inbox@eclipse.org
收集了這麼多關於Sonar的信息,我忽然想到王垠大神寫的開源工具PySonar命名的含義了,Python的Sonar工具。Sonar原來這麼NB的工具,只怪我太孤陋寡聞。
學習配置並使用sonar,花費了將近兩三天的時間,以爲效率有點低。
[2]Code Quality Tools Review for 2013: Sonar, Findbugs, PMD and Checkstyle http:// zeroturnaround.com/rebellabs/code-quality-tools-review-for-2013-sonar-findbugs-pmd-and-checkstyle/
[3]eclipse中關於Sonar的簡介 https://wiki.eclipse.org/Sonar
[4]wikipedia中關於Sonar的簡介 http://en.wikipedia.org/wiki/SonarQube
[5]Sonar官網:http://www.sonarqube.org
[6]oschina中關於sonar的介紹:http://www.oschina.net/question/tag/sonar
[7]SonarQuake官方文檔:http://docs.codehaus.org/display/SONAR/Documentation
[8]Sonar實戰 http://wenku.baidu.com/view/f1306661ccbff121dd3683d9.html