当前位置: 首页 > 知识库问答 >
问题:

自定义Java PMD规则:找不到CustomRule类

郁高韵
2023-03-14

我正在尝试用Java编写自定义PMD规则。我创建了一个自定义规则集,如下所示:

<?xml version="1.0"?>
<ruleset name="Custom Ruleset" 
    xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 http://pmd.sourceforge.net/ruleset_2_0_0.xsd">

    <description>
        My custom rules
    </description>
    <rule name="CustomRule"
        message="Custom message"
        class="mwe.CustomRule">
        <description>
            Custom description
        </description>
        <priority>3</priority>
    </rule>

</ruleset>

我调用pmd。bat使用这个Java类:

package mwe;

import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;

public class PmdStarter {

    public static void main(String[] args) {
        callPmd();
    }

    public static void callPmd() {
        String pmdPath = "pmd-src-5.0.5/bin/pmd.bat";
        String checkThisCode = "checkThisCode/";
        String customRuleSet = "pmd-src-5.0.5/src/main/resources/rulesets/java/customRules.xml";
        String[] command = { pmdPath, "-dir", checkThisCode, "-rulesets",
                customRuleSet };

        ProcessBuilder pb = new ProcessBuilder(command);

        try {
            InputStream is = pb.start().getInputStream();
            String output = convertStreamToString(is);
            is.close();
            System.out.println(output);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    static String convertStreamToString(InputStream is) {
        Scanner s = new Scanner(is);
        s.useDelimiter("\\A");
        String streamContent = s.hasNext() ? s.next() : "";
        s.close();
        return streamContent;
    }
}

不幸的是,找不到我用Java编写的自定义规则;这是来自PmdStarter的消息:

找不到mwe的班级。习惯规则

这是我的(最小)自定义规则:

package mwe;

import net.sourceforge.pmd.lang.java.ast.ASTWhileStatement;
import net.sourceforge.pmd.lang.java.rule.AbstractJavaRule;

public class CustomRule extends AbstractJavaRule {

    public Object visit(ASTWhileStatement node, Object data) {
        System.out.println("Hello PMD");
        return data;
    }
}

这是我在Eclipse中的项目结构:

我在这里读到,这种错误似乎是类路径错误。读完这篇文章后,我把CustomRule.class放在项目中的几个目录中,希望PMD能找到它。

我的问题是:如何让PMD执行我的CustomRule

共有2个答案

仲君昊
2023-03-14

顺便说一句,对于其他有问题的人,它看起来像下面的说明http://pmd.sourceforge.net/snapshot/customizing/howtowritearule.html都过时了。

>

  • 您需要添加一个描述到规则集标签的第一个子元素

    <代码>

    实际运行pmd的语法似乎已经改变,例如。

    /跑sh pmd-d/home/markus/project/src/de/-f xml-R/home/markus/project/myrules。xml

    • 你需要把包含java规则类的jar放在提取的PMD二进制zip的lib文件夹下。(见马蒂亚斯·布劳恩的回答)

  • 阴英武
    2023-03-14

    我找到了一个方法:如果你把它放在一个jar中,然后把它放在pmd-src-5.0.5\lib中,PMD会找到你的规则。

    这是我用来让PMD访问我的规则的shell命令(我的规则在包mwe中)。请注意,这是从我的项目bin文件夹发出的:

    C:\Users\me\dev\CodeCheckerMWE\bin>jar -cf ..\pmd-src-5.0.5\lib\myrules.jar mwe
    

    我已经尝试了类路径和PMD的-auxclasspath选项,使其能够接受不同的位置,但没有成功。

    如果有人对此有不同的(最好是更优雅的)解决方案,请让我/我们知道。

     类似资料:
    • 自定义中间有突起的UITabBar,demo中高仿了gogobot app底部不规则的TabBar。 [Code4App.com]

    • 授人以鱼,不如授人以渔。Dism++的能力是有限的,无法覆盖的所有用户的需求。因此给程序添加了自定义规则功能,方便高级用户打造自己的专属工具。 创建一个空白的自定义规则文件 我们只需要在Config目录新建一个 Custom*.xml 这样形式的xml文件即可(*表示任何字符串,比如Custom1.xml或者Custom我爱我的家.xml,另外文件以UTF8或者Unicode编码保存)。初始文件内

    • 我安装了,并在我的eslint配置文件中这样设置: 我一直收到这样的错误消息:

    • 我花了一天的时间将所有PMD和Checkstyle规则迁移到新的Squid规则,因为PMD/Checkstyle规则被标记为不推荐使用。 规则:BadConstantName_S00115_Check/S00115 我们所有的枚举都是用camelCase而不是CONSTANT_NAME实现的,例如: 比: 规则:MethodCyclomatic复杂性 迁移后,该规则报告所有equals和hashc

    • 部署自定义规则(如https://github.com/sonarsource/sonar-java/blob/master/java-checks/src/main/java/org/sonar/java/checks/useLessimportcheck.java)后,启动Sonarqube4.2时,在sonar启动期间引发以下异常: 上面提到的类应该在sslr-core-1.19.2.jar

    • 我试图在SonarQube上运行我的自定义PMD规则,但到目前为止,没有成功。 我创建了一个从sonar-pmd-plugin扩展的插件。在这个插件中,我有我的PMD规则集文件(custom_rules.xml)、一个声纳规则文件(pmd-extensions.xml)和我的自定义规则的Java类。 SonarQube识别了我的规则,我已经在默认的质量配置文件中启用了它们。最后,当我在给定的项目上