自定义Java PMD规则:找不到CustomRule类

我正在尝试用Java编写自定义PMD规则。 我创建了一个自定义规则集,如下所示:

   My custom rules    Custom description  3   

我使用这个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放在CustomRule.class的几个目录中,希望PMD能够找到它。

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

我找到了一种方法:如果你将它放在一个jar子里并将那个jar放在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的classpath和-auxclasspath选项,使其接受不同的位置,但没有成功。

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

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

  • 您需要向规则集标记的第一个子项添加描述

    Avoid using 'while' statements without using curly braces

  • 实际运行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的回答)