Subscribed unsubscribe Subscribe Subscribe

Kengo's blog

Technical articles about original projects, JVM, Static Analysis and JavaScript.

Maven使いのためのPMD入門(2012年夏)

PMD java Jenkins Maven

PMDは「枯れた技術」だと思うしネット上にも日本語情報は多いですが、わりと古いものが多い気がするし1箇所にまとまってたほうが便利だと思うのでまとめてみます。
なお著者のスペックの都合上、SBTのようなナウでヤングなビルドツールは対象にしていませんすみません。ご存知でしたらぜひ教えてください。

PMDとは

PMDはJavaコードを分析して潜在的なバグを探すツールです。コピペ検知ツールCPDを含んでいます。開発への基本的な適用方法としては以下の2パターンがあるでしょう。

  1. ビルド手順に組み込む
    • 潜在的なバグが見つかった段階でビルドを中断する(あるいは警告する)
    • 常時監視によるエンバグ予防に
  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>
Jenkinsでレポート生成

Mavenで生成したXMLレポートをもとに、Jenkins上にグラフを表示することができます。PMDプラグインをインストールし、Jobの設定画面でチェックを入れてください。
f:id:eller:20120811170417p:plain
ビルド後、targetディレクトリにXMLレポートが見つかれば、Jenkinsがグラフ(サンプル)やレポート(サンプル)を用意してくれます。
f:id:eller:20120811171029p:plain
プラグインがやってくれるのはレポートの集計だけで、レポートの生成(pmd:pmdなど)は自分で実行しなければならないので注意が必要です。

IDE連携

Maven関係ないですが、IDEとの連携も可能です。@ITの記事などを参考にしてください。ただMavenをビルドツールとして使っているなら、IDE連携をする必要性はそこまで無いでしょう。