静态代码扫描工具

img

优秀的团队为了保证可读性、可维护性、避免重复踩坑与保证代码质量,都会推出一些开发规范来遵守。
开发规范是前置主动要求团队成员遵守的,而光靠意识是难以保证完全遵守规范的,所以还需要一些工具辅助。
当然即使有工具做这些事情,规范也是必须推广的,让大家先仔细读读,毕竟直接写出优秀的代码是最好的,然后再辅助工具乃最佳实践。

开发规范

一流公司制定规范,二流公司申请专利,三流公司生产产品。
所以目前公开规范的大多是大厂的规范。

目前知道大厂公开的Java开发规范

阿里巴巴的开发规范,虽然不是单纯的规范,还包括了开发中的各种坑从主观上的一些强制规定,但是总体上还是很有用的,可以拿来部分or全部直接执行。

独立的组件

FindBugs

只寻找可能存在bug的地方,不注重样式或者格式,它试图只寻找真正的缺陷或者潜在的性能问题。

特点

  • 基于class分析,如果你clean了再去执行发现没有执行生成报告,所以需要编译后才能执行分析
  • 有maven插件,有IDE插件(eclipse插件,也有idea插件)
  • 开发时不用使用maven插件,要编译执行检测生成xml然后再生成网页查看结果,挺麻烦。如果要与Jenkins集成的时候,maven插件就有用了,集成方式点我
  • 开发时使用IDE插件非常方便
  • 插件中Bug Explorer 中的灰色图标处为 Bug 类型,红色图标表示 bug 较为严重,黄色的图标表示 bug 为警告程度

代码缺陷分类

根据缺陷的性质,大致可以分为下列几类

  • Bad practice 不好的做法
  • Correctness 可能有不正确
  • Dodgy code 糟糕的代码
  • Experimental 实验
  • Internationalization 国际化
  • Malicious code vulnerility 恶意的代码漏洞
  • Multithreaded correctness 多线程问题
  • Performance 性能问题

FindBugs官方网站上也给出了一些案例:案例点我

缺陷列表

缺陷列表

排除单个规则

如果是排除一类规则,点击IDE旁边的提示选择排除类型就行

可以针对规则排除单独类中的接触限制,使用注解@edu.umd.cs.findbugs.annotations.SuppressFBWarnings
要加入依赖 provided代表只在编译时依赖,打包后就没有这个依赖了
IDE旁边提示也有这种,不过不会加入以下依赖,需要手动在POM中加入

1
2
3
4
5
6
7
8
9
10
11
12
<dependency>
<groupId>com.google.code.findbugs</groupId>
<artifactId>annotations</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.google.code.findbugs</groupId>
<artifactId>jsr305</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>

CheckStyle

代码样式风格检查,专门check代码规范风格的,比如缩进,换行操作,命名
大项目往往是有很多人一起完成的,然而每个人都有自己的style,导致整个项目的代码不仅存在不符合语言规范的情况,而且读起来非常困难。因此,这样的项目中都会引入Checkstyle,来规范大家的编码风格,尽量做到统一和合理。
所以使用checkStyle检查到问题

官方文档:http://checkstyle.sourceforge.net/checks.html

工具界面

插件
img

单个文件check
img

特点

  • 基于源码,无需编译
  • 有maven插件,与IDE插件(eclipse插件,也有idea插件)。idea的一些细节配置
  • 可以自定义规则
  • CheckStyle底层基于antlr对源码进行处理
  • 可以配置哪些文件不检查

规范配置

配置位置
img

  • sun_checks.xml 默认自带sun公司的开发规范,有点严格
  • google_checks.xml 下载下来好像有点问题,可能与版本有关 查看
  • 华为的规范 很多公司都会用华为的规范改改
  • 自定义的规范 比较了解配置规则的情况下配置

技巧

我们在代码写完之后,还要花时间去手动解决Checkstyle提示的问题,这是一个非常无聊和耗时的工作。
其实很多问题使用IDE的格式化已经能解决一部分,所以最好能提供一个IDE的formatter配置,整个团队都用这个配置导入IDE,这样用用快捷键就能解决一些问题,非常easy。

PMD

与findbug类似找bug用,还有规范,比如说注释不全

特点

  • 有maven插件,与IDE插件(eclipse插件,也有idea插件)
  • 增强代码质量和修改代码的功能

错误分类

  • 可能的bug——空的try/catch/finally/switch块。
  • 无用代码(Dead code):无用的本地变量,方法参数和私有方法。
  • 空的if/while语句。
  • 过度复杂的表达式——不必要的if语句,本来可以用while循环但是却用了for循环。
  • 可优化的代码:浪费性能的String/StringBuffer的使用。

集合组件

IdeaIDE的QAPlug

这个插件是汇集这前面说的3个插件的结果,不用每次都运行3个插件分别排错,1键运行3个同时汇总整合,非常方便,所以其他的不用装了,就用这个就行了!
与sonar平台的功能类似!
如果公司没有搭建sonarqube平台的话,本地使用这个最佳

插件下载安装

依次下载 QAPlug、QAPlug-Checkstyle、QAPlug-FindBugs、QAPlug-PMD
img

分类

这个插件会把3个插件的错误分类汇总

  • Efficiency 效能
  • Maintainability 可维护性
  • Reliability 可靠性
  • Usability 可用性

SonarQube

代码质量管理系统
相当于QAPlug的工程独立出一个服务器部署,可以配置规则,扫描代码,集成了很多静态扫描工具
2015年3月的时候就看到一篇文章介绍这个平台了,那时候还没有太过关注,后来发现这个是个很好的平台

Sonarlint

是SonarQube的配套的IDE插件,配置远程服务器的地址,选取要拉去规则的项目,然后本地就可以执行校验了,用的远程的规则
这样还是很方便的,规则可以同一在SonarQube维护,不用每个人本地导入,团队的话用这个最适合

Sonarlint安装与拉取列表失败问题解决见

扩充-Lint概念

Sonarlint是一个Lint工具,其实Lint的含义就代表代码静态分析的工具,协助开发的工具,尤其是前端经常使用,比如插件eslint:检查JavaScript错误非常方便

JArchitect

多种分析工具的聚合工具
是一个商业性的收费的分析工具
可以汇聚checkstyle、findbugs、pmd的xml,然后分类总结生成图表
不过是收费的,也没有idea插件,不用

代码覆盖率工具

idea自带了代码覆盖率插件还不错
跑单元测试的时候以代码覆盖率的方式运行就行了
一般逻辑覆盖率60%就差不多了,核心模块80%覆盖标准即可

运行方法

img

总结

首先要从意识上要遵守规范,风格统一,需要制定一份Java开发规范,我比较倾向于直接使用阿里的Java规范吧,简单实用,也不过分严格
其次要选择静态代码工具,没有SonarQube的话用QAPlug是很好的选择,有的话装个Sonarlint插件就可以了
代码覆盖率通过idea自带的即可

有些人可能很排斥规范,总感觉条条框框太多,不符合自己的自由风格,但是软件不是开发完上线就结束的过程,而是需要持续迭代维护升级的过程,新人会接手,要有可读性可维护性。项目大了,人多了也是需要规范化才能更好的融合协作,让混乱变得有序
一个人的优秀靠的是经验,一个团队的优秀靠的是规范。
有了这些规范与工具,就可以大大的提高团队的整体素质与水平,尤其是大厂开发人员,这个是必须有的。

Best Wishes!

------ 本文结束 ------

版权声明

dawell's Notes by Dawell is licensed under a Creative Commons BY-NC-ND 4.0 International License.
Dawell创作并维护的dawell's Notes博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证
本文首发于dawell's Notes 博客( http://dawell.cc ),版权所有,侵权必究。

坚持原创技术分享,您的支持将鼓励我继续创作!