NetBeans PMDプラグイン¶
PMDは、ソースコードを静的解析し、問題箇所を検出するツールです。
サイクロマチック複雑度による評価、コードの重複の検出(コピー&ペーストしたコードなど)を行えます。
関連ページ:Java PMD
EasyPMDプラグイン¶
NetBeans 7.x以降に対応したPMDプラグインは、現時点では「EasyPmd」が標準の「使用可能なプラグイン」にリストアップされます。
リリース¶
バージョン | リリース日 | 概要 |
---|---|---|
10.0 | 2017-06-06 | 機構見直し |
9.6 | 2016-11-13 | PMD 5.5.2を内蔵 |
9.5 | 2016-01-07 | exclude/includeパターン指定 |
9.4 | 2015-11-22 | PMD 5.4.0を内蔵、複数ルールセットを適用可 |
9.3 | 2015-08-18 | |
9.2 | 2015-08-07 | PMD 5.3.3を内蔵 |
9.1 | 2015-07-26 | NetBeans 8.xでnew project不具合を招く |
9.0 | 2015-07-17 | |
8.0 | 2015-07-13 | |
7.6 | 2015-04-19 | NetBeans Plugin Portalの最新要求に対応 |
7.5 | 2015-04-19 | GitHubで提供開始 |
- EasyPMD 9.0/9.1は、NetBeans 8.0/8.1においてプロジェクト新規作成時にエラーを引き起こす問題があります。
EasyPMD 9.2で修正されました。
インストール¶
プラグイン更新サイトよりオンラインインストール¶
- [ツール]メニュー>[プラグイン]を選択し、「プラグイン」ダイアログを開きます。
- [使用可能なプラグイン]タブを選択し、一覧から「EasyPmd」を選択し、インストール欄にチェックを付け、[インストール]ボタンを押します。
EasyPmd開発サイトからダウンロードしオフラインインストール¶
または、EasyPmd開発サイトからダウンロードしてインストールします。
https://github.com/giancosta86/EasyPmd
上述URLからreleasesリンクを辿り、最新版(2017-06-25時点では10.0)をダウンロードします。
easypmd-10.0.nbm
- [ツール]メニュー > [プラグイン]を選択肢、「プラグイン」ダイアログを開きます。
- [ダウンロード済]タブを選択し、[プラグインの追加]ボタンを押し、ダウンロードしたファイルを選択します。
- インストール一覧に名前EasyPmdが表示され、インストールにチェックが付いているのを確認します。
- [インストール]ボタンを押し、インストールします。
設定¶
- [ツール]メニュー>[オプション]で「オプション」ダイアログを開きます。
- [EasyPmd]ボタンを押します。
ルールの指定¶
EasyPMDのルール設定には2通りあります。
- ルール集単位での指定(Profile)
- ルール個別の指定(Jar)
複数開発者による共同開発を行うプロジェクトでは、ルール設定を共有したい、適用するルールを個別に指定したい、というニーズがあるので、2つ目の設定がよさそうです。
EasyPMD開発者のブログに解説があります。
http://gualtierotesta.wordpress.com/2013/10/07/pmd-in-netbeans-the-easypmd-plugin/
EasyPMD 10.0 が同梱するPMDバージョン5.5.2のルール定義一覧は次です。
https://pmd.sourceforge.io/pmd-5.5.2/pmd-java/rules/index.html
Profileによるルールの指定¶
検査するルールの指定は、「オプション」ダイアログのEasyPmdで、[Rulesets]タブを押し、一覧にルールカテゴリを追加したり削除したりすることで行います。
ただし、Profileが"Default profile"では変更が反映されない模様で、[Duplicate]ボタンを押し、新たなProfileを作成してから[Add standard]ボタンでルール一覧から選択します。
ルール集の名称 | XMLファイル名 | 概要 | 備考 |
---|---|---|---|
Basic | rulesets/java/basic.xml | デフォルト | |
Braces | rulesets/java/braces.xml | ||
Clone Implementation | rulesets/java/clone.xml | ||
Code Size | rulesets/java/codesize.xml | ||
Comments | rulesets/java/comments.xml | ||
Controversial | rulesets/java/controversial.xml | ||
Coupling | rulesets/java/coupling.xml | ||
Design | rulesets/java/design.xml | ||
Empty Code | rulesets/java/empty.xml | ||
Finalizer | rulesets/java/design.xml | ||
Imports | rulesets/java/imports.xml | デフォルト | |
Import Statements | rulesets/java/imports.xml | ||
J2EE | rulesets/java/j2ee.xml | ||
JavaBeans | ruelsets/java/javabeans.xml | ||
JUnit | rulesets/java/junit.xml | ||
Jakarta Commons Logging | rulesets/java/logging-jakarta-commons.xml | ||
Java Logging | rulesets/java/logging-java.xml | ||
Migration | rulesets/java/migrating.xml | ||
Naming | rulesets/java/naming.xml | ||
Optimization | rulesets/java/optimizations.xml | ||
Strict Exceptions | rulesets/java/strictexception.xml | ||
String and StringBuffer | rulesets/java/Strings.xml | ||
Security Code Guidelines | rulesets/java/strings.xml | ||
Unnecessary | rulesets/java/sunsecure.xml | ||
Unused Code | rulesets/java/unusedcode.xml | デフォルト |
設定の保存先¶
設定内容は、Windowsでは次のファイルに格納されているようです。内容は、テキストとバイナリ(?)の折半のような感じです。
%USERPROFILE%\.EasyPmd4\ProfileConfiguration
Jarによるルールの指定¶
XMLファイルにルールの定義を行い、それをJARファイルにアーカイブします。
- 空のディレクトリを作成し、そこにXMLファイル(例: AlfaRuleset.xml)を作成します
- AlfaRuleset.xmlに、適用するルールのカテゴリ、除外するルール項目を記載します
<?xml version="1.0"?> <ruleset name="Custome ruleset alfa" xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"> <rule ref="rulesets/java/basic.xml" /> <rule ref="rulesets/java/comments.xml"> <exclude name="CommentSize"/> </rule> <rule ref="rulesets/java/design.xml/UseSingleton"> </ruleset>
- ルール集Basicに含まれるルールはすべて適用
- ルール集Commentsに含まれるルールはCommentSizeを除き適用
- ルール集Designに含まれるUseSingletonを適用
- JARファイルを作成します
$ jar cvfM ../PmdRulesets.jar *
- JARファイルには、今作成したXMLファイルだけ含まれればOKです
- NetBeansの[ツール]メニュー > [オプション] で「オプション」ダイアログを開き、[EasyPmd]ボタンを押します
- [Duplicate]ボタンを押し、適切な名前を入力し、新たなProfileを作成します
- [Additional classpath]タブを選択し、[Add Jar]ボタンで今作成したJARファイルを追加します
- [Rulesets]タブを選択し、既存のルールを選択、[Remove]ボタンで削除します。すべてのルールを削除します
- [Add custom]ボタンを押し、上述で作成したXMLファイル名(AlfaRuleset.xml)を記入します
- [適用]ボタンを押して、PMDのルールが適用されたかを確認します
XMLの記述要領詳細は、PMDのホームページを参照
http://pmd.sourceforge.net/pmd-5.1.0/howtomakearuleset.html
適用するルールの指定方法について補足¶
ルール集のカテゴリをまとめて適用する場合は、
<rule ref="rulesets/java/finalizers.xml"/>
とカテゴリを定義したXMLファイル名を指定します。
ルール集のカテゴリをまとめて適用するが、一部のルールを適用しない場合は、
<rule ref="rulesets/java/comments.xml">
<exclude name="CommentSize"/>
</rule>
と、excludeのname属性で適用除外するルールを指定します。
ルールを1つ1つ適用指定する場合は、
<rule ref="rulesets/java/unusedcode.xml/UnusedPrivateMethod"/>
と指定します。
PMDの検査対象パス、除外パスの設定¶
デフォルトでは、PMDの検査対象パスは次の設定となっています。
つまり、プロジェクトのすべての拡張子.javaのファイルがPMDの検査対象となります。
JUnitテストコードはPMDの検査対象から除外¶
JUnitテストコードは、testディレクトリの下に格納されているので、今回はtestディレクトリ以下をPMD検査対象から除外する設定を適用します。
さきほど作成したプロファイルで、[Path filtering]タブを選択、Excluded file patterns欄の[Add predefined]ボタンを押し、[Filter by ancestor directory]を選択し、[OK]ボタンを押します。
すると、「入力」ダイアログが表示され、ancestor directory patternを入力するよう促されます。
ここに、testと入力します。
すると、Excluded file patterns欄に次の設定が追加されます。
これで、JUnitのテストコードはPMDの検査対象から除外されます。
検査対象から除外する別な方法¶
以前の項で述べたルール定義に除外パスを記載することもできます。複数開発者からなるプロジェクトチームでは、設定箇所が一元化できた方が望ましいので、そのときはルール定義にパスの定義も含めるとよいかもしれません。
特定箇所での検出の抑制¶
静的検証ツールは設定された条件に合致した箇所を検出するので、実際には品質に問題はないが検出された箇所については以後検出されないよう抑制する手段が必要です。
- 抑制コメント
- SuppressWarningアノテーション
- 抑制定義ファイル(XPathとRegex)
抑制コメント¶
デフォルトでは、NOPMD
を該当行のコメントに記述することで指摘が抑制されます。
Boolean b = new Boolean("true"); // NOPMD
EasyPMDでは、コメントの抑制文字列を変更することができます。
[ツール]メニュー > [オプション] > [EasyPMD]ボタン > [General]タブを選択、[Suppress marker:]欄に文字列を設定
SuppressWarningアノテーション¶
@SuppressWarnings("PMD")
を、アノテーション付与可能な箇所(クラス、メソッド、フィールド、ローカル変数宣言)に記述します。
使用¶
PMDによる検証結果は、NetBeansのアクション項目として報告されます。そこで、[ウィンドウ]メニュー > [アクション項目]を選択し、アクション項目ウィンドウを表示します。
アクション項目の表示はデフォルトでは[TODO]だけなので、[EasyPmd notification]にチェックを付けるか、すべてのアクション項目を表示させます。
Java SE 8の新しい言語仕様を使用したソースコードでパースエラーが出たときの対処¶
EasyPMD 4.4はPMDバージョン5.1.0を使用しており、これはJava SE 8対応ですが、ラムダ式を記述したソースファイルの場合、エラーとなってしまいます。General optionでJavaのバージョン指定が1.7となっているためです。そこで、Javaのバージョン指定を1.8とします。
EasyPMDのソースコードからビルド¶
プラグインに手を加える場合のメモです。
ソースコードの展開¶
EasyPMDのソースコードは、GitHubにホストされています。
https://github.com/giancosta86/EasyPmd
$ git clone https://github.com/giancosta86/EasyPmd.git
プロジェクトファイルはpom.xmlなので、ビルドにはmavenが必要です。
使用するPMDを最新にする¶
参考資料¶