PMD使用与代码质量

2023-10-27

 

最近项目组要求使用PMD工具,通过自定义规则来检查代码,接录部分文档内容如下:

PMD介绍

PMD是一种开源分析Java代码错误的工具。与其他分析工具不同的是,PMD通过静态分析获知代码错误。也就是说,在不运行Java程序的情况下报告错误。PMD附带了许多可以直接使用的规则,利用这些规则可以找出Java源程序的许多问题,例如:

® 潜在的bug:空的try/catch/finally/switch语句

® 未使用的代码:未使用的局部变量、参数、私有方法等

® 可选的代码:String/StringBuffer的滥用

® 复杂的表达式:不必须的if语句、可以使用while循环完成的for循环

® 重复的代码:拷贝/粘贴代码意味着拷贝/粘贴bugs

® 循环体创建新对象:尽量不要再forwhile循环体内实例化一个新对象

@ 资源关闭:ConnectResultStatement等使用之后确保关闭掉

此外,用户还可以自己定义规则,检查Java代码是否符合某些特定的编码规范。例如,你可以编写一个规则,要求PMD找出所有创建ThreadSocket对象的操作。

安装并从命令行运行PMD

你可以从PMD的网站下载PMD的二进制版本,或下载带源代码的版本,下载得到的都是ZIP文件。假设你下载了二进制版本,先把它解压缩到任意一个目录。接下来怎么做,就要看你准备怎么用它——最简单的,如果要在一个Java源代码目录中运行PMD,只需直接在命令行上运行下面的命令:

E:SoftWarepmd-bin-4.2.1pmd-4.2.1bin>java -jar ..libpmd-4.2.1.jar D:ebsser

viceebsservicesrc text rulesets/unusedcode.xml

输出结果类如:

D:ebsserviceebsservicesrccomsinosoftservicepolicyebsSMPolicyInput.java:

51Avoid unused private fields such as 'logger'.

D:ebsserviceebsservicesrccomsinosoftservicepolicyebsSMPolicyShow.java:2

5Avoid unused private fields such as 'logger'.

D:ebsserviceebsservicesrccomsinosoftservicepolicyebsSMQueryPolicyByPoli

cyNo.java:32Avoid unused local variables such as 'visaStatus'.

D:ebsserviceebsservicesrccomsinosoftservicepolicyebsSMQueryPolicyByPoli

cyNo.java:44Avoid unused local variables such as 'temp'.

D:ebsserviceebsservicesrccomsinosoftservicepolicyebseriskESMPolicyInpu

t.java:28Avoid unused private fields such as 'logger'.

D:ebsserviceebsservicesrccomsinosoftservicepolicyebsjriskJSMPolicyInpu

t.java:22Avoid unused private fields such as 'logger'.

一些可以加载必须参数前面或者后面的可选参数如下:

-debug: 打印debug日志信息

-targetjdk: 指定目标源代码的版本- 1.3, 1.4, 1.5, 1.6 or 1.7;

默认是1.5

-cpus: 指定创建的线程数

-encoding: 指定PMD检查的代码的编码方式

-excludemarker: 指定PMD需要忽略的行的标记,默认为NOPMD

-shortnames: 在报告中显示缩短的文件名

-linkprefix: HTML源文件的路径,只是为了HTML显示

-lineprefix: 自定义的锚,用于影响源文件中的行,只是用于HTML显示

-minimumpriority: 规则的优先级限制,低于优先级的规则将不被使用

-nojava: 不检查java文件,默认是检查java文件

-jsp: 检查JSP/JSF文件,默认不检查

-reportfile: 将报告输出到文件,默认是打印在控制台

-benchmark: 输出一个基准清单,默认输出到控制台

-xslt: 覆盖默认的xslt

-auxclasspath: 指定源代码文件使用的类路径

例如在windows系统中,例子如下:

c:> java -jar pmd-4.2.1.jar c:mysourcecode text unusedcode,imports -targetjd

k 1.5 -debug

c:> java -jar pmd-4.2.1.jar c:mysourcecode xml basic,design -encoding UTF-8

c:> java -jar pmd-4.2.1.jar c:mysourcecode html typeresolution -auxclasspath

commons-collections.jar;derby.jar

Eclipse安装PMD插件运行方式

PMD可以作为插件集成到很多流行IDE中,很多的插件中都包含了PMDjar文件,这个jar文件中包含了规则集。所以虽然一些插件中使用rulesets/unusedcode.xml来作为参数引用规则集,但是实际上是使用getResourceAsStream()方法来从PMDjar文件中加载。

由于Eclipse是比较流行的开源Java/J2EE开发IDE,所以本文主要介绍如何在Eclipse中使用PMD工具进行代码的检查

安装基于Eclipse IDE的插件

安装EclipsePMD插件的过程如下:

® 启动Eclipse

® 选择Help-->Software Updates-->Find and Install

® 选择Next,选择New remote site

® Name框中输入PMDURL框中输入http://pmd.sf.net/eclipse

® 在之后的对话框中一直点击下一步或者接受协议,完成EclipsePMD插件的安装

也可以通过下载最新zip文件按,然后执行上述过程,只是使用New locale site来代替New remote site,并使用下载的zip文件。

可以通过Windows-->Preferences来配置PMD

通过右键一个项目,然后选择PMD-->Check node with PMD,即可使用PMD工具检查代码。如果要进行重复代码检测,那么右键一个项目后,选择PMD-->Find suspect cut and paste。检查结果会放在reports目录下,文件名为cpd-report.txt

可以通过使用Eclipse的帮助系统来查看PMD插件的文档。

在安装完更新后,如果发生了一个异常,例如”java.lang.RuntimeException: Could not find that class xxxx”,这时试着删除workspace中的.metadata/plugins/net.sourceforge.pmd.eclipse目录下的ruleset.xml文件。

使用PMD

1、启动Eclipse IDE,打开工程,选择 "Windows"->"Preferences"下的PMD项,其中Rules Configuration 项目可以配置PMD的检查规则,自定义检查规则也可以在此通过Import的方式导入到PMD

2、配置好后,鼠标右键点击工程中需要检查的JavaSource,选择"PMD"->"Check Code With PMD" ,之后PMD就会通过规则检查你的JavaSource了并且将信息显示在PMD自己的视图上

3、示例

import java.util.*;

public class Test {

public static void main(String[] args) {

try{

if(true) {}

System.out.println("Hello World!");

} catch(Exception e) {

}

}

}

以上代码PMD会检查出:catch块中没有内容、if判断块中没有内容、代码中出现System.out.println等警告描述


DM

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PMD使用与代码质量 的相关文章

随机推荐

  • C++入门练习题[1]:KiKi定义电子日历类

    最近在看C 入门的书籍 但是光看是不够的 需要一些练习将知识运用起来 牛客网上面有在线编程的题目 我选择了一些入门的题目作为练习 1 题目 这道题的题目如下 2 解题 题目是非常简单的 但是因为只是看过了一遍知识点 没有动手实践 所以看起来
  • [Python系列-7]:Python之人工智能 - 基本工具 -1- Time库

    作者主页 文火冰糖的硅基工坊 https blog csdn net HiWangWenBing 本文网址 https blog csdn net HiWangWenBing article details 119253059 目录 1 什
  • 瑞吉外卖【后台管理系统篇】

    瑞吉外卖 一 软件开发整体介绍 1 软件开发流程 2 角色分工 3 软件环境 二 瑞吉外卖项目介绍 1 项目介绍 2 技术选型 3 功能架构 三 开发环境搭建 1 数据库环境搭建 2 maven项目搭建 四 后台功能开发 1 员工管理 1
  • Matlab中条件语句-if, elseif, else使用

    目录 语法 说明 示例 使用 if elseif 和 else 指定条件 比较数组 测试数组的相等性 比较字符向量 测试值的不相等性 评估表达式中的多个条件 if elseif else是条件为 true 时执行语句 语法 if expre
  • java数组为什么可以迭代吗_另一个“只能迭代数组或java.lang.Iterable实例”的问题...

    我有这段代码返回java lang iterable错误 我知道我在哪里出错 但是我不知道该如何解决 这是代码 public class ManagementServiceHandler implements ManagementServi
  • opencv3/C++ 机器学习-决策树/DTrees

    决策树 Decision Tree 决策树 Decision Tree是一棵二叉树 每棵非叶子节点有两个子节点的树 可用于分类或回归问题 对于分类问题 形成分类树 每个叶节点都标有一个类标签 多个叶节点可能具有相同的标签 对于回归问题 形成
  • 数据库题目:用“连接查询”查找和problem_id为 1009 的题目属于同一个比赛的题目信息,结果按problem_id升序排序。

    目录 Q 查找和problem id为 1009 的题目属于同一个比赛的题目信息 结果按problem id升序排序 1 problem为题目表 problem表如下图 仅显示前几条 编辑 2 contest problem为比赛 题目关系
  • 在程序运行中,页表是动态的还是静态的?

    最近在学习操作系统相关知识 在学习虚拟内存技术时产生了一个疑问 操作系统会在进程需要的时候将位于硬盘的数据页换入到物理内存中 在物理内存不够用的情况下会发生页面置换 而置换的物理内存页面应该是随机的 换出未来一段时间不太可能使用的页面 这个
  • 共享虚拟主机和服务器,独享和共享虚拟主机区别

    独享和共享 独享虚拟主机 是指独享一部分服务器资源的虚拟主机 比如独享CPU 独享内存 独享带宽等 共享虚拟主机 是我们常见的普通虚拟主机 服务器资源 大家共享 包括CPU 内存 带宽等 独享虚拟主机由于独享资源 因此在使用时 更稳定 而共
  • ssm sqlSessionFactory创建失败

    Caused by org springframework beans factory BeanCreationException Error creating bean with name sqlSessionFactory define
  • 【数据结构-图】1.图的构造和遍历(基本理论+代码)

    一 图的基本概念 图 图G是一个有序二元组 V E 其中V称为顶集 Vertices Set E称为边集 Edges set E与V不相交 它们亦可写成V G 和E G 其中 顶集的元素被称为顶点 Vertex 边集的元素被称为边 edge
  • PI-撒币算法

    首先构造一个单位正方形和一个四分之一圆 然后假设你有一堆硬币 你开始随机对上述构造的正方形 撒币 当然这个硬币可能在圆里 也可能在圆外 只要你的硬币够多 那么你的硬币将构成1 4圆 通过计数其中落入内切圆的硬币的个数 有 如果一共投入a个硬
  • 【微信小程序】创建自定义组件

    文档地址 Component Object object 微信开放文档 视频地址 4 14 自定义组件Component的用法 哔哩哔哩 bilibili 基础 1 右键 gt 创建component文件夹 gt 创建component文件
  • conda虚拟环境安装pytorch+tensorboardX可视化工具

    安装要求 pytorch没有tensorflow那样具有tensorboard可视化工具 在pytorch中想要进行可视化可以调用tensorboardX 具体的调用与tensorboard类似 因此需要的安装包如下 1 pytorch 1
  • 蓝桥杯2022年第十三届JAVA B组省赛真题-最大子矩阵

    这题应该有更简单的方法做 本人太懒 直接暴力线段树 优先队列了 刚好卡时间过 include
  • DSP-滤波器稳定性与极点 &数字滤波器&TMS320C67XX dsp启动过程

    DSP技术 https www cnblogs com kanite category 1318278 html 滤波器稳定性与极点 在数字信号处理种 系统的稳定性是一个很重要的问题 比如说在滤波器的设计种 都要求系统必须稳定 否则是无法实
  • SparkCore

    第1章 RDD概述 1 1 什么是RDD RDD Resilient Distributed Dataset 叫做弹性分布式数据集 是Spark中最基本的数据抽象 代码中是一个抽象类 它代表一个弹性的 不可变 可分区 里面的元素可并行计算的
  • Linux环境开发工具(2)gdb调试工具+Makefile自动化构建工具

    Linux环境开发工具 2 gdb调试工具 Makefile自动化构建工具 Linux编译器 gcc g 使用 程序编译过程 重要概念 函数库 静态库与动态库 gcc选项 gdb使用 具体命令 Makefile 工具 使用过程 项目清理 关
  • 数字藏品是什么?

    有人说 任何东西都可以成为数字藏品 数字藏品是指通过区块链技术生成具有独特身份凭证的数字作品或艺术品 可以通过数字图片 音乐 视频 3D模型 电子门票 数字纪念品等形式进行展示 阿里巴巴 腾讯 京东 百度等互联网公司都推出了数字藏品平台或产
  • PMD使用与代码质量

    最近项目组要求使用PMD工具 通过自定义规则来检查代码 接录部分文档内容如下 PMD介绍 PMD是一种开源分析Java代码错误的工具 与其他分析工具不同的是 PMD通过静态分析获知代码错误 也就是说 在不运行Java程序的情况下报告错误 P