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
    在这里插入图片描述


更多内容请关注微信公众号:
在这里插入图片描述

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐