maven-pmd-plugin(カスタムルールセットその1)
前回は既存のルールセット群から任意のものを選択しました。しかし、それよりも細かい粒度でルールを設定したいことも少なくありません。そのため、今回は既存のルールセット群の中から任意のルールをピックアップする方法を考えてみます。
<?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>