[英]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中的項目結構:
我在這里已經讀到這種錯誤似乎是類路徑錯誤。 閱讀此內容后,我將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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.