SonarQube是管理代碼質量一個開放平台,可以快速的定位代碼中潛在的或者明顯的錯誤,下面將會介紹一下這個工具的安裝、配置以及使用。
1. 簡介
1. sonar是什么
Sonar是一個用於代碼質量管理的開源平台,用於管理代碼的質量,通過插件形式可以支持二十幾種語言的代碼質量檢測,通過多個維度的檢查了快速定位代碼中潛在的或者明顯的錯誤。
2. SonarQube與Sonar
SonarQube是sonar的服務端,相當於一個web服務器中的tomcat,用來發布應用,在線瀏覽分析等。
2.安裝
1.下載sonarqubexxx.zip並且解壓即可:
下載地址:http://www.sonarqube.org/downloads/
下載完成后解壓后點擊StartSonar.bat啟動即可,如下:
http訪問9000端口出現下面則證明安裝成功。 (如果需要修改端口等信息修改sonarqube-6.7.6\conf\sonar.properties即可)
2.配置數據庫
1. 在mysql數據庫新建一個庫的名稱為sonar
2. 修改sonar/conf/sonar.properties的db信息:
不用放置驅動包,也不用創建表。
sonar.jdbc.username=root sonar.jdbc.password=123456 sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
3.重啟sonarQube會自動建表。
4.接下來訪問9000端口然后進行登錄即可。默認創建的用戶名和密碼都是admin。可以在system選項卡看到系統信息
3.使用
1.下載sonar-scanner:(這個工具是對源碼進行掃描,並將結果保存到數據庫以便用上面的sonarqube進行分析)
下載地址: https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner
2.配置mysql信息
\sonar\sonar-scanner-3.3.0.1492-windows\conf\sonar-scanner.properties文件
#Configure here general information about the environment, such as SonarQube server connection details for example #No information about specific project should appear here #----- Default SonarQube server #sonar.host.url=http://localhost:9000 #----- Default source code encoding #sonar.sourceEncoding=UTF-8 sonar.jdbc.username=root sonar.jdbc.password=123456 sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
3.配置環境變量 並測試
path中增加如下變量: E:\sonar\sonar-scanner-3.3.0.1492-windows\bin
C:\Users\Administrator>sonar-scanner --version INFO: Scanner configuration file: E:\sonar\sonar-scanner-3.3.0.1492-windows\bin\..\conf\sonar-scanner.properties INFO: Project root configuration file: NONE INFO: SonarQube Scanner 3.3.0.1492 INFO: Java 1.8.0_121 Oracle Corporation (64-bit) INFO: Windows 10 10.0 amd64
4.打開要進行代碼分析的項目根目錄,新建sonar-project.properties文件
# must be unique in a given SonarQube instance sonar.projectKey=my:project # this is the name displayed in the SonarQube UI sonar.projectName=springboot-ssm sonar.projectVersion=1.0 # Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows. # Since SonarQube 4.2, this property is optional if sonar.modules is set. # If not set, SonarQube starts looking for source code from the directory containing # the sonar-project.properties file. sonar.sources=src/main/java sonar.java.binaries=./target/classes # Encoding of the source code. Default is default system encoding #sonar.sourceEncoding=UTF-8
解釋:projectName是項目名字,sources是源文件所在的目錄;sonar.java.binaries是項目編譯后的class文件的目錄。
5.設置成功后,啟動sonarqube服務
6.開始分析:
cmd窗口進入到項目的根路徑,執行下面命令即可:
E:\xiangmu\springboot-ssm>sonar-scanner
如下:
7.訪問9000端口查看分析結果
項目分析概要圖:
查看存在的bug:
8.選擇一個bug進行查看(可以看到與git也進行了集成,可以看到編寫人與時間以及bug的原因)
此工具還分析出一些異常信息的記錄等,如下:
9. 解決下面的bug
代碼修改為下面即可:(上面邏輯應該是沒有錯,只是在多次改變引用的情況下被檢測為bug)
@Override public Token addOrUpdateToken(String username) { // 1.判斷是否有對應的token,如果有的話更新時間,沒有的話就創建token並且返回 Token token = findTokenByUsername(username); // 1.1創建token並返回 if (token == null) { return generateAndSaveTokenByUserName(username); } // 1.2根據失效時間更新且返回token return updateTokenByTokenLoseTime(token); }
10.解決異常處理的bug
代碼修改為:
@Scheduled(fixedRate = 10000) public void cron() { try { Thread.sleep(2000); System.out.println("spring anno task execute times " + count++); } catch (InterruptedException e) { System.err.println("InterruptedException " + e); Thread.currentThread().interrupt(); } }
11.程序中故意寫一個空指針異常看是否可以檢測出來
String string = null; if(string.equals("xxx")){ System.out.println("xxx"); }
結果:
更多的學習參考官網:
https://docs.sonarqube.org/display/SCAN/Advanced+SonarQube+Scanner+Usages
補充:sonarqube漢化
- 到https://docs.sonarqube.org/display/PLUG/Plugin+Library 網站搜索 chinese pack
- 然后點擊到對應的git地址https://github.com/SonarQubeCommunity/sonar-l10n-zh/releases下載對應版本的jar包,下載之后放到sonar\sonarqube-6.7.6\extensions\plugins目錄下面重啟即可,如下:
- 再次通過9000端口訪問發現變為中文版:
4. 注冊為windows服務
sonar自帶的有注冊與刪除服務的方法,采用wrapper注冊為服務,如下已管理員方式運行InstallNTService.bat即可:
注冊為服務之后我這里啟動服務報錯不能正常啟動服務,到 %sonar%/logs/sonar.log中查看原因如下:
Launching a JVM...
Unable to execute Java command. 系統找不到指定的文件。 (0x2)
解決辦法:修改%sonar%/conf/wrapper.conf中java的路徑為絕對路徑
補充:sonar-scanner的配置也可以進行分模塊配置,比如我想檢測一個web項目的所有文件(包括Java、JSP、JS、Html、XML),如下:
0. 如果檢測html和JSP需要下載sonar-html-plugin-3.1.0.1615.jar插件置於sonarqube-6.7.6\extensions\plugins目錄下,而且html的language為web,jsp的language為jsp
1.項目結構如下:
2.sonar-project.properties配置文件如下:
# must be unique in a given SonarQube instance
sonar.projectKey=my:project
# this is the name displayed in the SonarQube UI
sonar.projectName=sonarTest
sonar.projectVersion=1.0
sonar.modules=java-module,javascript-module,xml-module,jsp-module,html-module
sonar.sourceEncoding=UTF-8
# Java module
java-module.sonar.projectName=Java Module
java-module.sonar.language=java
java-module.sonar.projectBaseDir=.
java-module.sonar.sources=src
#ignore files and directory
java-module.sonar.exclusions=src/cn/qlq/test2/**,src/cn/qlq/test3.java
sonar.java.binaries=./build
# JavaScript module
javascript-module.sonar.projectName=JavaScript Module
javascript-module.sonar.projectBaseDir=.
javascript-module.sonar.language=js
javascript-module.sonar.sources=WebContent
# Jsp module
jsp-module.sonar.projectName=Jsp Module
jsp-module.sonar.projectBaseDir=.
jsp-module.sonar.language=jsp
jsp-module.sonar.sources=WebContent
# Html module
html-module.sonar.projectName=Html Module
html-module.sonar.projectBaseDir=.
html-module.sonar.language=web
html-module.sonar.sources=WebContent
#Xml module
xml-module.sonar.projectName=Xml Module
xml-module.sonar.projectBaseDir=.
xml-module.sonar.language=xml
xml-module.sonar.sources=WebContent
3.測試結果從web上訪問如下:
補充:sonar集成阿里的p3c規則
1.下載插件
到https://github.com/mrprince/sonar-p3c-pmd/releases 下載jar包即可
2.jar放在sonarqube-6.7.6\extensions\plugins目錄下
3.重啟sonarqube
4.到網頁規則搜索p3c,如下
5. 創建規則,不用選文件,如下:
6.接下來激活p3c規則 (選擇上面的創建的p3c,同時搜索未激活的p3c,然后激活即可。如果p3c也需要即可sonar的自帶規則就不要加搜索條件,選擇所有的規則)
7.查看p3c激活的規則 (48條)
8. 到質量配置設為java默認規則即可
9.簡單的測試
sonar自帶的與p3c規則最明顯的區別是:
str.equals("xxx")在p3c會被檢測,在自帶規則不會被檢測到。
System.out.print... 會被自帶規則檢測到,p3c不會檢測到。