我试图用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
?
答案 0 :(得分: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
选项,使其接受不同的位置,但没有成功。
如果有人对此有不同(最好更优雅)的解决方案,请告诉我/我们。
答案 1 :(得分:0)
顺便说一句,对于其他遇到问题的人来说,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