自定义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中的项目结构:
我在这里读到这种错误似乎是一个类路径错误。 阅读完之后,我将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的回答)