maven-pmd-plugin(カスタムルールセットその1)

前回は既存のルールセット群から任意のものを選択しました。しかし、それよりも細かい粒度でルールを設定したいことも少なくありません。そのため、今回は既存のルールセット群の中から任意のルールをピックアップする方法を考えてみます。

以下が前回の結果のXML(basic.xml)です。

<?xml version="1.0" encoding="UTF-8"?>
<pmd version="4.2.5"
     timestamp="2011-03-23T11:31:31.015">
  <file name="C:\minimal_pmd_env\src\main\java\Hoge.java">
    <violation beginline="6"
               endline="7"
               begincolumn="19"
               endcolumn="9"
               rule="EmptyIfStmt"
               ruleset="Basic Rules"
               class="Hoge"
               method="main"
               externalInfoUrl="http://pmd.sourceforge.net/rules/basic.html#EmptyIfStmt"
               priority="3">
      Avoid empty if statements
    </violation>
    <violation beginline="6"
               endline="6"
               begincolumn="13"
               endcolumn="16"
               rule="UnconditionalIfStatement"
               ruleset="Basic Rules"
               class="Hoge"
               method="main"
               externalInfoUrl="http://pmd.sourceforge.net/rules/basic.html#UnconditionalIfStatement"
               priority="3">
      Do not use if statements that are always true or always false
    </violation>
    <violation beginline="8"
               endline="9"
               begincolumn="14"
               endcolumn="9"
               rule="EmptyIfStmt"
               ruleset="Basic Rules"
               class="Hoge"
               method="main"
               externalInfoUrl="http://pmd.sourceforge.net/rules/basic.html#EmptyIfStmt"
               priority="3">
      Avoid empty if statements
    </violation>
  </file>
</pmd>

上記から、2か所が Basic Rules の EmptyIfStmt に違反し、1か所が UnconditionalIfStatement に違反していることがわかります。

今回のゴール

今回は、以下のルールのみチェックするようなカスタムルールセットを作成してみます。

  • Basic Rules の EmptyIfStmt
  • Import Statement Rules の DuplicateImports

カスタムルールセットの作成

カスタムのルールセットを作成します。名前は何でも構いませんが、今回は MyBasicRuleSet.xml とすることにします。

<?xml version="1.0"?>
<ruleset name="Custom ruleset"
    xmlns="http://pmd.sf.net/ruleset/1.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd"
    xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd">

  <description>Sample Custom Rule Set.</description>

  <!-- Here's some rules we'll specify one at a time -->
  <rule ref="rulesets/imports.xml/DuplicateImports"/>
  <rule ref="rulesets/basic.xml/EmptyIfStmt"/>

</ruleset>

上記のように、ruleset 要素内の rule 要素に指定したいルールセットとルールを記述します。

pom.xmlの設定

 ...
<!--
  Maven PMD Plugin
    - http://maven.apache.org/plugins/maven-pmd-plugin/
    - http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-pmd-plugin/
    - http://pmd.sourceforge.net/mvn-plugin.html
  (Notice! : This must be placed after Maven JXR Plugin's definition.)
-->
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-pmd-plugin</artifactId>
  <version>2.5</version>
  <configuration>
    <sourceEncoding>UTF-8</sourceEncoding>
    <rulesets>
      <ruleset>MyBasicRuleSet.xml</ruleset>
    </rulesets>
  </configuration>
</plugin>
 ...

上記のように、独自のルールセットの xml ファイルを指定します。

対象ソースコード

import java.lang.String;
import java.lang.String;

public class Hoge {
    public static void main (String[] args) {
        if (true) {
        }
        else {
        }
    }
}

実行結果

意図通り、以下のルールが適用された結果が pmd.xml に出力されました。

  • Basic Rules の EmptyIfStmt
  • Import Statement Rules の DuplicateImports

以下、pmd.xml

<?xml version="1.0" encoding="UTF-8"?>
<pmd version="4.2.5"
     timestamp="2011-03-23T12:03:41.531">
  <file name="C:\minimal_pmd_env\src\main\java\Hoge.java">
    <violation beginline="2"
               endline="2"
               begincolumn="8"
               endcolumn="23"
               rule="DuplicateImports"
               ruleset="Import Statement Rules"
               externalInfoUrl="http://pmd.sourceforge.net/rules/imports.html#DuplicateImports"
               priority="4">
      Avoid duplicate imports such as 'java.lang.String'
    </violation>
    <violation beginline="6"
               endline="7"
               begincolumn="19"
               endcolumn="9"
               rule="EmptyIfStmt"
               ruleset="Basic Rules"
               class="Hoge"
               method="main"
               externalInfoUrl="http://pmd.sourceforge.net/rules/basic.html#EmptyIfStmt"
               priority="3">
      Avoid empty if statements
    </violation>
    <violation beginline="8"
               endline="9"
               begincolumn="14"
               endcolumn="9"
               rule="EmptyIfStmt"
               ruleset="Basic Rules"
               class="Hoge"
               method="main"
               externalInfoUrl="http://pmd.sourceforge.net/rules/basic.html#EmptyIfStmt"
               priority="3">
      Avoid empty if statements
    </violation>
  </file>
</pmd>

参考

サンプル