电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Java 代碼檢查工具之PMD入門使用詳細教程

瀏覽:86日期:2022-08-15 11:17:45
介紹

PMD是一個靜態源代碼分析器。它發現了常見的編程缺陷,如未使用的變量、空捕獲塊、不必要的對象創建等等。

官網:點這里官方文檔:點這里

使用方式1、使用插件的方式

下載:File -> Settings -> Plugins -> Marketplace 搜索 “PMDPlugin” ,下載插件。

使用方法:在代碼編輯框或Project 窗口的文件夾、包、文件右鍵,選擇“Run PMD”->“Pre Defined”->“All”,對指定的文件夾、包、文件進行分析,分析結果在控制臺輸出。

2、maven項目引入依賴的方式

pom.xml:

<?xml version='1.0' encoding='UTF-8'?><project xmlns='http://maven.apache.org/POM/4.0.0' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:schemaLocation='http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd'> <modelVersion>4.0.0</modelVersion> <groupId>com.keafmd</groupId> <artifactId>pdm-test01</artifactId> <version>1.0-SNAPSHOT</version> <!--<dependencies> <dependency> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-pmd-plugin</artifactId> <version>3.14.0</version> <type>maven-plugin</type> </dependency> </dependencies>--> <!-- 用于生成錯誤到代碼內容的鏈接 --> <reporting> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-pmd-plugin</artifactId> <version>3.14.0</version> </plugin> </plugins> </reporting></project>

mvn 命令執行

在項目目錄打開cmd窗口,輸入以下命令:

mvn pmd:pmd

Java 代碼檢查工具之PMD入門使用詳細教程

分析結果為pmd.html文件,在項目的target下的site目錄下:

Java 代碼檢查工具之PMD入門使用詳細教程

Java 代碼檢查工具之PMD入門使用詳細教程

分析結果顯示內容:

Java 代碼檢查工具之PMD入門使用詳細教程

3、pmd 命令行的方式

pmd -d 源代碼路徑 -f xml(結果輸出格式) -r 結果保存所在目錄及名稱 -R rulesets/java/unusedcode.xml

例子:

Java 代碼檢查工具之PMD入門使用詳細教程

結果存放在制定文件目錄下,格式也為命令語句指定的:

Java 代碼檢查工具之PMD入門使用詳細教程

檢測結果內容:

Java 代碼檢查工具之PMD入門使用詳細教程

4、Java API的方式 *

官方文檔

需要先引入maven依賴

項目結構

Java 代碼檢查工具之PMD入門使用詳細教程

測試代碼

Test01:

package com.keafmd.test01;/** * Keafmd * * @ClassName: Test01 * @Description: 測試1 * @author: 牛哄哄的柯南 * @Date: 2021-03-15 15:29 * @Blog: https://keafmd.blog.csdn.net/ */public class Test01 { public static void main(String[] args) { int a =100; int b=29; String s ='abc'; System.out.println('hello!'); }}

Test02:

package com.keafmd.test02;/** * Keafmd * * @ClassName: Test02 * @Description: * @author: 牛哄哄的柯南 * @Date: 2021-03-15 15:30 * @Blog: https://keafmd.blog.csdn.net/ */public class Test02 { public static void main(String[] args) { boolean flag=true; while(flag){ flag=false; } System.out.println('123'); int a =100; int b=29; String s ='abc'; System.out.println('hello!'); }}pmdArgs方式

命令行接口的方式最簡單的方法是使用與命令行相同的接口調用PMD

Example :

package com.keafmd;import net.sourceforge.pmd.PMD;/** * Keafmd * * @ClassName: Example * @Description: * @author: 牛哄哄的柯南 * @Date: 2021-03-15 15:51 * @Blog: https://keafmd.blog.csdn.net/ */public class Example { public static void main(String[] args) { String[] pmdArgs = { '-d', 'D:/javaworkspace/pdm-test02/src', '-R', 'rulesets/java/quickstart.xml', '-f', 'xml', '-r', 'D:/pmdreport/pmd-report.xml' }; PMD.main(pmdArgs); }}PMDConfiguration方式

PmdExample:

package com.keafmd;import net.sourceforge.pmd.PMD;import net.sourceforge.pmd.PMDConfiguration;/** * Keafmd * * @ClassName: PmdExample * @Description: * @author: 牛哄哄的柯南 * @Date: 2021-03-15 15:57 * @Blog: https://keafmd.blog.csdn.net/ */public class PmdExample { public static void main(String[] args) { PMDConfiguration configuration = new PMDConfiguration(); configuration.setInputPaths('D:/javaworkspace/pdm-test/src'); configuration.setRuleSets('rulesets/java/quickstart.xml'); configuration.setReportFormat('html'); configuration.setReportFile('D:/pmdreport/pmd-report.html'); PMD.doPMD(configuration); }}Programmatically(拓展)

這使您能夠更好地控制處理哪些文件,但也會更加復雜。您還可以提供自己的偵聽器和呈現器。

1. 首先,我們創建一個PMDConfiguration。目前,這是指定規則集的唯一方法:

PMDConfiguration configuration = new PMDConfiguration();configuration.setMinimumPriority(RulePriority.MEDIUM);configuration.setRuleSets('rulesets/java/quickstart.xml');

2. 為了支持類型解析,PMD還需要訪問已編譯的類和依賴項。這被稱為“生長素路徑”,并且在這里也進行了配置。注意:您可以指定由:關于Unix系統或;在Windows下。

configuration.prependClasspath('/home/workspace/target/classes:/home/.m2/repository/my/dependency.jar');

3. 那我們需要一個規則工廠。這是使用配置創建的,同時考慮到最低優先級:

RuleSetFactory ruleSetFactory = RulesetsFactoryUtils.createFactory(configuration);

4. PMD操作于DataSource。您可以收集自己的列表FileDataSource.

List<DataSource> files = Arrays.asList(new FileDataSource(new File('/path/to/src/MyClass.java')));

5. 對于報告,您可以使用內置渲染器。XMLRenderer。注意,必須通過設置適當的Writer打電話start()。在pmd運行之后,您需要調用end()和flush()。那么你的作者應該收到所有的輸出。

StringWriter rendererOutput = new StringWriter();Renderer xmlRenderer = new XMLRenderer('UTF-8');xmlRenderer.setWriter(rendererOutput);xmlRenderer.start();

6. 創建一個RuleContext。這是上下文實例,在規則實現中是可用的。注意:當在多線程模式下運行時(這是默認的),規則上下文實例將被克隆到每個線程。

RuleContext ctx = new RuleContext();

7. 可以選擇注冊報表偵聽器。這樣你就可以對發現的違規行為立即做出反應。您也可以使用這樣的偵聽器來實現您自己的呈現器。偵聽器必須實現接口。ThreadSafeReportListener并且可以通過ctx.getReport().addListener(...).

ctx.getReport().addListener(new ThreadSafeReportListener() { public void ruleViolationAdded(RuleViolation ruleViolation) { } public void metricAdded(Metric metric) { }

8. 現在,所有的準備工作都完成了,PMD可以執行了。這是通過調用PMD.processFiles(...)。此方法調用接受配置、規則集工廠、要處理的文件、規則上下文和呈現器列表。如果不想使用任何渲染器,請提供一個空列表。注意:需要顯式關閉輔助路徑。否則,類或JAR文件可能會保持打開狀態,并且文件資源會泄漏。

try { PMD.processFiles(configuration, ruleSetFactory, files, ctx, Collections.singletonList(renderer));} finally { ClassLoader auxiliaryClassLoader = configuration.getClassLoader(); if (auxiliaryClassLoader instanceof ClasspathClassLoader) { ((ClasspathClassLoader) auxiliaryClassLoader).close(); }}

9. 呼叫后,您需要完成渲染器end()和flush()。然后,您可以檢查呈現的輸出。

renderer.end();renderer.flush();System.out.println('Rendered Report:');System.out.println(rendererOutput.toString());

下面是一個完整的例子:

import java.io.IOException;import java.io.StringWriter;import java.io.Writer;import java.nio.file.FileSystems;import java.nio.file.FileVisitResult;import java.nio.file.Files;import java.nio.file.Path;import java.nio.file.PathMatcher;import java.nio.file.SimpleFileVisitor;import java.nio.file.attribute.BasicFileAttributes;import java.util.ArrayList;import java.util.Collections;import java.util.List;import net.sourceforge.pmd.PMD;import net.sourceforge.pmd.PMDConfiguration;import net.sourceforge.pmd.RuleContext;import net.sourceforge.pmd.RulePriority;import net.sourceforge.pmd.RuleSetFactory;import net.sourceforge.pmd.RuleViolation;import net.sourceforge.pmd.RulesetsFactoryUtils;import net.sourceforge.pmd.ThreadSafeReportListener;import net.sourceforge.pmd.renderers.Renderer;import net.sourceforge.pmd.renderers.XMLRenderer;import net.sourceforge.pmd.stat.Metric;import net.sourceforge.pmd.util.ClasspathClassLoader;import net.sourceforge.pmd.util.datasource.DataSource;import net.sourceforge.pmd.util.datasource.FileDataSource;public class PmdExample2 { public static void main(String[] args) throws IOException { PMDConfiguration configuration = new PMDConfiguration(); configuration.setMinimumPriority(RulePriority.MEDIUM); configuration.setRuleSets('rulesets/java/quickstart.xml'); configuration.prependClasspath('/home/workspace/target/classes'); RuleSetFactory ruleSetFactory = RulesetsFactoryUtils.createFactory(configuration); List<DataSource> files = determineFiles('/home/workspace/src/main/java/code'); Writer rendererOutput = new StringWriter(); Renderer renderer = createRenderer(rendererOutput); renderer.start(); RuleContext ctx = new RuleContext(); ctx.getReport().addListener(createReportListener()); // alternative way to collect violations try { PMD.processFiles(configuration, ruleSetFactory, files, ctx, Collections.singletonList(renderer)); } finally { ClassLoader auxiliaryClassLoader = configuration.getClassLoader(); if (auxiliaryClassLoader instanceof ClasspathClassLoader) { ((ClasspathClassLoader) auxiliaryClassLoader).close(); } } renderer.end(); renderer.flush(); System.out.println('Rendered Report:'); System.out.println(rendererOutput.toString()); } private static ThreadSafeReportListener createReportListener() { return new ThreadSafeReportListener() { @Override public void ruleViolationAdded(RuleViolation ruleViolation) { System.out.printf('%-20s:%d %s%n', ruleViolation.getFilename(), ruleViolation.getBeginLine(), ruleViolation.getDescription()); } @Override public void metricAdded(Metric metric) { // ignored } }; } private static Renderer createRenderer(Writer writer) { XMLRenderer xml = new XMLRenderer('UTF-8'); xml.setWriter(writer); return xml; } private static List<DataSource> determineFiles(String basePath) throws IOException { Path dirPath = FileSystems.getDefault().getPath(basePath); PathMatcher matcher = FileSystems.getDefault().getPathMatcher('glob:*.java'); List<DataSource> files = new ArrayList<>(); Files.walkFileTree(dirPath, new SimpleFileVisitor<Path>() { @Override public FileVisitResult visitFile(Path path, BasicFileAttributes attrs) throws IOException { if (matcher.matches(path.getFileName())) { System.out.printf('Using %s%n', path); files.add(new FileDataSource(path.toFile())); } else { System.out.printf('Ignoring %s%n', path); } return super.visitFile(path, attrs); } }); System.out.printf('Analyzing %d files in %s%n', files.size(), basePath); return files; }}分析結果

分析結果會根據指定格式輸出在指定文件目錄下。

圖形界面檢測

D:MyFileToolpmd-bin-6.32.0bin 目錄下打開cmd窗口輸入:

cpdgui.bat

Java 代碼檢查工具之PMD入門使用詳細教程

自定義規則

Java 代碼檢查工具之PMD入門使用詳細教程

D:MyFileToolpmd-bin-6.32.0bin 目錄下打開cmd窗口輸入:

designer.bat

Java 代碼檢查工具之PMD入門使用詳細教程

自定義規則:不能有變量為keafmd的String類型的變量

String keafmd; //這樣就是不合法的。

Source:

public class KeepingItSerious { Delegator keafmd; // FieldDeclaration public void method() { String keafmd; // LocalVariableDeclaration }}

導出的自定義規則:

<rule name='myrule' language='java' message='不能有變量為keafmd的String類型的變量' class='net.sourceforge.pmd.lang.rule.XPathRule'> <description>自定義規則 </description> <priority>3</priority> <properties> <property name='version' value='2.0'/> <property name='xpath'> <value><![CDATA[//VariableDeclaratorId[@Image = 'keafmd' and ../../Type[@TypeImage = 'String']]]]> </value> </property> </properties></rule>

到此這篇關于Java 代碼檢查工具之PMD入門使用詳細教程的文章就介紹到這了,更多相關Java 代碼檢查工具PMD內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
主站蜘蛛池模板: 华中线缆有限公司-电缆厂|电缆厂家|电线电缆厂家 | 电梯乘运质量测试仪_电梯安全评估测试仪-武汉懿之刻 | 浇注料-高铝砖耐火砖-郑州凯瑞得窑炉耐火材料有限公司 | PO膜_灌浆膜及地膜供应厂家 - 青州市鲁谊塑料厂 | 首页_中夏易经起名网| 紫外可见光分光度计-紫外分光度计-分光光度仪-屹谱仪器制造(上海)有限公司 | 工业风机_环保空调_冷风机_工厂车间厂房通风降温设备旺成服务平台 | 精益专家 - 设备管理软件|HSE管理系统|设备管理系统|EHS安全管理系统 | 进口便携式天平,外校_十万分之一分析天平,奥豪斯工业台秤,V2000防水秤-重庆珂偌德科技有限公司(www.crdkj.com) | 纯化水设备-EDI-制药-实验室-二级反渗透-高纯水|超纯水设备 | 能耗监测系统-节能监测系统-能源管理系统-三水智能化 | 无线联网门锁|校园联网门锁|学校智能门锁|公租房智能门锁|保障房管理系统-KEENZY中科易安 | 千斤顶,液压千斤顶-力良企业,专业的液压千斤顶制造商,shliliang.com | 磁力加热搅拌器-多工位|大功率|数显恒温磁力搅拌器-司乐仪器官网 | 氧化锆纤维_1800度高温退火炉_1800度高温烧结炉-南京理工宇龙新材料股份有限公司 | 伸缩节_伸缩器_传力接头_伸缩接头_巩义市联通管道厂 | hdpe土工膜-防渗膜-复合土工膜-长丝土工布价格-厂家直销「恒阳新材料」-山东恒阳新材料有限公司 ETFE膜结构_PTFE膜结构_空间钢结构_膜结构_张拉膜_浙江萬豪空间结构集团有限公司 | 高压直流电源_特种变压器_变压器铁芯-希恩变压器定制厂家 | 膜片万向弹性联轴器-冲压铸造模具「沧州昌运模具」 | 合肥风管加工厂-安徽螺旋/不锈钢风管-通风管道加工厂家-安徽风之范 | 无轨电动平车_轨道平车_蓄电池电动平车★尽在新乡百特智能转运设备有限公司 | 全自动烧卖机厂家_饺子机_烧麦机价格_小笼汤包机_宁波江北阜欣食品机械有限公司 | 泰兴市热钻机械有限公司-热熔钻孔机-数控热熔钻-热熔钻孔攻牙一体机 | 水冷散热器_水冷电子散热器_大功率散热器_水冷板散热器厂家-河源市恒光辉散热器有限公司 | 挤出熔体泵_高温熔体泵_熔体出料泵_郑州海科熔体泵有限公司 | MOOG伺服阀维修,ATOS比例流量阀维修,伺服阀维修-上海纽顿液压设备有限公司 | 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 - 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 | 深圳昂为官网-气体分析仪,沼气分析仪,动态配气仪,气体传感器厂家 | 艾乐贝拉细胞研究中心 | 国家组织工程种子细胞库华南分库 | 并网柜,汇流箱,电控设备,中高低压开关柜,电气电力成套设备,PLC控制设备订制厂家,江苏昌伟业新能源科技有限公司 | 超声波分散机-均质机-萃取仪-超声波涂料分散设备-杭州精浩 | 合肥升降机-合肥升降货梯-安徽升降平台「厂家直销」-安徽鼎升自动化科技有限公司 | 长沙一级消防工程公司_智能化弱电_机电安装_亮化工程专业施工承包_湖南公共安全工程有限公司 | 塑料异型材_PVC异型材_封边条生产厂家_PC灯罩_防撞扶手_医院扶手价格_东莞市怡美塑胶制品有限公司 | 欧美日韩国产一区二区三区不_久久久久国产精品无码不卡_亚洲欧洲美洲无码精品AV_精品一区美女视频_日韩黄色性爱一级视频_日本五十路人妻斩_国产99视频免费精品是看4_亚洲中文字幕无码一二三四区_国产小萍萍挤奶喷奶水_亚洲另类精品无码在线一区 | 香蕉筛|直线|等厚|弧形|振动筛|香蕉筛厂家-洛阳隆中重工 | 蓝鹏测控平台 - 智慧车间系统 - 车间生产数据采集与分析系统 | 台式核磁共振仪,玻璃软化点测定仪,旋转高温粘度计,测温锥和测温块-上海麟文仪器 | 济南电缆桥架|山东桥架-济南航丰实业有限公司 | 一体化污水处理设备_生活污水处理设备_全自动加药装置厂家-明基环保 | 牛奶检测仪-乳成分分析仪-北京海谊 |