java代碼質量相關插件(PMD|JaCoCo|sonar)關於maven及IDEA使用及配置

java後端項目代碼質量檢測集成插件

  1. 靜態代碼分析:PMD
  2. 代碼測試用例覆蓋率:jacoco
  3. 持續代碼質量檢查:sonar

注:後續主要介紹,如何在maven和idea上提成上述插件

二、靜態代碼分析插件集成

​ PMD是一種代碼靜態分析工具,當使用PMD規則分析Java源碼時,PMD首先利用JavaCC和EBNF文法產生了一個語法分析器,用來分析普通文本形式的Java代碼,產生符合特定語法結構的語法,同時又在JavaCC的基礎上添加了語義的概念即JJTree,通過JJTree的一次轉換,這樣就將Java代碼轉換成了一個AST,AST是Java符號流之上的語義層,PMD把AST處理成一個符號表。然後編寫PMD規則,一個PMD規則可以看成是一個Visitor,通過遍歷AST找出多個對象之間的一種特定模式,即代碼所存在的問題。

​ 靜態代碼分析是指在不運行程序的前提下,對源代碼進行分析或檢查,範圍包括代碼風格、可能出現的空指針、代碼塊大小、重複的代碼等。

PMD 特點:

​ 可擴展的靜態代碼分析器,不僅可以對代碼風格進行檢查,還可以檢查設計、多線程、性能等方面的問題

2.1 maven 集成PMD

2.1.1 PMD中是用了阿里巴巴Java代碼規約插件p3c-pmd

P3C-PMD插件基於PMD實現了《阿里巴巴Java開發手冊》中涉及的48條規則。

  1. 編程規約(一)命名風格,實現了1、2、3、4、5、6、7、8、9、13等10條規則;
  2. 編程規約(二)常量定義,實現了1、2等2條規則;
  3. 編程規約(四)OOP規約,實現了5、6、7、8、9、12、17等7條規則;
  4. 編程規約(五)集合處理,實現了4、5、6、7、9、11等6條規則;
  5. 編程規約 (六)併發處理,實現了1、2、3、4、5、10、11、12等8條規則;
  6. 編程規約(七)控制語句,實現了1、2、4等3條規則;
  7. 編程規約(八)註釋規約,實現了1、2、3、4、5等5條規則;
  8. 編程規約(九)其他,實現了1、3、4、5等4條規則;
  9. 異常日誌 (一)異常處理,實現了5、7、10等3條規則;

2.1.2 maven 對應的pom.xml中集成PMD插件

<!-- 屬性定義,定義編譯環境以及第三方依賴的版本 -->
<properties>
     <!-- 字符編碼 -->
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     <!-- pmd 靜態代碼檢測 -->
        <maven.pmd.version>3.13.0</maven.pmd.version>
        <p3c.pmd.version>2.0.1</p3c.pmd.version>
</properties>
<plugins>
    <!-- 編碼規約掃描命令: mvn pmd:pmd-->
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-pmd-plugin</artifactId>
        <version>${maven.pmd.version}</version>
        <configuration>
            <!-- enable incremental analysis -->
            <analysisCache>true</analysisCache>
            <!-- analysisCacheLocation: optional - points to the following location by default -->
            <analysisCacheLocation>${project.build.directory}/pmd/pmd.cache</analysisCacheLocation>
            <!-- failOnViolation is actually true by default, but can be disabled-->
            <failOnViolation>false</failOnViolation>
            <!-- printFailingErrors is pretty useful-->
            <printFailingErrors>true</printFailingErrors>
            <sourceEncoding>${project.build.sourceEncoding}</sourceEncoding>
            <targetJdk>${project.build.version}</targetJdk>
            <linkXRef>true</linkXRef>
            <rulesets>
                <ruleset>rulesets/java/ali-comment.xml</ruleset>
                <ruleset>rulesets/java/ali-concurrent.xml</ruleset>
                <ruleset>rulesets/java/ali-constant.xml</ruleset>
                <ruleset>rulesets/java/ali-exception.xml</ruleset>
                <ruleset>rulesets/java/ali-flowcontrol.xml</ruleset>
                <ruleset>rulesets/java/ali-naming.xml</ruleset>
                <ruleset>rulesets/java/ali-oop.xml</ruleset>
                <ruleset>rulesets/java/ali-orm.xml</ruleset>
                <ruleset>rulesets/java/ali-other.xml</ruleset>
                <ruleset>rulesets/java/ali-set.xml</ruleset>
            </rulesets>
        </configuration>
        <executions>
            <!-- 綁定pmd:check到verify生命週期 -->
            <execution>
                <id>inspection-code-by-pmd</id>
                <phase>verify</phase>
                <goals>
                    <goal>check</goal>
                </goals>
            </execution>
            <!-- 綁定pmd:pmd到site生命週期 -->
            <execution>
                <id>pmd-pmd-site</id>
                <phase>site</phase>
                <goals>
                    <goal>pmd</goal>
                </goals>
            </execution>
        </executions>
        <!-- p3c依賴 -->
        <dependencies>
            <!-- https://mvnrepository.com/artifact/com.alibaba.p3c/p3c-pmd -->
            <dependency>
                <groupId>com.alibaba.p3c</groupId>
                <artifactId>p3c-pmd</artifactId>
                <version>${p3c.pmd.version}</version>
            </dependency>
        </dependencies>
    </plugin>
</plugins>
  • mvn pmd:check

    • 紅框中則是代碼檢查結果

2.2 IDEA集成插件

由於我們使用了阿里提供的p3c-pmd插件,理論上IDEA上只需要按照Alibaba Java Coding Guidelines即可,但是建議也把PMD插件安裝上

2.2.1 IDEA安裝阿里巴巴Java代碼規約插件

  • IDEA版的插件已發佈到IDEA官方倉庫中(最低支持版本14.1.7,JDK1.7+),只需打開File-- Settings --Plugins – Browse repositories 輸入 Alibaba 搜索便可以看到對應插件,點擊安裝等待安裝完成。IDEA會自動檢測插件新版並提示。
    • File–Setting–Plugins–Marketplace

檢索alibaba,第一個就是Alibaba Java Coding Guidelines,點擊右側Install即可,安裝完畢後重啓IDEA即可。

重啓IDEA後,可以看到Tools菜單下面有阿里編程規約的插件,有三項子功能:

  • 編程規約掃描(快捷鍵Ctrl+Alt+Shift+J)

  • 關閉/打開實時檢測功能

  • 切換語言至英文(English):點擊後提示:SmartFox Intellij IDEA Plugin切換語言成功,重啓後生效

2.2.2 阿里代碼規約插件的使用

  1. 代碼檢查 Inspections

    File-Settings-Editor- Inspections,打開後右側找到Ali-Check,可以看到很多代碼檢查規則,可以修改規則對應提示的顏色。這裏一共有55條規則。

    • 變量test_Double命名不符合駝峯形式,高亮顯示,Ctrl+F1給出修改提示
    • 常量Test_CONSTANT命名不符合規範,高亮顯示,Ctrl+F1給出修改提示

  1. 代碼分析Code Analyze

    在當前類中右鍵或者在左側Project視圖中類名稱上右鍵,選擇Alibaba Coding Guidelines Analyze, 可以對某一個類進行代碼分析;也可以直接在Project視圖中,項目的包上面單擊右鍵,選擇Alibaba Coding Guidelines Analyze,可以批量分析包中所有類

2.2.3 安裝PMD插件

  • File–Setting–Plugins–Marketplace 搜索PMDPlugin插件,並點擊installed後重啓idea

  • 在當前類中右鍵或者在左側Project視圖中類名稱上右鍵,選擇Run PMD行代碼分析;也可以直接在Project視圖中,項目的包上面單擊右鍵,選擇Run PMD,可以批量分析包中所有類

在這裏插入圖片描述

三、JaCoCo 代碼測試用例覆蓋率

3.1 JaCoCo簡介

  • JUnit只是編寫單元測試的一個框架,並沒有涉及到代碼覆蓋率,而JaCoCo提供了該功能;
  • JaCoCo是一個免費的Java代碼覆蓋率的庫,能幫助檢測出代碼覆蓋率,並輸出覆蓋率報告
  • JaCoCo提供了以下幾個維度的覆蓋率分析
    • 指令覆蓋率(Instruction Coverage)
    • 分支覆蓋率(Branch Coverage)
    • 圈複雜度覆蓋率(Cyclomatic Complexity Coverage)
    • 行覆蓋率(Line Coverage)
    • 方法覆蓋率(Method Coverage)
    • 類覆蓋率(Class Coverage)

3.2 IDEA集成JaCoCo

3.2.1 在Maven項目最外層pom.xml中引入JaCoCo插件

<properties>
    <jacoco.version>0.8.5</jacoco.version>
</properties>
<plugins>
	<plugin>
        <groupId>org.jacoco</groupId>
        <artifactId>jacoco-maven-plugin</artifactId>
        <version>${jacoco.version}</version>
        <configuration>
            <append>true</append>
        </configuration>
        <executions>
            <execution>
                <id>jacoco-initialize</id>
                <goals>
                    <goal>prepare-agent</goal>
                </goals>
                <phase>test-compile</phase>
            </execution>
            <execution>
                <id>jacoco-site</id>
                <phase>verify</phase>
                <goals>
                    <goal>report</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
</plugins>

3.2.2 執行maven jacoco生成代碼覆蓋率報告

  • maven執行命令:

    mvn clean test
    
  • 本地生成JaCoCo代碼覆蓋率文件(jacoco.exec)

  • 生成可視化jacoco文件(sonar也可以可視化jacoco文件,將在介紹sonar時介紹)

    mvn clean verify
    
    1. target/site/jacoco目錄生成index.html文件

    • 網頁可視化視圖展示代碼覆蓋率

注:IDEA 沒有JaCoCO插件

四、sonar持續代碼質量檢查

SonarQube是一個代碼質量管理工具,能對20多種編程語言源碼進行代碼味道(CodeSmells)、Bug、安全漏洞方面的靜態分析。官方網站(https://www.sonarsource.com/plans-and-pricing/)

主要特點:

  1. 代碼覆蓋:通過單元測試,將會顯示哪行代碼被選中改善編碼規則
  2. 搜尋編碼規則:按照名字,插件,激活級別和類別進行查詢
  3. 項目搜尋:按照項目的名字進行查詢
  4. 對比數據:比較同一張表中的任何測量的趨勢

4.1 Maven與SonarQube集成

4.1.1 在多模塊的項目的最外層pom.xml設置sonar配置

<properties>
    <!-- sonar key -->
	<sonar.projectKey>sonar:cornerstone</sonar.projectKey>
    <!-- sonar name -->
    <sonar.projectName>cornerstone</sonar.projectName>
    <!-- sonar 把jacoco測試用例上傳 -->
    <sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
    <!-- sonar host -->
    <sonar.host.url>http://10.0.204.90:9000</sonar.host.url>
    <!-- sonar token -->
   <sonar.login>*********************************</sonar.login>
   <sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
    <!--將所有jacoco定位到同樣的父目錄位置-->
  <sonar.jacoco.reportPaths>target/jacoco.exec</sonar.jacoco.reportPaths>
  <sonar.language>java</sonar.language>	
</properties>

4.1.2 對要上傳的model(cornerstone-edge)的pom.xml進行配置

<properties>
     <!-- sonar config: key-->
    <sonar.projectKey>css:cornerstone-edge</sonar.projectKey>
    <!-- sonar config: name-->
    <sonar.projectName>cornerstone-edge</sonar.projectName>
</properties>

4.1.3 執行mvn命令,把sonar關於代碼檢測和JaCoCo代碼覆蓋率上傳到sonar服務器中

  1. 執行mvn命令
# 到cornerstone-edge模塊的目錄
cd cornerstone-edge
# 執行sonar
mvn sonar:sonar
  1. 把sonar關於代碼檢測和JaCoCo代碼覆蓋率上傳到sonar服務器中

    • target/sonar 目錄生成
    • 控制檯會有sonar服務器中該項目的訪問地址

  • sonar服務器頁面可視化查看sonar執行結果

    • 其中頁面上的Coverage爲JaCoCo的代碼測試用例覆蓋率
    • 其它爲sonar自身分析的模塊
![](https://img-blog.csdnimg.cn/20200622181042871.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpdXpodXBlbmc=,size_16,color_FFFFFF,t_70)

4.2 IDEA集成SonarLint插件(如果sonar服務器已經集成阿里P3C,則不太推薦)

4.2.1 SonarLint使用初步體驗:

  • SonarLint發現的問題後,會根據問題類型給出推薦的的範例代碼協助開發人員找到合適的修改思路.

  • 但是默認規則從代碼規範,命名,可以省略不必要代碼,方法邏輯複雜度等多個維度進行規範評估,給出信息種類過於多,試用之後,根據需要先定製下使用哪些規則,才更好有針對性的使用.

  • 錯誤發現有時候不如FindBugs.
    見下圖iqtAnalysisTsmMap是一個key類型是String的Map,KeySB是StringBuffer類型.SonarLint沒有發現這個BUG.

     Map<String, IqtAnalysisTsm> iqtAnalysisTsmMap 	 = new HashMap<>();
     StringBuilder keySB = new StringBuilder();
    if(iqtAnalysisTsmMap.containsKey(keySB)){
    	//TODO:
    }
    

4.2.2 IDEA安裝插件SonarLint

  1. File–Setting–Plugins–Marketplace 搜索SonarLint插件,並點擊installed後重啓idea

  1. 配置SonarLint

    • File–setting–Tools–SonarLint-- +
      • 選擇sonarqube,並填URL:http://10.0.204.90:9000

  • 選擇token登錄,並填寫token文本框:ce270177f461509e0cb9c0ac6e4b343c96e1188a

  • 是否開啓自動分析:

    • 這裏上面紅框Automatically trigger analysis有配置是否允許自動分析,默認是勾選上的,開啓自動分析功能,根據自己需求選擇是否需要勾選開啓.
    • 更新獲取遠程SonarQube配置當遠程SonarQube有更新,可以點擊下面紅框裏的按鈕Update Binding行更新.
    • 保存配置
      • 點擊下圖中的Apply否則配置不會保存!
      • 點擊下圖中的Apply否則配置不會保存!
      • 點擊下圖中的Apply否則配置不會保存!
        在這裏插入圖片描述
  1. 配置SonarLint Project Settings

    • 選擇下圖中SonarLint Project Settings的菜單
    • 勾選Enable binding to remote SonarQube server
    • 在Bind to server 右邊下拉選擇剛纔配置的 sonar配置名稱
    • 配置SonarQube project,可以點擊Search in List,再彈出框裏找到想使用的某個規則選擇想使用的即可.
    • 點擊Apply使得配置生效保存

  1. 查看SonarLint窗口

    默認會在IDEA底部打開sonarLint標籤窗口菜單.

如果沒有,或者不小心關閉了.
可以點擊菜單 view->Tool Windows中找到 SonarLint.重新打開SonarLint窗口

  1. 使用SonarLint

    在項目目錄結構中選擇要分析的文件夾或是代碼文件,右鍵菜單Anaylyze->**Analyze with SonarLint Https…**或者選中後使用快捷鍵 Ctrl+Shift+S
    在這裏插入圖片描述


更多內容請關注微信公衆號:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章