PMD-Java代码静态分析工具使用
转载请申明,转载自【https://www.cnblogs.com/andy-songwei/p/11830812.html】,谢谢!
如今,使用代码分析工具来代替人工进行代码审查,已经是大势所趋了。用于Java代码检测的工具中,不乏许许多多的佼佼者,其中PMD就是其中一款。PMD既可以独立运行,也可以以命令行的形式运行,还可以作为插件在IDE中运行,本文将基于在Android Studio中的使用来介绍PMD的基本使用。
一、PMD简介
对于PMD名称含义,有个有趣的现象,PMD不存在一个准确的名称,在官网上你可以发现很有有趣的名称 ,比如:Pretty Much Done,Project Meets Deadline等。PMD是一款程序代码检查工具(可以支持多种语言,以Java为例),通过静态分析Java源文件来获知代码错误,也就是说在不运行不编译Java程序的情况下直接扫描Java源文件,报告错误 。该软件功能强大,扫描效率高,是Java程序员debug的好帮手。它附带了许多可以直接使用的规则,利用这些规则可以找出Java源程序的许多问题,比如:
- 可能的 Bugs:检查潜在代码错误,如空 try/catch/finally/switch 语句
- 未使用代码(Dead code):检查未使用的变量,参数,方法
- 复杂的表达式:检查不必要的 if 语句,可被 while 替代的 for 循环
- 重复的代码:检查重复的代码
- 循环体创建新对象:检查在循环体内实例化新对象
- 资源关闭:检查 Connect,Result,Statement 等资源使用之后是否被关闭掉
用户还可以自己定义规则,检查Java代码是否符合某些特定的编码规范。例如,你可以编写一个规则,要求PMD找出所有创建Thread对象的操作。
PMD支持的编辑器包括:JDeveloper、Eclipse、JEdit、JBuilder、BlueJ、CodeGuide、NetBeans/Sun Java Studio Enterprise/Creator、IntelliJ IDEA(Android Studio是基于此编辑器)、TextPad、Maven、Ant、Gel、JCreator和Emacs。
二、PMD的安装
通过File > Settings > Plugins > Browse repositories 搜索 “PMD”,找到“PMDPlugin”这一项,按照提示进行安装,然后重启即可。
三、使用PMD检测代码
1、启动PMD检测功能
(1)从Tools菜单中启动
通过Tools > Run PMD可以看到如下的界面。从运行结果来看,如果通过该方式启动,扫描的范围就是整个个项目中的文件了。
Pre Defined:表示预定义的规则,也就是该插件自带的检测规则。后面展开的列表中列处了所有的规则列表,想扫描哪一种类型的问题,点击即可。其中“All”表示使用所有的规则。
Custom Rules:自定的检测规则。该插件允许用户根据自己的需要自定义检查规则,默认这里是不可点击的,需要在设置中导入自定义规则文件后方可选择。
(2)从右键菜单中启动
在文件或者编辑器中点击右键,也可以看到“Run PMD”选项,和从“Tools”菜单中启动一样,这里不赘述了。通过该方式启动, 检测范围取决于鼠标或光标当前所选中的区域。
2、运行结果
运行后会出现如下面板:
左边工具栏,鼠标停留在上面会提示其功能,比较简单就不啰嗦了。右边显示了检测结果,这里显示的结果类别取决于我们运行的时候在“Pre Defined”中选择的规则类型,因为前面选择的“All”,所以所有的规则都显示了。当点击具体某一问题项时,会跳转到对应的源码中。
四、配置检测规则
通过File > Settings > Other Settings > PMD可以打开检测规则的设置界面:
在“RuleSets(规则设置)”界面可以管理自定义的检测规则。因为在实际工作中,可能有些团队需要根据实际情况自定义检测规则,就可以通过这里导入。如果要使用它,需要在启动PMD进行检测时选择该自定义规则。
点击“Options”选项卡,在其中可以配置一些检测规则选项
其中重点需要留意的是“Skip TestSource”这一项,因为在项目中有不少Android Studio自动生成的测试代码,如下所示,选择上述选项后可以将其过滤掉。
五、PMD的高级使用
本文主要介绍PMD的基本使用,同时限于笔者的水平有限,这里仅简单介绍一下它的高级使用。
PMD功能非常强大,仅仅是针对Java的检测就附带了让人众多的规则,这里提供一份《PMD插件分析代码规则(中文).xls》文档,有兴趣的可以下载深入了解:
链接:https://pan.baidu.com/s/189OTD_k-RbEX4ABJbAMlIg
提取码:90f4
对于自定义规则,这里提供一个自定义模板(pmd_custom_rule.xml,可以直接导入使用),可以通过这个模板学习一下PMD的规则定义:
<?xml version="1.0"?>
<ruleset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="Android Application Rules"
xmlns="http://pmd.sf.net/ruleset/1.0.0"
xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd"
xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd"> <description>Custom ruleset for ribot Android application</description> <exclude-pattern>.*/R.java</exclude-pattern>
<exclude-pattern>.*/gen/.*</exclude-pattern> <rule ref="rulesets/java/android.xml" />
<rule ref="rulesets/java/clone.xml" />
<rule ref="rulesets/java/finalizers.xml" />
<rule ref="rulesets/java/imports.xml">
<!-- Espresso is designed this way !-->
<exclude name="TooManyStaticImports" />
</rule>
<rule ref="rulesets/java/logging-java.xml">
<!-- This rule wasn't working properly and given errors in every var call info -->
<exclude name="GuardLogStatementJavaUtil" />
</rule>
<rule ref="rulesets/java/braces.xml">
<!-- We allow single line if's without braces -->
<exclude name="IfStmtsMustUseBraces" />
</rule>
<rule ref="rulesets/java/strings.xml" >
<!-- Exclude because causes problems with SQL Strings that usually require duplication -->
<exclude name="AvoidDuplicateLiterals"/>
</rule>
<rule ref="rulesets/java/basic.xml" />
<rule ref="rulesets/java/naming.xml">
<exclude name="AbstractNaming" />
<exclude name="LongVariable" />
<exclude name="ShortMethodName" />
<exclude name="ShortVariable" />
<exclude name="ShortClassName" />
<exclude name="VariableNamingConventions" />
</rule>
</ruleset>
友情链接:
PMD Java rules官方文档介绍:https://pmd.github.io/pmd-6.19.0/pmd_rules_java.html
PMD 官网:https://pmd.github.io
PMD-Java代码静态分析工具使用的更多相关文章
- java代码静态分析工具
需求:有些基础类型的遍历,值希望它被赋予指定的几个值,赋予其他值能够别编译器(IDEA/eclipse)提醒 Android studu结合自己的插件,引入 <!-- https://mvnre ...
- C/C++代码静态分析工具调研
C/C++代码静态分析工具调研 摘自:https://www.jianshu.com/p/92886d979401 简述 静态分析(static analysis)是指在不执行代码的情况下对其进行分析 ...
- 代码静态分析工具PC-LINT安装配置
代码静态分析工具PC-LINT安装配置--step by step 作者:ehui928 ...
- Java代码混淆工具ProGuard
目录 Java代码混淆工具ProGuard 简介 描述 作用的环境 功能 工作原理 下载 使用时注意事项 版本问题 JDK位数问题 Java的字节码验证问题 关于使用类似于Hibernate的对象关系 ...
- eclipse Java代码折叠工具
eclipse Java代码折叠工具 CreateTime--2018年5月17日15点09分 Author:Marydon 1.问题描述 eclipse自带的代码折叠工具,无法折叠try{}ca ...
- C++ 代码静态分析工具cppcheck【转】
转自:http://blog.csdn.net/chen19870707/article/details/42393217 权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] c ...
- 代码静态分析工具-splint的学习与使用[转]
代码静态分析工具--splint的学习与使用[转] 引言 最近在项目中使用了静态程序分析工具PC-Lint,体会到它在项目实施中带给开发人员的方便.PC-Lint是一款针对C/C++语言.window ...
- PHP代码静态分析工具PHPStan
最近发现自己写的PHP代码运行结果总跟自己预想的不一样,排查时发现大多是语法错误,在运行之前错误已经种下.可能是自己粗心大意,或者说php -l检测太简单,不过的确是有一些语法错误埋藏得太深(毕竟PH ...
- 代码静态分析工具--PMD,Findbugs,CheckStyle
最近学习Mybatis的官方文档,看到了[项目文档]一节有很多内容没有见过,做个笔记,理解一下. PMD 扫描Java源代码,查找潜在的问题,如: 可能的bugs,如空的try/catch/final ...
随机推荐
- 【实战】 elasticsearch 写入速度提升的案例分享
文章首发投稿至InfoQ,[侠梦的开发笔记]公众号,欢迎关注 https://www.infoq.cn/article/t7b52mbzxqkwrrdpVqD2 基本配置 基本配置,5台配置为 24C ...
- linux下安装配置go语言环境
1,golang中国下载go源码 http://www.golangtc.com/download 请对应系统版本号,linux-amd64.tar.gz为64位系统(推荐) ,linux-386 ...
- 【CPU】解决打开360或者Chrome浏览器CPU占用过高
cmd 运行: RD /s /q "%USERPROFILE%\AppData\Roaming\Microsoft\Protect"
- B-线性代数-距离公式汇总
目录 距离公式汇总 一.欧式距离 二.曼哈顿距离 三.闵可夫斯基距离(Minkowski distance) 更新.更全的<机器学习>的更新网站,更有python.go.数据结构与算法.爬 ...
- 洛谷 1552 [APIO2012]派遣
题目背景 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿. 题目描述 在这个帮派里,有一名忍者被称之为Master.除了Master以外,每名忍者都有且仅有一个上级.为保密 ...
- 一个神秘现象引发对beego框架的思考
小强最近在项目中遇到了一个很奇怪的问题:在整改日志规范时,为了避免影响现有的代码结构以及改动尽可能小的前提下,在调用记日志的SDK处将某一个字段值首字母改为大写,代码示例如下: fmt.Println ...
- 支撑微博亿级社交平台,小白也能玩转Redis集群(原理篇)
Redis作为一款性能优异的内存数据库,支撑着微博亿级社交平台,也成为很多互联网公司的标配.这里将以Redis Cluster集群为核心,基于最新的Redis5版本,从原理再到实战,玩转Redis集群 ...
- 怎么将ETL技术落地
ETL概述 ETL(Extraction-Transformation-Loading)是将业务系统的数据经过抽取.清洗转换之后加载到数据仓库的过程,目的是将企业中的分散.零乱.标准不统一的数据整合到 ...
- insert增数据详解
查看表结构: desc 表名; describe的缩写,意为描述 增加数据不会改变表的结构,只是增加了行. 创建一张表: mysql> create table class( -> id ...
- Windows系统调用中API的3环部分(依据分析重写ReadProcessMemory函数)
Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html Windows系统调用中API的3环部分 一.R3环API分析的重 ...