java代码扫描工具比较_代码扫描工具的选型和Sonar最佳实践
目标
在编码阶段发现NNE空指针异常、IO流未正确关闭等致命性bug,杜绝此类“零容忍”线上异常的发生。
技术选型
关于代码扫描工具,比较主流的有Sonar、FindBugs、Alibaba Java Coding Guidelines、CheckStyle。
Alibaba Java Coding Guidelines最大的优点是全中文的提示,对国内开发人员相当友好,并且有阿里巴巴团队持续维护。但是经我亲测,无法检测出NNE等潜在bug,所以肯定是排除的。等后续提供了这方面的支持,会是不错的选择。
FindBugs功能完全够用,可以检查出NNE这样的错误,但是很可惜,idea的FindBugs插件最多支持到2018.1版本,看来新时代的我们也无福消受了。但是FindBugs似乎也有独立运行的版本,但是我大致看了一下,GUI界面比较复古风了,看了一下官网,最后一次更新是2015年3月了,这种已经停止维护的东西也不敢用啊
CheckStyle跟Alibaba Java Coding Guidelines有点类似,基本也是规范代码格式的,不能找出潜在bug,因此排除
Sonar大致分为idea插件版本的SonarLint和带有非常友好功能强大GUI的SonarQube代码质量平台,完全能满足我们的需求。并且Sonar提供了面向gitlab、jekins、maven的无缝对接支持,是当下最活跃热门的代码质量扫描工具。
综上所述,我们也只能选择Sonar了。
Sonar最佳实践
简单做法
最简单的做法就是,idea的plugins应用市场直接搜索SonarLint然后安装就可以了。然后直接鼠标右键选择Sonar扫描文件就可以看到结果了:
这种简单粗暴的问题有两个
Sonar的规则有一千多条,扫描出的问题严重性有Bugs、Vulnerabilities、Code Smells等几个级别,如果所有的问题都要改过去,效率就太低了,也难以执行,个人认为,除了Bugs级别的必须改掉之外,其他级别的问题不必强制性改掉,有追求的同学可以当作优化自己代码风格的手段。但是不幸的是,SonarLint的错误提示并没有按照错误等级分类过滤的选项,在茫茫问题条目中一个个找Bugs级别的问题,着实蛋疼。当然,也可以右键选择”disable rules“来直接去掉非Bugs等级的扫描规则,但也不够优雅。
这种方式全靠自觉,假设代码review的时候,需要把解决掉所有Bugs级别的问题,作为前置准备工作之一,那我们还得像第1点里面说的那样看有没有遗留的bugs级别问题。
推荐做法
第一步下载
自己去官网下一个SonarQube的安装包,这里面有个坑,官网上最新的LTS版本的SonarQube(目前是version-7.9.3)最低要求的Java版本是JDK11,我们现在普遍还是用的Java8,所以推荐大家去下载6.7.7版本的。值得一提的是,SonarLint插件也可选择把扫描结果同步到SonarQube平台上,但是两者的版本要对应好,否则无效(这真的很坑)。
我百度网盘准备了sonarqube-6.7.7的zip文件,链接: pan.baidu.com/s/1aFOTfX0j… 密码: 1n2c
第二步启动
下载完毕,解压后,进入到/sonarqube-6.7.7/bin下面,可以看到有所有通用的平台的启动文件
我的Mac,在macosx-universal-64文件位置,执行命令 sh sonar.sh start 就可以了,完全不用做其他任何操作,启动日志在/sonarqube-6.7.7/logs/sonar.log中,然后浏览器前往localhost:9000,成功后页面如下:
第三步初始化配置
点击右上角选择登陆,初始用户名密码都是admin,然后根据步骤配置token信息。
在项目根目录下面(其实可以在任意目录下面),执行命令
mvn clean install sonar:sonar -Dsonar.host.url=http://localhost:9000 -Dsonar.login=d7b53bc44cd108ee40b6691433bf70eb0a507b0b
复制代码
Dsonar.login后面替换成你自己的token就行了。
执行完后,再回到SonarQube平台,可以看到:
点击项目名字,然后再点击Bugs
如下图,我们的老朋友NNE也在其中了
我们改掉后,再重新执行一回命令,Bugs为0就OK啦。(sonar结合上下文跨方法判断的能力比较弱,如果确定不存在风险可以手动选择“Resolve as won't fix”)
当然,为了方便,也可以讲这条mvn命令配置为idea快捷启动项,如下:
如何实施
将Sonar扫描Bugs问题归零作为代码review前置准备的必要检查之一。
大团队可考虑:申请云服务器来部署Sonar,接入gitlab,每次提交的时候检查有无Bugs问题,如有,则发送钉钉告警信息。接入项目部署平台,将Bugs问题检查作为部署前置检查
java代码扫描工具比较_代码扫描工具的选型和Sonar最佳实践相关推荐
- wsdl2java 工具下载_利用wsdl2java工具生成webservice的客户端代码
1.JDK环境 2.下载apache-cxf发布包:http://cxf.apache.org/download.html 目前最新版本为3.2.6, 解压后如下: 解压发布包,设置CXF_HOME, ...
- c vscode 高亮,vscode设置代码字体颜色高亮_编程开发工具
vscode如何恢复默认设置_编程开发工具 vscode恢复默认设置的方法是:1.首先点击左下角,打开设置:2.然后点击右上角[{}]按钮:3.最后将右侧的用户设置json全部清空即可恢复默认设置. ...
- service 层 拼接的html 代码如何直接返回_代码分层的设计之道
分层思想,是应用系统最常见的一种架构模式,我们会将系统横向切割,根据业务职责划分.MVC 三层架构就是非常典型架构模式,划分的目的是规划软件系统的逻辑结构便于开发维护.MVC:英文即 Model-Vi ...
- devops 开源工具链_使用开源工具构建DevOps管道的初学者指南
devops 开源工具链 DevOps已成为修复缓慢,孤立或其他功能不正常的软件开发流程的默认答案. 但是,当您不熟悉DevOps并且不确定从哪里开始时,这并不意味着什么. 本文探讨了什么是DevOp ...
- java五子棋人机对战_实现简单的人机对战五子棋(实践)
五子棋人机对战实践项目 总的任务和目标 完成一个人机对战的五子棋项目,基本效果如下: 第一部分 Java绘图原理 1. 基本概念 像素,坐标 2. 组件自定义绘图原理 3. Graphic ...
- pb 判断sql 是否合法_宜信技术|《SQL优化最佳实践》作者带你重新了解SQL
一.SQL :一种熟悉又陌生的编程语言 这里有几个关键词:"熟悉"."陌生"."编程语言". 说它"熟悉",是因为它是D ...
- 基于python技术的自动化运维是干嘛的_《Python自动化运维 技术与最佳实践》.pdf...
[实例简介]Python自动化运维 技术与最佳实践 [刘天斯著][机械工业出版社][2014.12][291页].pdf [实例截图] [核心代码] 目 录 本书赞誉 前 言 第一部分 基础篇 第1章 ...
- 持续集成与持续部署实践_持续集成和部署的3个最佳实践
持续集成与持续部署实践 本文涵盖了三个关键主题:自动化CI / CD配置,将Git存储库用于常见的CI / CD工件以及对Jenkins管道进行参数设置. 术语 首先是第一件事: 让我们定义一些术语. ...
- 基于lis3dh的简易倾角仪c源码_开源网关apisix源码阅读和最佳实践
大家应该都接手过这种项目,前人找一个开源软件改一改,发上线. 我这里便曾经遇到过类似的问题. 随着需求的增加,各种维护人员东改改西改改,原来的开源项目被改的面目全非,再也无法和上游合并. 甚至TLS协 ...
最新文章
- 针对web服务器容灾自动切换方案
- oracle 查重复_日常答疑|MySQL删除重复数据踩过得坑
- Open vSwitch VLAN相关字段详解(dl_vlan、dl_vlan_pcp、vlan_vid、vlan_pcp、vlan_tci)
- android SDK manager 无法获取更新版本列表
- STM32 (Cortex-M3) 中NVIC(嵌套向量中断控制)的理解
- apache ignite_使用Apache Storm和Apache Ignite进行复杂事件处理(CEP)
- 作者:胡晓彦(1987-),女,中国科学院国家空间科学中心助理研究员
- 控件的WM_NOTIFY消息映射
- Alpha 冲刺 (1/10)
- 信息学奥赛一本通 1225:金银岛 | OpenJudge NOI 4.6 1797:金银岛
- Nginx之升级和构建后添加新的模块
- 关于VerifyRenderingInServerForm方法的思考(转)
- 祖国60岁生日,我在北京度过。
- java list api_Java核心API -- 6(Collection集合List、Set、ArrayList、HashSet)
- linux下c语言url请求
- (转)国内各家智能投顾比较
- 鸿蒙os开机时间,再见了安卓!华为鸿蒙OS 2.0正式登场,开机只需19秒
- 数据中台你想知道的都在这里!
- win10系统下如何打开bios如何打开Intel-VT-x教程
- Java8新特性之新时间API