1. 程式人生 > >使用sonar進行java程式碼質量管理

使用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.usernamesonar.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>http://localhost:9000</sonar.host.url>
   </properties>
</profile>

我上邊參考的那個文件裡 url寫的是這樣jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8,但我這樣配之後執行mvn命令報錯,所以就去掉了後邊一截。

進行程式碼檢測

程式碼檢測主要就是在cmd視窗執行了兩個mvn的命令,分別是mvn clean installmvn 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訪問之後,就可以看到我們要檢查的專案。看到頁面之後的操作,自己點一點滑鼠就很容易明白,很容易找到有問題的程式碼具體的類,具體的行數等,甚至頁面上還會給出優化方案,然後就可以根據具體顯示出來的程式碼及優化方案進行優化了。