プロジェクト

全般

プロフィール

NetBeans PMDプラグイン

PMDは、ソースコードを静的解析し、問題箇所を検出するツールです。
サイクロマチック複雑度による評価、コードの重複の検出(コピー&ペーストしたコードなど)を行えます。

関連ページ:Java PMD

EasyPMDプラグイン

NetBeans 7.x以降に対応したPMDプラグインは、現時点では「EasyPmd」が標準の「使用可能なプラグイン」にリストアップされます。

リリース

バージョン リリース日 概要
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-01.png (NetBeansの使用可能なプラグインリストからEasyPmdを選択)

EasyPmd開発サイトからダウンロードしオフラインインストール

または、EasyPmd開発サイトからダウンロードしてインストールします。
https://github.com/giancosta86/EasyPmd

上述URLからreleasesリンクを辿り、最新版(2015-08-07時点では9.2)をダウンロードします。
easypmd-9.2.nbm

  • [ツール]メニュー > [プラグイン]を選択肢、「プラグイン」ダイアログを開きます。
  • [ダウンロード済]タブを選択し、[プラグインの追加]ボタンを押し、ダウンロードしたファイルを選択します。
  • インストール一覧に名前EasyPmdが表示され、インストールにチェックが付いているのを確認します。
  • [インストール]ボタンを押し、インストールします。

設定

  • [ツール]メニュー>[オプション]で「オプション」ダイアログを開きます。
  • [EasyPmd]ボタンを押します。

easypmd_option_general-1.png (オプションダイアログのEasyPmd設定画面Generalタブ)

ルールの指定

EasyPMDのルール設定には2通りあります。

  1. ルール集単位での指定(Profile)
  2. ルール個別の指定(Jar)

複数開発者による共同開発を行うプロジェクトでは、ルール設定を共有したい、適用するルールを個別に指定したい、というニーズがあるので、2つ目の設定がよさそうです。

EasyPMD開発者のブログに解説があります。
http://gualtierotesta.wordpress.com/2013/10/07/pmd-in-netbeans-the-easypmd-plugin/

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の検査対象パスは次の設定となっています。

pathfiltering-1.png

つまり、プロジェクトのすべての拡張子.javaのファイルがPMDの検査対象となります。

JUnitテストコードはPMDの検査対象から除外

JUnitテストコードは、testディレクトリの下に格納されているので、今回はtestディレクトリ以下をPMD検査対象から除外する設定を適用します。

pathfiltering-2.png

さきほど作成したプロファイルで、[Path filtering]タブを選択、Excluded file patterns欄の[Add predefined]ボタンを押し、[Filter by ancestor directory]を選択し、[OK]ボタンを押します。

すると、「入力」ダイアログが表示され、ancestor directory patternを入力するよう促されます。

pathfiltering-3.png

ここに、testと入力します。

pathfiltering-4.png

すると、Excluded file patterns欄に次の設定が追加されます。

pathfiltering-5.png

これで、JUnitのテストコードは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とします。

general-1.png

参考資料

easypmd-01.png 表示 - NetBeansの使用可能なプラグインリストからEasyPmdを選択 (95.4 KB) 高橋 徹, 2013/11/17 13:00

easypmd_option_general-1.png 表示 - オプションダイアログのEasyPmd設定画面Generalタブ (67.2 KB) 高橋 徹, 2014/03/18 00:02

pathfiltering-1.png 表示 (41.6 KB) 高橋 徹, 2014/05/01 10:43

pathfiltering-2.png 表示 (32.2 KB) 高橋 徹, 2014/05/01 10:43

pathfiltering-3.png 表示 (13.9 KB) 高橋 徹, 2014/05/01 10:43

pathfiltering-4.png 表示 (12.8 KB) 高橋 徹, 2014/05/01 10:43

pathfiltering-5.png 表示 (21.2 KB) 高橋 徹, 2014/05/01 10:43

general-1.png 表示 (31.1 KB) 高橋 徹, 2014/05/01 10:45

クリップボードから画像を追加 (サイズの上限: 1 GB)