2

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.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ですか?

4

2 に答える 2

0

ところで、問題を抱えている他の人にとっては、http://pmd.sourceforge.net/snapshot/customizing/howtowritearule.htmlの指示が古くなっているようです。

  • ruleset タグの最初の子に説明を追加する必要があります

    <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

  • PMD のバイナリ zip を展開した lib フォルダーの下に、java ルール クラスを含む jar を配置する必要があります。(Matthias Braun からの回答を参照)
于 2015-12-31T19:28:20.717 に答える