日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

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

瀏覽:170日期: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
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产日韩1区| 免费一级欧美在线观看视频| 99精品综合| 欧美日韩国产在线观看网站 | 亚洲美女久久| 日本亚洲三级在线| 国产日韩视频| 免费在线欧美黄色| 中文在线中文资源| 亚洲一区激情| 国产精品大片| 久久香蕉国产| 日韩一区二区三区精品| 里番精品3d一二三区| 91综合视频| 在线视频精品| 国产精品hd| 999精品色在线播放| 亚洲精品一二| 欧美日韩免费观看视频| 免费成人av在线播放| 久久亚洲精精品中文字幕| 亚洲欧美日韩高清在线| 日韩av网站免费在线| 日韩欧美午夜| 中文字幕中文字幕精品| 色欧美自拍视频| 亚洲综合精品| 精品一区91| 国产精品美女久久久浪潮软件| 国产探花在线精品| 亚洲午夜在线| 7m精品国产导航在线| 麻豆精品蜜桃| 欧美亚洲国产日韩| 欧美中文一区二区| 久久爱www成人| 丝袜美腿亚洲一区| 日韩欧美在线中字| 欧美日本三区| 亚洲一区欧美激情| 久久电影tv| 欧美日韩午夜电影网| 亚洲二区三区不卡| 国产精品国产三级国产在线观看| 蜜桃一区二区三区在线| 高清在线一区| 亚洲欧洲日韩精品在线| 91精品国产乱码久久久久久久| 欧美亚洲一区二区三区| 黄色亚洲免费| 日韩欧美一区免费| 美女视频网站久久| 日韩av一区二区在线影视| 亚洲女同中文字幕| 国产在线观看www| 国产欧美日韩一区二区三区四区 | 99日韩精品| 福利一区和二区| 日本精品久久| 亚洲作爱视频| 香蕉久久99| 国产成人精品一区二区免费看京| 日韩欧美中文字幕在线视频| 午夜国产欧美理论在线播放| 成人国产精品一区二区网站| 欧美亚洲tv| 亚洲3区在线| 视频一区视频二区中文| 亚洲高清毛片| 日韩综合在线| 久久av影院| 国产午夜精品一区在线观看| 综合国产精品| 午夜亚洲精品| 亚洲大全视频| 亚洲成人国产| 久久久久国产精品一区二区| а√天堂8资源中文在线| 久久尤物视频| 国产日韩欧美中文在线| 日韩一区二区三免费高清在线观看 | 国产精品久久久久av电视剧| 国产精品久久久亚洲一区| 午夜天堂精品久久久久| 免费人成精品欧美精品| 视频一区中文字幕国产| 久久亚洲精品伦理| 另类国产ts人妖高潮视频| aa亚洲婷婷| 蜜桃久久av| 蜜桃视频一区二区三区在线观看 | 国产伊人久久| 国模大尺度视频一区二区| 成人日韩av| 国产精品原创| 久久夜夜操妹子| 国产精品91一区二区三区| 99pao成人国产永久免费视频| 夜久久久久久| 亚洲免费专区| 国产欧美日韩一区二区三区在线| 91精品国产自产观看在线| 国产日韩一区二区三区在线| 日韩精选在线| 国产精品亚洲产品| 国产激情在线播放| 婷婷精品进入| 中文字幕乱码亚洲无线精品一区| 日精品一区二区三区| 国产亚洲精品美女久久久久久久久久| 国产精品videosex极品| 青青青免费在线视频| 在线日韩欧美| 亚洲乱亚洲高清| 国产精品手机在线播放| 日韩一区自拍| 99综合视频| 欧美一区自拍| 欧美黄页在线免费观看| 九九精品调教| 丝袜美腿一区二区三区| 欧美天堂一区| 日韩一区二区三区在线免费观看| 99在线|亚洲一区二区| 欧美日韩18| 日韩中文影院| 亚洲精品第一| 国产伦久视频在线观看| 手机精品视频在线观看| 精品理论电影在线| 国产精品普通话对白| 久久的色偷偷| 欧洲激情综合| 国产精品香蕉| 99久久99久久精品国产片果冰| 在线精品一区| 午夜av不卡| 欧美日一区二区在线观看| 亚洲成人二区| 国产精品亲子伦av一区二区三区| 亚洲五月婷婷| 国产一区 二区| 欧美精品一区二区三区精品| 国产日韩欧美高清免费| 久久人人97超碰国产公开结果| 日韩高清中文字幕一区| 久久久久久久久久久9不雅视频| 欧美天堂在线| 黄色成人精品网站| 高清av一区| 久久国产精品毛片| 久久精品毛片| 一区二区三区国产在线| 97精品在线| 亚洲精品福利| 久久人人88| 国产精品xvideos88| 国产毛片久久| av资源新版天堂在线| 日韩三级一区| 午夜国产一区二区| 精品视频在线你懂得| 日韩综合小视频| 欧美日韩国产高清| 九九久久国产| 日本不卡视频在线| 图片区亚洲欧美小说区| 九九九精品视频| 日韩激情av在线| 一本色道久久精品| 神马午夜久久| 国产精品99一区二区三区| 欧美一区成人| 一区二区91| 日韩视频不卡| 婷婷精品视频| 蜜桃视频在线网站| 久久亚州av| 综合激情在线| 欧美日韩1区| 亚洲深爱激情| 久久久久蜜桃| 成人在线黄色| 国产精品羞羞答答在线观看| 亚洲精品少妇| 美女黄网久久| 香蕉成人久久| 亚洲精品一区二区在线看| 欧美日韩精品免费观看视完整| 精品美女久久| 久久一区精品| 国产精品草草| 欧美亚洲综合视频| 日本成人精品| 伊人国产精品| 亚洲精品第一| 日韩欧美中文字幕一区二区三区| 在线一区二区三区视频| 蜜臀91精品一区二区三区|