簡體   English   中英

自定義Java PMD規則:找不到類CustomRule

[英]Custom Java PMD rule: Can't find the class CustomRule

我正在嘗試用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中的項目結構:

Eclipse中的PMD測試項目

我在這里已經讀到這種錯誤似乎是類路徑錯誤。 閱讀此內容后,我將CustomRule.class放置在項目中的幾個目錄中,希望白白地讓PMD找到它。

我的問題是:如何使PMD執行我的CustomRule

我找到了一種方法:如果將規則放在jar中並將該jar放在pmd-src-5.0.5\\lib PMD會找到您的規則。

這是我用來使PMD可以訪問我的規則的shell命令(我的規則在package mwe )。 請注意,這是從我的項目bin文件夾發出的:

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

我已經嘗試使用PMD的classpath和-auxclasspath選項使它接受不同的位置,但是沒有成功。

如果有人對此有不同的解決方案(最好是更優雅),請讓我/我們知道。

順便說一句,對於其他任何有問題的人,看起來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的回答)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM