【问题标题】:Custom Java PMD rule: Can't find the class CustomRule自定义 Java PMD 规则:找不到类 CustomRule
【发布时间】:2016-01-01 03:28:20
【问题描述】:

我正在尝试用 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>

我使用这个 Java 类调用pmd.bat

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.CustomRule

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

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 中的项目结构:

我读过here,这种错误似乎是类路径错误。 在阅读了this 之后,我将CustomRule.class 放在了项目中的几个目录中,希望 PMD 能够找到它,但这是徒劳的。

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

【问题讨论】:

    标签: java classpath pmd


    【解决方案1】:

    我找到了一种方法: 如果您将其放入罐子中并将该罐子放入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 选项使其接受不同的位置,但没有成功。

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

    【讨论】:

      【解决方案2】:

      顺便说一句,对于其他有问题的人,http://pmd.sourceforge.net/snapshot/customizing/howtowritearule.html 下的说明似乎已经过时了。

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

        <description> Avoid using 'while' statements without using curly braces </description>

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

      ./run.sh pmd -d /home/markus/project/src/de/ -f xml -R /home/markus/project/myrules.xml

      • 需要将包含java规则类的jar包放在PMD解压二进制zip的lib文件夹下。 (见 Matthias Braun 的回答)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-21
        • 1970-01-01
        • 2012-11-03
        • 1970-01-01
        • 2017-03-10
        • 1970-01-01
        • 2016-02-12
        • 1970-01-01
        相关资源
        最近更新 更多