PMDは「枯れた技術」だと思うしネット上にも日本語情報は多いですが、わりと古いものが多い気がするし1箇所にまとまってたほうが便利だと思うのでまとめてみます。
なお著者のスペックの都合上、SBTのようなナウでヤングなビルドツールは対象にしていませんすみません。ご存知でしたらぜひ教えてください。
PMDとは
PMDはJavaコードを分析して潜在的なバグを探すツールです。コピペ検知ツールCPDを含んでいます。開発への基本的な適用方法としては以下の2パターンがあるでしょう。
- ビルド手順に組み込む
- 潜在的なバグが見つかった段階でビルドを中断する(あるいは警告する)
- 常時監視によるエンバグ予防に
- 不定期に実行する
- クセや課題の確認に使う、ブラッシュアップの参考にする
- 潜在バグ一掃タスク、品質向上月間などに
第3者の視点で自動的にコードを確認するPMDは、スキルの異なる複数人数による開発で強力な支援ツールとなるでしょう。また「こういうコードは好ましくないのだ」ということを自動的にフィードバックしてくれるため、若干の教育効果も期待できます。
さらに独自ルールを作ったり既存のルールを組み合わせて独自のルールセットを作ったりすることが可能です。これは既存プロジェクトに導入するときに特に大きなメリットで、適用ルールを段階的に増やすことで時間をかけて浸透させられます。
その他の選択肢
その他の潜在的なバグを探すためのツールでは、FindBugsが著名です。こちらはclassファイル(JVMバイトコード)を解析するものでPMDとは原理的に異なりますが、JSR305サポートなどPMDには無い機能も多いです。PMDと併用することをおすすめします。
PMD同様にJavaコードを解析するものとしては、checkstyleが最も有名でしょう。こちらは潜在的なバグを探すものというよりは、コーディングスタイルを統一するためのものです。命名規約に従っているかなども確認できるため、あらかじめ実行することにより人力レビューの効率を上げることができます。
使い方
コマンドラインからPMDを直接呼ぶ必要性はかなり限られると思いますので、MavenとJenkinsそれぞれによる使い方をまとめます。基本的にはmvn pmd:pmdを叩くだけです。
Mavenから使う
maven-pmd-pluginが用意されていますのでこちらを利用します。使用するルールセットを<rulesets>
で指定しましょう。JDKのバージョンを指定する<targetJdk>
も忘れないようにします。
<!-- see http://maven.apache.org/plugins/maven-pmd-plugin/usage.html --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-pmd-plugin</artifactId> <version>2.7.1</version> <configuration> <linkXRef>false</linkXRef> <sourceEncoding>UTF-8</sourceEncoding> <targetJdk>1.6</targetJdk> <rulesets> <ruleset>/rulesets/basic.xml</ruleset> <ruleset>/rulesets/braces.xml</ruleset> <ruleset>/rulesets/naming.xml</ruleset> <ruleset>/rulesets/strings.xml</ruleset> <ruleset>/rulesets/migrating.xml</ruleset> </rulesets> </configuration> </plugin>
以上の記述で、mvn pmd:pmd
によるレポート(XML, HTML)作成が可能になります。
もしPMDの実行を標準のビルドライフサイクルに組み込みたいなら、executions
も記述します。このとき、すべてのソースが生成された後でpmd:pmdを実行するよう注意しなければなりません。process-sourcesゴールなどが適切でしょう。
<plugin> ... <executions> <execution> <phase>process-sources</phase> <goals> <goal>pmd</goal> </goals> </execution> </executions> </plugin>
もちろんsiteゴールでのレポート作成も可能です。Maven3なら以下のようになります。サイトと統合され見やすい形で出力されますので、不定期実行に使うにはpmd:pmd
よりも便利かもしれません。
<plugin> <artifactId>maven-site-plugin</artifactId> <version>3.1</version> <configuration> <reportPlugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-pmd-plugin</artifactId> <version>2.7.1</version> <configuration> <!-- 略 --> </configuration> </plugin> </reportPlugins> </configuration> </plugin>