torutkのブログ

ソフトウェア・エンジニアのブログ

NetBeansのプラグイン

NetBeansプラグインに関する雑多メモです。メモにはJava以外の言語の観点は入っていません。

SQEプラグイン

Windows環境での話です。UnixMac系では確認していません。

CheckstyleFindBugsを使うため、SQEプラグインをインストールしました。プラグインがインストールされるディレクトリは、NetBeans自体をインストールしたディレクトリ配下ではなく、ユーザーディレクトリ配下でした(C:\Users\ユーザー名\.netbeans\6.9\modules)。確かに同一マシンを複数ユーザーで使用しているとき、誰かが入れたプラグインの影響を受けずに済むので理にかなっているのかもしれません。

また、Windows Vista以降では、C:\Program Files下にユーザーの権限でファイルを保存しようとすると、VirtualStore機能でユーザー固有ディレクトリに保存される(id:torutk:20100901)という機能が働くので、NetBeans自体のディレクトリ(デフォルトでC:\Program Files\NetBeans 6.9.1)にプラグインやその設定を入れたつもりがそこには実は入ってないという状況になるより分かりやすいかもしれません。

ユーザーディレクトリの場所を確認するには、NetBeansの[ヘルプ]→[製品について]をクリックし、「製品について」ダイアログを表示します。下の方にユーザーディレクトリの場所が記載されています。

警告の嵐

SQEプラグインをインストールすると、デフォルトでCheckstyle、PMD、FindBugsの検証が働き、ソースコードのいたるところに警告マークが付いてショックを受けます。

警告を見ていくと、以下のようなメッセージが出ます。

  • [Checkstyle]ファイルが新しい行で終了していません。
    • ファイル先頭行
  • [Checkstyle]最初の一文はピリオドで終わらなければなりません。
  • [Checkstyle]閉じていないHTMLタグが見つかりました:
    • Javadocコメントの@authorタグでメールアドレスを<>内に記述している行
  • [PMD]Each class should declare at least one constructor
    • クラス宣言行
  • [Checkstyle]Javadocコメントがありません。
    • privateフィールド宣言行(Javadocコメント非記載時)
    • メソッド宣言行(Javadocコメント非記載時)
    • クラス内部のenum型宣言行(Javadocコメント非記載時)
    • enumの各要素定義行
  • [PMD] Found non-transient, non-static member. Please mark as transient or provide accessors.
    • privateフィールドでgetメソッドなし
  • [PMD] Private field 'xxx' could be made final; it is only initialized in the declaration or constructor.
    • 初期値を入れた後変更していないフィールド宣言行
  • [FindBugs] 読まれないフィールドhoge.Fuga.xxxがあります。
    • 同上
  • [Checkstyle]Line has trailing spaces.
    • 空行
  • [Checkstyle]メソッド'mmm'は拡張するように設計されていません-abstractかfinalである必要があります。
    • privateなフィールドを読み書きしているメソッドの宣言行
  • [Checkstyle]行が80行を超えています。
    • 80桁以上のコードを記述している行
  • [Checkstyle] Utility classes should not have a public or default constructor.
  • [PMD] Avoid instantiation through private constructors from outside of the constructor's class.
    • Initialize-On-Demand Holderイディオムの内部クラス宣言行

いくつかルールに手を入れないと、不可抗力な指摘も挙がり「こんなのいらねー」となってしまいます。

Checkstyle in SQE

Checkstyleの検証ルールは、XML形式の設定ファイルで制御することができます。ルール設定ファイルは、SQLプラグインを入れた後、[ツール]メニュー→[オプション]で「オプションダイアログ」が開くので、[Quality]ボタンを押し、[Checkstyle]タブを選択し、Config File欄に指定します。
Checkstyleルール設定ファイルのデフォルトは、ユーザーディレクトリ\config\Preferences\org\nbheaven\sqe\codedefects\checkstyle.xmlとなります。

以下に、いくつかの指摘を抑制したルール設定ファイルの変更方法メモを記載しています。

FindBugs in SQE

FindBugsの検証ルールは、NetBeans上から有効・無効に設定することができます。[ツール]→[オプション]で「オプションダイアログ」が開くので、[Quality]ボタンを押し、[FindBugs]タブを選択します。表形式でBug Detectorの一覧が表示されます。行を選択すると、そのBug Detectorの説明が表の下にあるテキスト領域に表示されます。Enabled列のチェックを付ける/はずすことで、検証ルール(Bug Detector)の有効・無効を設定します。

設定が保存されるのは、ユーザーディレクトリ\config\findbugs\UserPreferences.findbugsです。記述例(一部抜粋)は以下です。

detectorAbnormalFinallyBlockReturn=AbnormalFinallyBlockReturn|true
detectorAbstractClassEmptyMethods=AbstractClassEmptyMethods|true

また、同設定ファイルの末尾には、

detector_threshold=2
effort=default
filter_settings=Medium|BAD_PRACTICE,CORRECTNESS,EXPERIMENTAL,I18N,MALICIOUS_CODE,MT_CORRECTNESS,PERFORMANCE,SECURITY,STYLE|false
filter_settings_neg=NOISE|
run_at_full_build=true

のような設定があります。

  • effort : FindBugsコマンドラインオプション -effortのことで{min|max}が選択できると推測されます。defaultはどっちかは?です。
  • filter_settings : BAD_PRACTICEなどはカテゴリ名称と思われます。適当にソースコードを作成しFindBugsの指摘を出してみたところ、PERFORMANCEやSTYLEに属するルールの指摘がされているので、これらは抑制ではなさそうですが、詳細は?です。
  • filter_settings_neg : これもNOISEはカテゴリ名称
PMD in SQE

PMDの検証ルールは、NetBeans上から有効・無効に設定することができます。[ツール]→[オプション]で「オプションダイアログ」が開くので、[Quality]ボタンを押し、[PMD]タブを選択します。表形式でルール一覧が表示されます。行を選択すると、そのルールの説明(メッセージ雛形)とコード例が表の下にあるテキスト領域に表示されます。Enabled列のチェックを付ける/はずすことで、検証ルールの有効・無効を設定します。

設定が保存されるのは、ユーザーディレクトリ\config\pmd\pmd.settingsです。このファイルはデフォルトは空で、上記オプションで無効にしたルールの名前が記録されます。

  • pmd.settingsの例(4つのルールのEnabled列のチェックをはずしたとき)
IfElseStmtsMustUseBraces
IfStmtsMustUseBraces
ForLoopsMustUseBraces
WhileLoopsMustUseBraces

Quick File Chooser

ファイル選択ダイアログで、マウス選択以外に、キーボードからファイル名補完機能付きでファイル名を入れることができるようになります。Unix系のbashシェルやEmacsでおなじみの機能です。ちょっとうれしい機能です。

その他標準でインストール可能なプラグイン一覧から

Adaプラグイン

何気なく使用可能なプラグイン一覧を見ると、Adaのプラグインが載っていました。アルファベット順に一覧に表示されるので、Adaは最初に出てきます。
といってもAdaプログラミングはしないので、ただ「へぇーっ」と思っただけです。

ivy-module

apache Ivyを使うプラグインのようです。