2013-10-28 87 views
2

我正嘗試在Java中編寫自定義PMD規則。 我創建了一個自定義的規則集,看起來像這樣:自定義Java PMD規則:無法找到類CustomRule

<?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; 
    } 
} 

這是我的項目結構月蝕:

PMD test project in Eclipse

我已經閱讀here這種錯誤似乎是類路徑錯誤。 在閱讀this之後,我將CustomRule.class放在項目的幾個目錄中,希望PMD能找到它。

我的問題是:我如何讓PMD執行我的CustomRule

回答

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選項嘗試,使其接受不同的位置,但沒有成功。

如果有人有一個不同的(最好更優雅)解決方案,請讓我/我們知道。

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

  • 你需要把包含Java規則類的jar PMD的提取二進制壓縮的lib文件夾下。(參見Matthias Braun的回答)