使用sonar進行java代碼質量管理
前言
應公司要求,這一次的開發需要進行sonar進行靜態代碼質量檢測。
接到這個任務的時候,我還並不知道sonar是什麼,但聽到靜態代碼檢測幾個字的時候,我下意識的以為是類似checkstyle之類的工具,但是真正用過之後我發現我錯了。
我發現實際運行的時候,似乎並不純粹是靜態,因為整個檢測過程中還會連接數據庫,還會發送http請求,還會連接svn等等。
用完之後,深感這個工具的好用,不檢測不知道,一檢測嚇一跳,竟然檢查出來了26個bugs,可靠性級別是像毒血一樣的黑紅E。
那麼廢話不再多說,進入主題,記錄一下整個環境搭建和檢測過程,以便備忘。
安裝
安裝主要是參考了一篇博文使用 Sonar 進行代碼質量管理,不過有一些細節略有區別。
下載
執行git命令git clone git://github.com/SonarSource/sonar.git
前提是安裝了git,我下載下來的sonar版本是6.5,本地jdk環境是1.8。
解壓
這個就不用多說了
啟動
在解壓後的目錄中一層層找到windows-x86-64\StartSonar.bat,當然了,這裏需要選擇適合自己電腦操作係統的目錄。
如果啟動更不報錯,就可以進行下一步。
我在第一次啟動的時候沒有啟動成功,查看日誌發現是h2內存數據庫啟動失敗,然後想起來我電腦安裝的有h2並設置了windows服務自動啟動,所以端口占用,導致sonar裏的h2啟動失敗,然後關閉了本機的h2之後,成功啟動。
訪問
瀏覽器訪問localhost:9000,前提是啟動不報錯。
插件
在我參考的那篇博客裏,安裝完sonar之後就是裝插件,我當時不知道那插件具體幹嘛用的,就抱著試一試的心態,並沒有安裝,而是直接跳過了,而在保證完成手頭工作的情況下,後續也沒有再安裝任何插件。
配置
sonar工作的時候,要使用到數據庫,會把要檢測的項目的代碼導入到數據庫中,所以必須進行數據庫的配置,我這裏是使用的mysql數據庫。
創建sonar用戶並授權
在一開始完全不會的情況下,我跟著上邊博客一步步的做,以為必須是sonar用戶,但後來看到其他一些博客中並沒有用這個用戶,想來應該其他用戶也可以,不過我沒有試。
創建用戶命令CREATE USER sonar IDENTIFIED BY 'sonar';
用戶授權命令GRANT ALL PRIVILEGES ON *.* TO 'sonar'@'localhost' \ IDENTIFIED BY 'sonar' WITH GRANT OPTION;
建庫
創建一個給sonar用的mysql庫,不用建表,sonar會自動建表,這一步就不多說了。
配置sonar.properties
代開sonar安裝目錄,也就是之前解壓的目錄,找到conf下的sonar.properties文件,編輯這個文件。
1. 找到
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
這一行,原本是注釋的,去掉注釋。
2. 找到sonar.jdbc.username
和sonar.jdbc.password
,都填上sonar,如果上邊建立用戶那裏不是sonar,可能需要改一下。
3. 將 MySQL 的驅動文件(如 mysql-connector-java-5.1.34.jar)拷貝到 安裝目錄的extensions\jdbc-driver\mysql 目錄下,如果沒有這些目錄就自己創建。我的一開始沒有mysql這個目錄,就是自己創建的。
配置maven的settings.xml
在<profiles></prifiles>
加入如下配置
<profile> <id>sonar</id> <activation> <activeByDefault>true</activeByDefault> </activation> <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>https://localhost:9000</sonar.host.url> </properties> </profile>
我上邊參考的那個文檔裏 url寫的是這樣jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8
,但我這樣配之後執行mvn命令報錯,所以就去掉了後邊一截。
進行代碼檢測
代碼檢測主要就是在cmd窗口執行了兩個mvn的命令,分別是mvn clean install
和mvn sonar:sonar
,如果這兩個命令執行結果都是build success,基本上就沒有問題了,而我在運行的過程中有遇到下邊一些問題。
java_home的問題
被檢測的項目使用的是jdk1.8,雖然我在cmd命令行窗口執行java -version
結果也是1.8,但是環境變量的java_home配置卻是1.6的路徑,導致執行mvn命令的時候出現如下錯誤Unsupported major.minor version 52.0
,把java_home換成1.8之後問題消失。
maven鏡像的問題
由於我的maven配置的倉庫鏡像是阿裏雲的鏡像,而公司最近封網,導致使用內網的時候執行mvn clean install
命令,需要的插件無法下載,切換到外部網絡之後問題解決。這些插件應該是隻有第一次執行的時候才下載,後邊繼續用內網就沒有問題。
數據庫連接的問題
這裏說的數據庫不是sonar要用的mysql,而是項目裏的數據庫。
由於一開始以為靜態代碼檢查跟數據庫無關,因此項目裏要連接的oracle數據庫沒有啟動,導致執行上邊命令的時候,因數據庫連接不上而失敗,啟動oracle數據庫後問題解決。
svn連接的問題
這個問題其實我還沒太明白,因為項目裏似乎並沒有配置svn相關的東西,但是執行mvn sonar:sonar
的時候,卻因svn連接不上而失敗,當切換網絡連接上svn後,問題解決。
代碼優化
上述問題都解決之後,使用localhost:9000訪問之後,就可以看到我們要檢查的項目。看到頁麵之後的操作,自己點一點鼠標就很容易明白,很容易找到有問題的代碼具體的類,具體的行數等,甚至頁麵上還會給出優化方案,然後就可以根據具體顯示出來的代碼及優化方案進行優化了。
最後更新:2017-10-19 09:33:19