PMDでJavaのコードのバグをチェックする
Javaにおいてバグの要因となりそうなコードをチェックするツールとして、FindBugsがあります。しかし、FindBugsは2015年以降の開発が止まっているため、言語のアップデートに追従できていません。そこで、FindBugsの代替えとなるPMDを紹介します。PMDを使えばバグの原因となりそうなコードを検知することができるため、不具合を未然に防ぐことが可能です。
PMDとは
PMDは次の4つの問題があるコードを検知することができるツールです。
- Possible bugs - バグの要因となるコード
- Dead code - 使われていないコード
- Suboptimal code - 効率の悪いコード
- Overcomplicated expressions - 複雑な構文
PMD自体はJavaで実装されていますが、Java以外の言語にも対応しています。今回はJavaのコードを対象に使い方を紹介します。
PMDのインストール方法
Homebrewでインストールする
Macであれば、次のコマンドでインストールできます。
1 | brew install pmd |
バイナリをダウンロードする
バイナリをダウンロードしてインストールすることができます。次のページからダウンロードしてください。
PMDでコードをチェックする
サンプルコードの準備
PMDでコードをチェックしてみます。今回はサンプルコードを作って検証します。サンプルコードはGithubにアップロードしているのでクローンしてご利用ください。
1 | git clone git@github.com:shoyan/pmd-samples.git |
PMDの実行
Pmdを実行します。-d
がソースコードのパス、-R
がルールが設定してあるファイルのパス、-l
に言語を指定します。
1 | pmd pmd -d src/main/java -R rules.xml -l java |
3つの問題が検知されています。UnusedCode.javaの2行目を見てみると、使われていないメンバ変数があります。他のエラーも同様に使われていないローカル変数とプライベートメソッドを検知しています。
ルールについて
ルールの一覧については次のリンクよりご覧ください。
0の状態からルールを構築するのは大変です。そのため、PMDのリポジトリには様々なルールのサンプルが定義されています。基本的なルールが網羅されているbasic.xmlを利用するとよいでしょう。他にも様々なルールがあるので参考にしてください。
カテゴリ
PMDのルールはカテゴリに分類されています。例えば、ベストプラクティスであれば、ベストプラクティスに沿ったルールが定義されています。カテゴリの詳細については次のリンクでご覧ください。
トラブルシューティング
PMD6.1.0はPMD7への過渡期バージョンのようで、Deprecatedの警告が山のように出ます。
設定ファイルでしか警告を消す術がないので設定ファイルを修正します。
次のようにdeprecatedをfalseにするか、プロパティ自体を削除してください。
1 | <rule ref="category/java/errorprone.xml/AvoidBranchingStatementAsLastInLoop" deprecated=“false" /> |