Java > PMDの使い方

更新日 2012-09-23
広告

PMDはソースコードの解析ツールです。FindBugsと似ていますが、PMDはソースコードを解析します(FindBugsはコンパイルされた .class を解析します)。

以下の説明では、サンプルファイル PmdTest.java をPMDで解析します。

package sample;

public class PmdTest {

    private String id = "134";

    public void testMethod() {
        if (true) {
            System.out.println("true");
        } else {

        }
    }

}

PMDをコマンドラインから使う

PMDをダウンロードして、適当な場所に解凍します。解凍すると、binディレクトリがあると思います。
$ ls pmd-bin-5.0.0/
LICENSE.txt  bin  docs  etc  lib
PMDをコマンドラインから使うためには、binディレクトリの中のrun.shを使います。
$ ./pmd-bin-5.0.0/bin/run.sh pmd sample/PmdTest.java text java-basic,java-design
sample/PmdTest.java:5	Private field 'id' could be made final; it is only initialized in the declaration or constructor.
sample/PmdTest.java:8	Do not use if statements that are always true or always false
sample/PmdTest.java:10	Avoid empty if statements

「インスタンス変数idは、finalにできますよ」とか、「常にtrueになるような式を、if文の判定式に使ってはいけませんよ」とか、指摘してくれています。

以下、コマンドラインの引数の説明です。

  • pmd : おまじないだと思って指定してください。
  • sample/PmdTest.java : 解析対象のファイル
  • text : 解析結果の出力形式。textの他に'xml'や'html'などがあります。
  • java-basic,java-design : 解析の際に利用するルール群。カンマで複数指定します。ルール一覧は公式サイトをご覧ください。

PMDをantから使う

PMDをantから実行する場合は例えば以下のようにbuild.xmlを記述します。
<project name="pmd-test" default="pmd" basedir=".">

  <!-- PMDのライブラリに対するクラスパス設定 -->
  <path id="pmd.lib"> 
    <fileset dir="pmd-bin-5.0.0/lib/">
      <include name="*.jar"/>
    </fileset>
  </path>

  <target name="pmd">
    <taskdef name="pmd" classpathref="pmd.lib" classname="net.sourceforge.pmd.ant.PMDTask"/>
    <pmd shortFilenames="true">
      <!-- 解析に使用するルールを指定 -->
      <ruleset>rulesets/java/design.xml</ruleset>
      <ruleset>java-basic</ruleset>
      <!-- 解析結果の出力フォーマットと出力ファイルを指定 -->
      <formatter type="text" toFile="pmd-result.html"/>
      <!-- 解析対象を指定 -->
      <fileset dir="sample">
	<include name="*.java"/>
      </fileset>
    </pmd>
  </target>

</project>
antを実行します。
$ ant pmd
pmd-result.htmlは以下のようになります。
$ cat pmd-result.html 
PmdTest.java:5	Private field 'id' could be made final; it is only initialized in the declaration or constructor.
PmdTest.java:8	Do not use if statements that are always true or always false
PmdTest.java:10	Avoid empty if statements
ルールの設定は、コマンドラインのときと同様に、'java-design'や'java-basic'などと指定してもよいです。
    <pmd shortFilenames="true">
      <!--
      <ruleset>rulesets/java/design.xml</ruleset>
      -->
      <ruleset>java-design</ruleset>
      <ruleset>java-basic</ruleset>
      <formatter type="text" toFile="pmd-result.html"/>
      <fileset dir="sample">
	<include name="*.java"/>
      </fileset>
    </pmd>
広告
お問い合わせは sweng.tips@gmail.com まで。
inserted by FC2 system