java后端项目代码质量检测集成插件
- 静态代码分析:PMD
- 代码测试用例覆盖率:jacoco
- 持续代码质量检查:sonar
注:后续主要介绍,如何在maven和idea上提成上述插件
PMD是一种代码静态分析工具,当使用PMD规则分析Java源码时,PMD首先利用JavaCC和EBNF文法产生了一个语法分析器,用来分析普通文本形式的Java代码,产生符合特定语法结构的语法,同时又在JavaCC的基础上添加了语义的概念即JJTree,通过JJTree的一次转换,这样就将Java代码转换成了一个AST,AST是Java符号流之上的语义层,PMD把AST处理成一个符号表。然后编写PMD规则,一个PMD规则可以看成是一个Visitor,通过遍历AST找出多个对象之间的一种特定模式,即代码所存在的问题。
静态代码分析是指在不运行程序的前提下,对源代码进行分析或检查,范围包括代码风格、可能出现的空指针、代码块大小、重复的代码等。
PMD 特点:
可扩展的静态代码分析器,不仅可以对代码风格进行检查,还可以检查设计、多线程、性能等方面的问题
P3C-PMD插件基于PMD实现了《阿里巴巴Java开发手册》中涉及的48条规则。
<properties>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<maven.pmd.version>3.13.0maven.pmd.version>
<p3c.pmd.version>2.0.1p3c.pmd.version>
properties>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-pmd-pluginartifactId>
<version>${maven.pmd.version}version>
<configuration>
<analysisCache>trueanalysisCache>
<analysisCacheLocation>${project.build.directory}/pmd/pmd.cacheanalysisCacheLocation>
<failOnViolation>falsefailOnViolation>
<printFailingErrors>trueprintFailingErrors>
<sourceEncoding>${project.build.sourceEncoding}sourceEncoding>
<targetJdk>${project.build.version}targetJdk>
<linkXRef>truelinkXRef>
<rulesets>
<ruleset>rulesets/java/ali-comment.xmlruleset>
<ruleset>rulesets/java/ali-concurrent.xmlruleset>
<ruleset>rulesets/java/ali-constant.xmlruleset>
<ruleset>rulesets/java/ali-exception.xmlruleset>
<ruleset>rulesets/java/ali-flowcontrol.xmlruleset>
<ruleset>rulesets/java/ali-naming.xmlruleset>
<ruleset>rulesets/java/ali-oop.xmlruleset>
<ruleset>rulesets/java/ali-orm.xmlruleset>
<ruleset>rulesets/java/ali-other.xmlruleset>
<ruleset>rulesets/java/ali-set.xmlruleset>
rulesets>
configuration>
<executions>
<execution>
<id>inspection-code-by-pmdid>
<phase>verifyphase>
<goals>
<goal>checkgoal>
goals>
execution>
<execution>
<id>pmd-pmd-siteid>
<phase>sitephase>
<goals>
<goal>pmdgoal>
goals>
execution>
executions>
<dependencies>
<dependency>
<groupId>com.alibaba.p3cgroupId>
<artifactId>p3c-pmdartifactId>
<version>${p3c.pmd.version}version>
dependency>
dependencies>
plugin>
plugins>
由于我们使用了阿里提供的p3c-pmd插件,理论上IDEA上只需要按照
Alibaba Java Coding Guidelines
即可,但是建议也把PMD插件安装上
检索alibaba,第一个就是Alibaba Java Coding Guidelines,点击右侧Install即可,安装完毕后重启IDEA即可。
重启IDEA后,可以看到Tools菜单下面有阿里编程规约的插件,有三项子功能:
编程规约扫描(快捷键Ctrl+Alt+Shift+J)
关闭/打开实时检测功能
切换语言至英文(English):点击后提示:SmartFox Intellij IDEA Plugin切换语言成功,重启后生效
代码检查 Inspections
File-Settings-Editor- Inspections,打开后右侧找到Ali-Check,可以看到很多代码检查规则,可以修改规则对应提示的颜色。这里一共有55条规则。
代码分析Code Analyze
在当前类中右键或者在左侧Project视图中类名称上右键,选择Alibaba Coding Guidelines Analyze, 可以对某一个类进行代码分析;也可以直接在Project视图中,项目的包上面单击右键,选择Alibaba Coding Guidelines Analyze,可以批量分析包中所有类
Run PMD
行代码分析;也可以直接在Project视图中,项目的包上面单击右键,选择Run PMD
,可以批量分析包中所有类JaCoCo
简介JaCoCo
提供了该功能;JaCoCo
是一个免费的Java代码覆盖率的库,能帮助检测出代码覆盖率,并输出覆盖率报告JaCoCo
提供了以下几个维度的覆盖率分析
<properties>
<jacoco.version>0.8.5jacoco.version>
properties>
<plugins>
<plugin>
<groupId>org.jacocogroupId>
<artifactId>jacoco-maven-pluginartifactId>
<version>${jacoco.version}version>
<configuration>
<append>trueappend>
configuration>
<executions>
<execution>
<id>jacoco-initializeid>
<goals>
<goal>prepare-agentgoal>
goals>
<phase>test-compilephase>
execution>
<execution>
<id>jacoco-siteid>
<phase>verifyphase>
<goals>
<goal>reportgoal>
goals>
execution>
executions>
plugin>
plugins>
maven执行命令:
mvn clean test
本地生成JaCoCo代码覆盖率文件(jacoco.exec)
生成可视化jacoco文件(sonar也可以可视化jacoco文件,将在介绍sonar时介绍)
mvn clean verify
注:IDEA 没有JaCoCO插件
SonarQube是一个代码质量管理工具,能对20多种编程语言源码进行代码味道(CodeSmells)、Bug、安全漏洞方面的静态分析。官方网站(https://www.sonarsource.com/plans-and-pricing/)
主要特点:
- 代码覆盖:通过单元测试,将会显示哪行代码被选中改善编码规则
- 搜寻编码规则:按照名字,插件,激活级别和类别进行查询
- 项目搜寻:按照项目的名字进行查询
- 对比数据:比较同一张表中的任何测量的趋势
<properties>
<sonar.projectKey>sonar:cornerstonesonar.projectKey>
<sonar.projectName>cornerstonesonar.projectName>
<sonar.java.coveragePlugin>jacocosonar.java.coveragePlugin>
<sonar.host.url>http://10.0.204.90:9000sonar.host.url>
<sonar.login>*********************************sonar.login>
<sonar.dynamicAnalysis>reuseReportssonar.dynamicAnalysis>
<sonar.jacoco.reportPaths>target/jacoco.execsonar.jacoco.reportPaths>
<sonar.language>javasonar.language>
properties>
<properties>
<sonar.projectKey>css:cornerstone-edgesonar.projectKey>
<sonar.projectName>cornerstone-edgesonar.projectName>
properties>
# 到cornerstone-edge模块的目录
cd cornerstone-edge
# 执行sonar
mvn sonar:sonar
把sonar关于代码检测和JaCoCo代码覆盖率上传到sonar服务器中
sonar服务器页面可视化查看sonar执行结果

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:
}
配置SonarLint
+
选择token登录,并填写token文本框:ce270177f461509e0cb9c0ac6e4b343c96e1188a
是否开启自动分析:
配置SonarLint Project Settings
查看SonarLint窗口
默认会在IDEA底部打开sonarLint标签窗口菜单.
如果没有,或者不小心关闭了.
可以点击菜单 view->Tool Windows中找到 SonarLint.重新打开SonarLint窗口
使用SonarLint
在项目目录结构中选择要分析的文件夹或是代码文件,右键菜单Anaylyze->**Analyze with SonarLint Https…**或者选中后使用快捷键 Ctrl+Shift+S
更多内容请关注微信公众号: