閱讀65 返回首頁    go 阿裏雲 go 技術社區[雲棲]


使用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>https://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訪問之後,就可以看到我們要檢查的項目。看到頁麵之後的操作,自己點一點鼠標就很容易明白,很容易找到有問題的代碼具體的類,具體的行數等,甚至頁麵上還會給出優化方案,然後就可以根據具體顯示出來的代碼及優化方案進行優化了。

最後更新:2017-10-19 09:33:19

  上一篇:go  前端初始化類庫
  下一篇:go  用 JavaScript 實現麵向對象編程中的要素