NetBeans 7.x

 2010.3.30より、ヒットになります。

注)現在、NetBeans 7.2用に手直し作業をしています。そのため、記述がところどころ7.2、7.1、7.0と混在しています。

概要

Oracle(旧Sun)が開発するJavaプログラム統合開発環境。Eclipseに比べて存在感が薄い感がありますが、歴史はEclipseより古く、最近は性能向上・機能強化も進みEclipse並みからEclipseを超えるところに来ています。特質すべき点は、GUIデザイン機能、Java EEアプリケーションサーバ連携、プロファイラ、Java ME開発環境、バージョン管理ツールとの連携(CVS/Subversion/Mercurial/Git)です。日本語化を含めて最初から必要な機能が入っているので、初期導入も容易です。

ただし、Eclipseにも強みがあり、OSGiの標準フレームワークを基盤としており商用ツールが各種Eclipse向けに開発されている点や、ユーザー層の厚みなどは比べ物にならないです。

個人的には、NetBeansとEclipseとは適材適所で使い分ければいいじゃないかと思っており、特にどちらかへのこだわりはありません。(というものの、非適所に使われることには異論はありますが)

NetBeans日本語関連情報

NetBeansに関する日本語情報源を集めてみました。

NetBeans公式情報、コミュニティ

NetBeans 7.2情報

NetBeans解説記事(オンライン)

NetBeans 6.0以降の解説記事です。NetBeansをインストールすると、[ヘルプ]メニュー→[チュートリアル]に解説記事がありますのでそちらも活用するとよいでしょう。

プラグイン紹介

セットアップ

NetBeans 7.2

NetBeans 7.2は、使用用途毎に必要なパッケージを組み合わせて構成されています。

英語版の他、日本語を含む各国語へのローカライズが行われております。

入手

NetBeansのホームページ(日本語はこちら)から、[Download FREE]アイコンをクリックし、IDEの言語欄で「日本語」(またはお好みの言語)を選択し、プラットフォーム欄で、インストールしたいOS(Windows、Linux(x86/x64)、Solaris(x86/x64)、Solaris(sparc)、MacOS X)を選択します。 

使いたい構成を選んで[ダウンロード]アイコンをクリックします。

微妙な按配です。Java以外にも、GroovyやPHPを少しでも触ってみようと思うとすべて版をダウンロードしてしまった方がよいかもしれません。

入手にあたっての特記事項


†1 標準プラグインに含まれてないだけで非対応というのなら、Eclipseは日本語非対応、Subversion非対応になってしまいます。

†2 JUnitのライセンスであるCPLの条項7には、CPLライセンスのソフトウェア利用者に対する特許訴訟上の大きな制約(不利益といってもいい)を課するもののようです。Oracleは、顧客の不利益を懸念しての対応をしていると思います。
参考URL:https://www.myeclipseide.jp/blog/2009/03/epl-cpl.html

インストール

公式インストール手順のページ(日本語)

NetBeans Java SE版をWindows上にインストール

NetBeans 7.2 Java SE版をWindows 7 64bit環境へインストールする手順について、別ページ(工事中)で紹介しています。

NetBeans すべて版をWindows上にインストール

インストール方法は、上述の公式インストール手順のページに記載されています。

まず、「すべて版」をインストールすることとし、日本語版として以下のインストールファイルをダウンロードします。

netbeans-7.2-ml-windows.exeを実行すればインストーラが起動します。デフォルトでは、Apache Tomcatサーバがインストールされないので、[カスタマイズ]ボタンを押して、[Apache Tomcat 7.0.22]にチェックを付けます。

[次へ]ボタンを押し、使用許諾契約書を読み了解すれば[ライセンス契約条件に同意する]をチェックし、[次へ]ボタンを押します。

NetBeans IDEのインストール先とNetBeans IDE用のJDKを選択します。Windows版のNetBeansは32bit版のみなので、ここでインストールする先および使用するJDKは32bit版を選択します。64bit Windowsでの一例を以下に示します。

NetBeans IDEのインストール先(I):
C:\Program Files (x86)\NetBeans 7.2
NetBeans IDE用のJDK (J):
C:\Program Files (x86)\Java\jdk1.7.0
Windows 7 64bit版では、32bitアプリのインストール先に C:\Program Files (x86)、64bitアプリのインストール先にC:\Program Files が適用されます。

[次へ]ボタンを押します。GlassFishのインストール先を問い合わせてくるので、そのままデフォルトのディレクトリにインストールします。

GlassFishのインストール先(I):
C:\Program Files\glassfish-3.1

[次へ]ボタンを押します。Apache Tomcatのインストール先を問い合わせてくるので、そのままデフォルトのディレクトリにインストールします。

Apache Tomcatのインストール先(I):
C:\Program Files\Apache Software Foundation\Apache Tomcat 7.0.22

[次へ]ボタンを押します。NetBeans IDE、GlassFish、Tomcatのインストール先確認画面が表示されるので、了解すれば、[インストール]ボタンを押します。

アンインストールは、OSのコントロールパネル−プログラムの追加と削除から行えるようになっています。

環境設定

起動時のオプション

まとめると次の項目

NetBeans 7.1で追加のオプション

フォントの設定(Windows)

「NetBeansのWindows版はフォントが汚いので使う気がしない」と言われる所以ですが、それはWindows OS側の問題が多分にあります。汚いといわれているのは日本語フォントです。WindowsはVistaから、アンチエイリアスを前提としたメイリオフォントが導入されましたが、OSが使用する基本フォントは互換性の問題もあり、従来どおりMS UI Gothicです。NetBeansをWindows上で起動すると、OSの使用するフォントを取得して表示するので、MS UI Gothicが適用されます。MS UI Gothicはフォントサイズが小さいときはClearTypeを有効にしていてもビットマップ表示されるため、ぎざぎざとなってしまいます。

OSが使用する基本フォントをメイリオに変えることもできますが、メイリオとMS UI Gothicではフォントメトリクスが異なるため、MS UI Gothicでサイズを決め打ちで作られたGUIアプリケーションは大抵表示が崩れ(画面に収まらないボタン等が出る)、大きな不都合が生じます。

Java(JDK)側で、使用するフォント設定を変更することで、そのJDK上で実行するJavaアプリケーションのフォントを制御することができます。NetBeansは、Java(JDK)上で動くアプリケーションなので、今回その方法でフォント表示の改善をしてみます。

JDKのフォント設定を変更する

<JDKインストールディレクトリ>\jre\lib ディレクトリにある、fontconfig.* がJDKのフォント設定ファイルとなります。

NetBeansが使用するJDKは、<NetBeansインストールディレクトリ>\etc\netbeans.conf ファイルに記載されています。

# Default location of JDK, can be overridden by using --jdkhome <dir>:
netbeans_jdkhome="D:\Program Files (x86)\Java\jdk1.6.0"

上記の場合、D:\Program Files (x86)\Java\jdk1.6.0\jre\lib ディレクトリにフォント設定があります。

D:\>dir "D:\Program Files (x86)\Java\jdk1.6.0\jre\lib"\fontconfig*

2010/07/13 22:54 2,710 fontconfig.98.bfc
2010/07/13 22:54 7,603 fontconfig.98.properties.src
2010/07/13 22:54 3,478 fontconfig.bfc
2010/07/13 22:54 9,768 fontconfig.properties.src

D:\>

JDKのドキュメント「機能ガイドー国際化ーフォント構成ファイル」に説明があります。

最初の2つ(fontconfig.98.*)は、Windows 98で適用されるものです。それ以外のWindows OSでは、fontconfig.bfcが設定として利用されます。fontconfig.bfcはバイナリ形式で、fontconfig.properties.srcから生成されたものと思われます。フォント設定を変更するには、fontconfig.properties.srcをfontconfig.propertiesの名前にコピーし、fontconfig.propertiesを編集します。

上記ドキュメントの説明では、fontconfig.propertiesとfontconfig.bfcのファイルがある場合、前者が優先されると記載されています。(動作を要確認)

日本語フォントをメイリオに設定する

1) MS Gothic を Meiryo に変更します。

sansserif.plain.japanese=MS Gothic
sansserif.bold.japanese=MS Gothic
sansserif.italic.japanese=MS Gothic
sansserif.bolditalic.japanese=MS Gothic
monospaced.plain.japanese=MS Gothic
monospaced.bold.japanese=MS Gothic
monospaced.italic.japanese=MS Gothic
monospaced.bolditalic.japanese=MS Gothic
dialog.plain.japanese=MS Gothic
dialog.bold.japanese=MS Gothic
dialog.italic.japanese=MS Gothic
dialog.bolditalic.japanese=MS Gothic
dialoginput.plain.japanese=MS Gothic
dialoginput.bold.japanese=MS Gothic
dialoginput.italic.japanese=MS Gothic
dialoginput.bolditalic.japanese=MS Gothic

これらを

sansserif.plain.japanese=Meiryo
sansserif.bold.japanese=Meiryo
sansserif.italic.japanese=Meiryo
sansserif.bolditalic.japanese=Meiryo
monospaced.plain.japanese=Meiryo
monospaced.bold.japanese=Meiryo
monospaced.italic.japanese=Meiryo
monospaced.bolditalic.japanese=Meiryo
dialog.plain.japanese=Meiryo
dialog.bold.japanese=Meiryo
dialog.italic.japanese=Meiryo
dialog.bolditalic.japanese=Meiryo
dialoginput.plain.japanese=Meiryo
dialoginput.bold.japanese=Meiryo
dialoginput.italic.japanese=Meiryo
dialoginput.bolditalic.japanese=Meiryo

に変更し、以下を最後に追加します。

filename.Meiryo=MEIRYO.TTC

メイリオは、日本語(全角)は等幅ですがASCII文字(半角)はプロポーショナルフォントとなっています。デフォルトではmonospacedフォントは以下のように、windows-31j環境ではjapaneseで指定したメイリオが優先されます。その結果、ASCII文字がプロポーショナルになってしまいます。そこで、優先順をjapaneseよりalphabeticを先になるように修正します。

つまり

sequence.monospaced.windows-31j=japanese,alphabetic,dingbats,symbol

sequence.monospaced.windows-31j=alphabetic,japanese,dingbats,symbol

に変更します。こうすると、monospacedのフォントがwindows-31jロケールでは、monospaced.plain.alphabetic=Courier New で指定したCourier Newフォントになります。日本語はCourier Newフォントにないので、次に優先されるmonospaced.plain.japanese=Meiryo が使われます。

ASCII文字をConsolasに設定する

上記のとおりデフォルトではCourier Newとなっている部分をConsolasに変更します。

monospaced.plain.alphabetic=Courier New
monospaced.bold.alphabetic=Courier New Bold
monospaced.italic.alphabetic=Courier New Italic
monospaced.bolditalic.alphabetic=Courier New Bold Italic
dialoginput.plain.alphabetic=Courier New
dialoginput.bold.alphabetic=Courier New Bold
dialoginput.italic.alphabetic=Courier New Italic
dialoginput.bolditalic.alphabetic=Courier New Bold Italic

monospaced.plain.alphabetic=Consolas
monospaced.bold.alphabetic=Consolas Bold
monospaced.italic.alphabetic=Consolas Italic
monospaced.bolditalic.alphabetic=Consolas Bold Italic
dialoginput.plain.alphabetic=Consolas
dialoginput.bold.alphabetic=Consolas Bold
dialoginput.italic.alphabetic=Consolas Italic
dialoginput.bolditalic.alphabetic=Consolas Bold Italic

に変更し、以下を追加します。

filename.Consolas=CONSOLA.TTF
filename.Consolas_Bold=CONSOLAB.TTF
filename.Consolas_Italic=CONSOLAI.TTF
filename.Consolas_Bold_Italic=CONSOLAZ.TTF

日本語フォントをMeiryo UIに設定する

Windows 7に標準搭載のMeiryo UIに設定します。なお、Meiryo UIは、Windows Vistaでもアップデートが出ています。

 Windows用JDK1.6.0 Update21のフォント設定をメイリオおよびConsolarsに修正したファイルと、これを適用したNetBeans画面のキャプチャです。
 行間が広くなってしまい、同時に見れる行数が減り、ちょっと気に入りません。
fontconfig.properties   
 Windows用JDK1.6.0 Update21のフォント設定をMeiryo UIおよびConsolarsに修正したファイルと、これを適用したNetBeans画面のキャプチャです。
 上記のメイリオよりも行間が狭まり、まずますです。
fontconfig.properties   
 Windows用JDK1.6.0 Update21のデフォルトのフォント設定と、そのNetBeans画面のキャプチャです。
 MS ゴシックフォントが使われている部分はアンチエイリアスが適用されず、いまいちな表示になっています。
fontconfig.properties.src  
フォントの大きさを変更する

[ツール]メニュー→[オプション]でオプションダイアログが表示されるので、[フォントと色]アイコンを選択し、[構文]タブを選択します。言語欄で[すべての言語]を選択し、カテゴリ欄は未選択のまま、フォント欄の右にある[...]ボタンを押します。

フォント選択ダイアログが表示されるので、サイズ欄に指定したいポイント数を入力します。ポイント数の選択リストには、ポイント数が飛び飛び(3, 5, 8, 10, 12, 14, 18, ...)で表示されていますが、サイズ欄直下のテキスト入力欄に直接キーボードから数値を入力することができます。12ポイントでは少し大きいが10ポイントは小さすぎる場合、直接11を入力して[了解]ボタンを押します。

すると、オプションダイアログでフォント欄に、[Monospaecd 11]のように表示されます。[了解]を押して、Javaエディタの表示が変わったことを確認します。

Look and Feelを変更する

Windows上でNetBeansを動かすと、Java/Swingのシステム・ルック・アンド・フィールであるWindowsLookAndFeelが適用されます。WindowsLookAndFeelは、上述のfontconfigの設定で変更可能な論理フォントではなく、物理フォント名(MS UI ゴシック)決め打ちのため、エディタ編集以外の箇所が汚いままとなります。

そこで、NimbusLookAndFeelや、その他論理フォントを使うサードパーティ製LookAndFeel、自分で作成したLookAndFeelなどに変更します。

LookAndFeelの変更方法は次の項目に記載します。

ルック・アンド・フィールの変更

NetBeansは、Java/Swingで作成されているので、好みのルック・アンド・フィールを指定することで見栄えを変更することができます。

ルック・アンド・フィールの指定方法は、以下の2つがあります。

指定の書式は、以下です。

--laf <ルック・アンド・フィール・クラス名(FQCN)>
NimbusLookAndFeelへの変更

Java/Swingの標準搭載ルック・アンド・フィールの1つにNimbusLookAndFeelがあります。

コマンドライン・オプションに指定する

NetBeans IDE 7.2のショートカットでリンク先にオプションを追加します。

"C:\Program Files (x86)\NetBeans 7.0\bin\netbeans.exe" --laf Nimbus

NetBeans設定ファイルに記述する

netbeans.confファイルのnetbeans_default_options項目に追加します。

netbeans_default_options="-J-client -J-Xss2m
 -J-Xms32m -J-XX:PermSize=32m
 -J-XX:MaxPermSize=384m -J-Dsun.java2d.noddraw=true
 --laf Nimbus"

なお、デフォルトの設定ファイルにapple関係のプロパティ指定がありますが、Windowsでは無用なため削除しています。

画面サンプル

Windows 7において、NetBeansのルック・アンド・フィールをNimbusLookAndFeelに指定した時の画面。NimbusLookAndFeelは、論理フォント SansSerif を使用します。Java SE 7のデフォルトのフォント設定で論理フォント SansSerif には、物理フォントとして英文フォントにArial、日本語フォントにMS ゴシックが割り付けられています。
日本語がビットマップで、いまいちな表示です。
 
 Windows 7において、NetBeansのルック・アンド・フィールをNimbusLookAndFeelに指定し、かつ Java SE 7のフォント設定を変更し、論理フォント SansSerif には物理フォントとして英文フォントにConsolas、日本語フォントにメイリオ UIを割り付けました。
日本語も一部を除きアンチエイリアスな表示となり、まずまずです。
 
JGoodiesのWindowsLookAndFeelへの変更

jgoodies looksで提供されるWindowsLookAndFeelは、Windows OSのルック・アンド・フィールを模擬しますが、フォント設定をシステムプロパティで変更することができます。そこで、これを使ってフォントをMS UIゴシックからメイリオ UIフォントに設定します。

NetBeans設定ファイルで指定する

netbeans.confファイルのnetbeans_default_options項目に追加します。

netbeans_default_options="-J-client -J-Xss2m -J-Xms32m -J-XX:PermSize=32m
 -J-XX:MaxPermSize=384m -J-Dsun.java2d.noddraw=true
 --cp:a C:\java\jgoodies-looks-2.4.1\jgoodies-looks-2.4.1.jar;
C:\java\jgoodies-looks-2.4.1\lib\jgoodies-common-1.2.0.jar
 --laf com.jgoodies.looks.windows.WindowsLookAndFeel"

--cp:a オプションは、NetBeans実行時のクラスパスに追加(Append)するパスを指定します。複数パスを追加するときは、Javaのクラスパス指定方法と同じセパレータで区切ります。

JGoodies looksのWindowsLookAndFeelは、システムプロパティでフォントを指定することができます。

netbeans_default_options="-J-client -J-Xss2m -J-Xms32m -J-XX:PermSize=32m
 -J-XX:MaxPermSize=384m -J-Dsun.java2d.noddraw=true
 --cp:a C:\java\jgoodies-looks-2.4.1\jgoodies-looks-2.4.1.jar;
C:\java\jgoodies-looks-2.4.1\lib\jgoodies-common-1.2.0.jar
 --laf com.jgoodies.looks.windows.WindowsLookAndFeel
 -J-DWindows.controlFont=\"Meiryo UI-plain-12\"
 -J-DWindows.menuFont=\"Meiryo UI-plain-12\""

画面サンプル

Windows 7において、NetBeansのルック・アンド・フィールを、JGoodies looksライブラリに含まれるWindowsLookAndFeelに指定した時の画面。   
Windows 7において、NetBeansのルック・アンド・フィールを、JGoodies looksライブラリに含まれるWindowsLookAndFeelに指定した時の画面。 かつ Java SE 7のフォント設定を変更し、論理フォント SansSerif、Monospace、DialogInput には物理フォントとして英文フォントにConsolas、日本語フォントにメイリオ UIを割り付けました。  
Windows 7において、NetBeansのルック・アンド・フィールを、JGoodies looksライブラリに含まれるWindowsLookAndFeelに指定し、システムプロパティでフォントをメイリオ UIに指定した時の画面。 かつ Java SE 7のフォント設定を変更し、論理フォント SansSerif、Monospace、DialogInput には物理フォントとして英文フォントにConsolas、日本語フォントにメイリオ UIを割り付けました。   
WindowsLookAndFeelカスタマイズ

Java標準搭載のcom.sun.java.swing.plaf.windows.WindowsLookAndFeel のサブクラスを作成し、フォントを差し替えることで、カスタマイズする方法です。サンプルコードは以下です。

WindowsLookAndFeelのgetDefaultsメソッドをオーバーライドし、キー名が"font"で終わるリソースを、一律指定したフォントに置き換えています。

置き換えるフォントは、デフォルトでメイリオ 11ポイントにしていますが、システムプロパティでキーにwincustom.fontを指定し、値に、Meiryo UI-plain-12 のようにフォント名-修飾-サイズ の形式で指定することで、別なフォントを使用することができます。(JGoodies-looks の指定方法に合わせました)

コンパイル済みのJARファイルは以下です。

NetBeans設定ファイルで指定する

netbeans.confファイルのnetbeans_default_options項目に追加します。

netbeans_default_options="-J-client -J-Xss2m -J-Xms32m -J-XX:PermSize=32m
 -J-XX:MaxPermSize=384m -J-Dsun.java2d.noddraw=true
 --cp:a C:\java\lib\WinCustomLAF.jar
 --laf jp.gr.java_conf.torutk.laf.wincustom.WinCustomLookAndFeel
 -J-Dwincustom.font=\"Meiryo UI-plain-12\""

画面サンプル

 Windows 7において、NetBeansのルック・アンド・フィールを、WinCustomLookAndFeelに指定した時の画面。   

メモ

JGoodies-Looksでいいと思いましたが、Windows Look And Feelでないと支障のでるケースがまれにあったので、そのようなときはこれを使うと回避できることがあります。

パフォーマンス向上

NetBeansはJava上で動くので、Javaの設定でのパフォーマンス調整が可能です。

ガベージコレクタ種類の指定(CMS)

Javaは、デフォルトでは(サーバーVMを除く)シングルスレッドの世代別GCを使用しているので、大きなプロジェクトを操作していると、GCによる停止時間("Stop the world")が気になるかもしれません。(人間が気になるのは0.1-0.2秒くらいから?)
そこで、GCによる停止時間の最小化を追及しているConcurrent Mark and Sweep(CMS)というGCに切り替えます。パラメータは、デフォルトのnetbeans.confファイルにコメント化された状態で記載しているので、コピー&ペーストでパラメータに追加します。

netbeans.confに記載されているCMS用パラメータ

# If you specify the heap size (-Xmx) explicitly, you may also want to enable
# Concurrent Mark & Sweep garbage collector. In such case add the following
# options to the netbeans_default_options:
# -J-XX:+UseConcMarkSweepGC -J-XX:+CMSClassUnloadingEnabled -J-XX:+CMSPermGenSwe
epingEnabled
# (see http://wiki.netbeans.org/FaqGCPauses)、

netbeans.confファイルのnetbeans_default_options項目に追加します。

netbeans_default_options="-J-client -J-Xss2m -J-Xms32m -J-XX:PermSize=32m
 -J-XX:MaxPermSize=384m -J-Dsun.java2d.noddraw=true
 -J-XX:+UseConcMarkSweepGC -J-XX:+CMSClassUnloadingEnabled -J-XX:+CMSPermGenSweepingEnabled"

注) CPU(コア)が1つの場合、並行GCを使うとかえって遅くなることもあるようです。

注) JDK6の後期バージョンおよびJDK7で新登場のG1GCはCMSの置き換えとして有望ですが、JDK6 u26でG1GCを使う設定でNetBeansを起動すると、途中でフリーズ状態になってしまいました。もうちょっと様子見かもしれません。

クラスロード時の検査を省略(-Xverify:none)

netbeans.confファイルのnetbeans_default_options項目に追加します。

netbeans_default_options="-J-client -J-Xss2m -J-Xms32m -J-XX:PermSize=32m -J-XX:MaxPermSize=384m
 -J-Dsun.java2d.noddraw=true -J-XX:+UseConcMarkSweepGC -J-XX:+CMSClassUnloadingEnabled
 -J-XX:+CMSPermGenSweepingEnabled -J-Xverify:none"

NetBeans起動時間が気持ち早くなるかも。

キー設定をEmacs風に

[ツール]メニュー→[オプション]でオプションダイアログが表示されるので、[キーマップ]アイコンを選択し、右側ペインのプロファイル欄で、デフォルトの"NetBeans"から"Emacs"に変更し[了解]ボタンを押します。

Javaエディタ上でパラメータ(引数)の色を変更

Javaエディタ上では文法に基づき予約語・識別子に色が付きます。ただし、デフォルトではメソッドのパラメータ(引数)とローカル変数は同じ色となっており区別がつきません。そこで、パラメータ(引数)にローカル変数とは別の色をつけます。

[ツール]メニュー→[オプション]でオプションダイアログが表示されるので、[フォントと色]アイコンを選択し、[構文]タブを選択します。言語欄で[Java]を選択し、カテゴリ欄で[パラメータ宣言]を選択、前景欄で指定したい色(例えば[マゼンダ])を選択します。

続いて、カテゴリ欄で[パラメータ用]を選択、前景欄で同じく指定したい色を選択します。

[了解]ボタンを押してJavaエディタ上でソースコードのパラメータの色が変更されたことを確認します。

ソースファイルの文字コード・改行コードの設定

デフォルトでは、ソースファイルの文字コードはUTF-8、改行コードはLF(0x0a)となっています。

ソースファイルの文字コードは、プロジェクト毎に指定可能です。、

改行コードはバージョン6.9(2010/7/18現在)では指定する方法がありません。以下バグデータベースにも登録されています。

ライセンス・テンプレートの定義(ファイル先頭コメント)

NetBeansをインストールしたデフォルト状態で、新しいファイルを作成すると、ファイルの先頭にはデフォルトのコメントが生成されます。例えば、Javaクラスを新規作成した場合の例を以下に示します。

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package foo.bar;

コメントには、[ツール]→[テンプレート]を選び、テンプレートをエディタに開け、とあります。[ツール]メニューの[テンプレート]を選択すると、「テンプレートマネージャー」ダイアログが表示されます。テンプレート欄のツリー表示の中に、「ライセンス」があるので展開すると、以下が表れます。

デフォルトライセンスを選択し、[エディタで開く]ボタンを押すと、エディタ画面に以下が表示されます。

<#if licenseFirst??>
${licenseFirst}
</#if>
${licensePrefix}To change this template, choose Tools | Templates
${licensePrefix}and open the template in the editor.
<#if licenseLast??>
${licenseLast}
</#if>

Javaクラスを新規作成したときの内容が見受けられます。

[ツール]メニュー→[テンプレート]で「テンプレートマネージャー」を開き、今度は、テンプレート欄のツリー表示の中の「Java」を展開し、[Javaクラス]を選択し、[エディタで開く]ボタンを押します。

<#assign licenseFirst = "/*">
<#assign licensePrefix = " * ">
<#assign licenseLast = " */">
<#include "../Licenses/license-${project.license}.txt">

<#if package?? && package != "">
package ${package};

</#if>
/**
*
* @author ${user}
*/
public class ${name} {

}

ここで、#assignタグで指定された licenseFirst, licensePrefix, licenseLastが、デフォルトライセンスの${licenseFirst}, ${licensePrefix}, ${licenseLast}に展開されているのが分かります。また、#includeタグで、license-${project.license}.txtを指定しています。したがって、project.licenseの定義を変えることで、ファイル先頭コメントとして取り込むファイルを切り替えることができます。

NetBeansで用意されているライセンスから選択する

Javaクラスを新規作成したときに、Apache 2.0ライセンスをファイル先頭コメントとする場合は、以下のように設定します。

1) プロジェクトのプロパティファイル(project.properties)を開き、project.license=apache20 を選択します。
 プロジェクトの[ファイル]タブを選択します。プロジェクトの下に、nbprojectフォルダがあるのでこれを展開します。中に、project.propertiesファイルがあるので編集のために開きます。ここに、以下を追記します。

project.license=apache20

保存して、新しいJavaクラスを作成すると、ファイル先頭コメントがApacheライセンスに変更されているのが分かります。

/*
* Copyright 2010 torutk.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* under the License.
*/

2) 著作権表示の名前をカスタマイズしたい
 [ツール]メニュー→[テンプレート]で「テンプレートマネージャー」ダイアログを開き、テンプレート欄のツリー表示から[ユーザー構成プロパティー]を展開し、[User.properties]を選択し、[エディタで開く]ボタンを押します。[設定]ボタンを押します。エディタに"User.properties"ファイルが開くので、userとcampanyを設定することができます。

user=Jean-Luc Picard
company=United Federation of Planets, Star Fleet
独自のライセンスファイルを定義する

テキストエディタで、license-xxxxx.txt (xxxxxには任意の名前を入れる、project.propertiesで指定する文字列となる)を作成します。[ツール]メニュー→[テンプレート]で「テンプレートマネージャー」ダイアログを表示し、テンプレート表示欄で[ライセンス]を選択し、[追加]ボタンを押し、作成したライセンスファイルを選択します。追加されたライセンスファイルは、<ユーザのホームディレクトリ>\.netbeans\6.9\config\Templates/Licenses/license-xxxxx.txt として保存されます。

プロジェクトのproject.propertiesに、project.license=xxxxx を指定すれば以後適用されます。

ライセンスファイルで使用できる変数名は、以下URLに記載があります。

新しい変数は、User.propertiesに定義したものが使えるようです。project.propertiesに定義したものは使えませんでした。

追加モジュールの設定

追加モジュール(プラグイン)は、ユーザーディレクトリの下にインストールされます。ですので、他のユーザーとの競合は起きないようになります。逆に、誰かが個人で入れたプラグインは反映されないので、自分で入れる必要があります。

オフライン・インストール

追加モジュールのインストール手順は、通常インターネットに接続可能な環境を前提としています。もし、NetBeansを実行するマシンがインターネットに接続できない場合は、追加モジュールを別途ダウンロードしてからファイルを移送して、ダウンロード済みプラグインのインストールを行います。

追加モジュールのダウンロードについては、NetBansのFAQ: FaqDownloadingUCModule に説明があります。そこに記載のWebページ Update Center Content Inspector を開き、追加モジュールのupdate URLを指定すると、ダウンロードページになります。ダウンロードした *.nbm ファイルを、NetBeansの[ツール]→[プラグイン]→[ダウンロード済み]タブを選択し、[プラグインの追加]ボタンを押し、ダウンロードした *.nbm ファイルを指定します。選択後、[インストール]ボタンを押します。

オンライン・マシンでインストールする際、一時的にダウンロードされた *.nbm ファイルをコピーして取っておく手段もあります。一時的にダウンロードしておく場所は、%USERPROFILE%\AppData\Roaming\NetBeans\7.2\update\download\です。更新が完了すると消えてしまうので、プラグイン・インストールの最後で「今すぐIDEを再起動(R)」ではなく、「後でIDEを再起動(L)」を選択し、必要なファイルをコピーしておいてからNetBeansを再度起動します。

品質検証環境SQE

Javaでは、ソースコードの検証を行うツールがいくつもあります。SQE(Software Quality Environment)は、ソースコードのコーディング規約チェックを行うCheckStyle、代表的なバグパターンと照合し、バグパターンに該当するコード箇所を検査するFindBugs、PMD、依存関係を解析するDependency Finderの各ツールをNetBeans用プラグインとして提供します。

やや挙動が不安定ですが(2010/7現在)、使用できるレベルです。

2011年7月22日時点の調査結果
SQE pluginのバージョン  2011/07/06リリース版(hudson-sqe-49)     
 内蔵checkstyleバージョン 5.3 最新版   
 内蔵findbugsバージョン 1.3.9  最新版   
 内蔵PMDバージョン 4.2.5  最新版   

インストール

[ツール]メニュー→[プラグイン]で表示される「プラグイン」ダイアログ上で、[設定]タブを選択し、[追加]ボタンを押し、「アップデートセンターカスタマイザ」ダイアログ上で、名前に適当な「SQE」、URLに以下を指定し、SQEのアップデートセンターを追加します。

http://deadlock.netbeans.org/hudson/job/sqe/lastStableBuild/artifact/build/full-sqe-updatecenter/updates.xml

「プラグイン」ダイアログ上で、[使用可能なプラグイン]タブを選択し、FindBugs、PMD、CheckStyle、Dependency Finderをチェックして[インストール]ボタンを押します。

CheckStyle

デフォルトでは、以下のルールが適用されます。

C:\Users\<ユーザー名>\.netbeans\7.0\config\Preferences\org\nbheaven\sqe\codedefects\checkstyle.xm
注)ユーザーのホームディレクトリはWindows 7の場合です。

現時点(2010/7/18)では、NetBeans上でCheckstyleの定義をカスタマイズするGUIは用意されていませんが、ルール設定ファイルとプロパティ設定ファイルを別途指定することができます。

ルール設定ファイルの変更

とりあえず、上記のcheckstyle.xmlを、名前を変えて保存し(例:custom-checkstyle.xml)、編集します。

[ツール]メニューの[オプション]で、上メニューボタン[Quality]を選択し、[Checkstyle]タブを選択し、Config Fileを[Browse]ボタンを押して上記編集したファイル(例:custom-checkstyle.xml)に変更します。

デフォルトでは少々騒がしいチェック

ファイルが新しい行で終了していません - NewlineAtEndOfFile
http://checkstyle.sourceforge.net/config_misc.html#NewlineAtEndOfFile
POSIXの定義ではテキストファイル(ソースファイル)は行から構成され、行は最後に必ず改行コードが必要です。Javaでは大抵ファイル末尾の行は、}(閉じ波括弧)です。この }の後に改行がないとこの指摘が発生します。
しかし、Windows上でNetBeansを動かしているとき、NetBeansは新規に作成するソースファイルの改行コードをLFとして扱いますが、checkstyleはWindows OSの標準改行コードであるCR+LFでチェックします。その結果、NetBeans上では最終行の末尾に改行を入れていても、CR+LFに合致しないため、この指摘が発生してしまいます。そこで、custom-checkstyle.xmlのNewlineAtEndOfFile定義を以下のように変更します。LFでチェックする設定とすることで、UNIX改行コード(LF)でもWindows改行コード(CR+LF)でもファイル末尾のチェックが正しく可能となります。
    <module name="NewlineAtEndOfFile">
      <property name="lineSeparator" value="lf"/>
    </module>
Line has trailing spaces.(行末に余分な空白があります) - GenericIllegalRegexpRegexpSingleline
行の後ろに余分な空白があるときに指摘が発生します。NetBeansでは、[ツール]メニュー→[オプション]で表示される「オプション」ダイアログで、[エディタ]メニューを選択し、[一般]タブを選択し、When Saving Files 項目で"Removing Trailing Whitespace"欄をデフォルトの[Never]から[Always]に設定しておけば自動で対処できるようになります。が、品質上これを指摘し是正するほどの理由は感じられなかったので、このルールは無効にしたほうがよいでしょう。
custom-checkstyle.xmlのGenericIllegalRegexpRegexpSinglelineをコメントアウト(または削除)します。
       <!-- <module name="RegexpSingleline">
           <property name="format" value="\s+$"/>
           <property name="minimum" value="0"/>
           <property name="maximum" value="0"/>
           <property name="message" value="Line has trailing spaces."/>
       </module> -->
備考) Checkstyle 5.1では、このルールはGenericIllegalRegexpからRegexpSinglelineに変更されています。
Javadocコメントがありません - JavadocMethod, JavadocType, JavadocVariable
Javadocコメントのないクラス宣言、フィールド宣言、メソッド宣言にこの指摘が発生します。しかし、privateでも指摘されてしまいます。Javadocコメントは、クラス利用者のためのドキュメントコメントなので、パッケージをまたがって呼び出し可能なprotected以上でチェックするようにcustom-checkstyle.xmlのJavadocMethod、JavadocType、JavadocVariableの定義を変更します。
        <module name="JavadocMethod">
          <property name="scope" value="protected"/>
        </module>
        <module name="JavadocType">
          <property name="scope" value="package"/>
        </module>
        <module name="JavadocVariable">
          <property name="scope" value="protected"/>
        </module>
最初の一文はピリオドで終わらなければなりません - JavadocStyle
Javadocコメントは、コメントの最初の一文を概要コメントとして特別に認識します。デフォルトでは英文の終了条件で判別され、日本語のときの句点(。)はチェックされません。そこで、日本語でJavadocコメントを記述するときは、文の終了条件に句点を追加します。custom-checkstyle.xmlのJavadocStyleの属性endOfSentenceFormatに追記をコメントアウト(または削除)にプロパティcheckFirstSentenceを指定します。
        <module name="JavadocStyle">
          <property name="checkFirstSentence" value="false"/>
        </module>
以下はうまくいかなかった文終了条件指定
        <module name="JavadocStyle">
          <property name="endOfSentenceFormat" value="([.?!。?][ \t\n\r\f&lt;])|([.?!。?!]$)"/>
        </module>
※上記のように記述すればよいかと思いましたが、これでは日本語の句点が終わりとは認識されませんでした。
行が80文字を越えています - LineLength
1行が80文字を超えるとこの指摘が発生します。80文字制限は、表示に制限のある装置(固定幅のターミナル)でソースコードを閲覧する場合、80桁ドットインパクトプリンタにソースを印字する場合などにおいて行の折り返しが発生するとインデントが崩れ可読性が下がるために設けられたルールです。VT100などの固定幅ターミナルで見ることはほとんどなくなっているし、プリンタも今やほとんどページプリンタです。ページプリンタでもA4縦印刷では80桁程度で折り返しが生じますが、印刷されたソースコードを読むことはIDEのサポートが一切受けられないため(白黒印刷では色もつかない)、IDE上に比べ可読性が低下します。(印刷するにしても、A4横に印刷し、1枚に2または4ページ割り付けした方が見やすいのではと思います)
 とはいえ、あまりに長い行はIDE上でも折り返しが発生するので、ここでは制限する文字数を増やすこととします。
        <module name="LineLength">
          <property name="max" value="136"/>
        </module>
'変数名'がフィールドを隠しています - HidenField
フィールドと同じ変数名をローカル変数で定義しています。これは重要な指摘ですが、NetBeansのヒントで「局所変数がフィールドを隠蔽」にデフォルトでチェックが入っているため、2重指摘になっています。

解析エラー

エラー Got an exception - Unexpected character 0xfffd in identifier が発生する
UTF-8文字コードでソースコードが記述されていると発生します(メソッド名が日本語のとき)。checkstyle.xmlに以下のように文字コードをプロパティ charset で指定します。
    <module name="TreeWalker">
        <property name="charset" value="UTF-8"/>
ルール適用の抑制

Checkstyleには、特定の箇所においてルールを抑制する機能(Suprress)があります。

ルール抑制定義ファイル

まず、checkstyle.xmlにて、<module name="Checker" ...>の子要素として<module name="SuppressionFilter"...>を定義し、その属性で抑制定義をするXMLファイルのパスを指定します。

<module name="Checker">
    :
  <module name="SuppressionFilter">
    <property name="file" value="C:/Users/torutk/.netbeans/7.0/config/Preferences/org/nbheaven/sqe/
codedefects/checkstyle-suppressions.xml"
  </module>
</module>

XMLファイルパスは、相対パスで指定すると、NetBeans起動時のカレントディレクトリ(Windowsなら、ショートカットに定義している作業フォルダ)を基点とするようです。

checkstyle-suppressions.xmlに、抑制したい内容を<suppress>要素で記述していきます。

<?xml version="1.0"?>
<!DOCTYPE suppressions PUBLIC
    "-//Puppy Crawl//DTD Suppressions 1.0//EN"
    "http://www.puppycrawl.com/dtds/suppressions_1_1.dtd">

<suppressions>
  <suppress .../>
    :
</suppressions>
JUnitテストコードでは、メソッド名の命名チェックを行わない
JUnitテストコードの指定は、files属性に正規表現で記述します。ここでは単純にTest.javaで終わる名前をJUnitテストコードと見なしています。
<suppress checks="MethodName" files=".*Test.java"/>
JUnitテストコードでは、Javadocコメントを必須としない
JUnitテストコードは、testディレクトリの下にパッケージ名に対応したディレクトリで置かれるので、ここではtestというディレクトリ名を含むパスをJUnitテストコードと見なしています。
<suppress checks="JavadocMethod" files=".*[\\/]test[\\/]"/>
JUnitテストコードでは、オンデマンド型のインポート宣言を許容する
JUnitコードでは、assert関連のメソッドを多数使用するので、オンデマンド型のインポート宣言を使わないと煩雑となってしまいます。
<suppress checks="AvoidStarImport" files=".*Test.java"/>

ルール抑制コメント

ToDo: 検証未

ソースコード中の該当箇所にコメントを記述する方法です。

public void run() {
    // CHECKSTYLE:OFF
    for (int i = 0; i < 100; i++) {
    // CHECKSTYLE:ON
        doSomething();
    }
}

ルールファイルに以下の記述が必要です。

<module name="TreeWalker">
    :
    <module name="FileContentsHolder"/>
    :
</module>

<module name="SuppressionCommentFilter"/>
checkstyleを最新版の5.3へ入れ替え

SQEをインストールすると、通常以下のフォルダにcheckstyleなどのJARファイルが置かれます。

C:\Users\<ユーザー名>\.netbeans\7.0\modules\ext
注)ユーザーのホームディレクトリはWindows 7の場合です。

この中で、次のファイルを、別途入手したCheckstyle 5.3に含まれるものと入れ替えれば、最新版Checkstyleとなります。

SQEに同梱されるJARファイル  Checkstyle 5.3に同梱されるJARファイル  備考   
checkstyle.jar
checkstyle-5.3.jar
ファイル名をSQEのものに合わせてコピーする     
commons-beanutils-core.jar 
commons-beanutils-core-1.8.3.jar
 
google-collections.jar 
google-collections-1.0.jar
 

FindBugs

ルールの設定はGUIから行えます。

[ツール]→[オプション]で「オプション」ダイアログが表示されるので、[Quality]ボタンを選択、[FindBugs]タブを選択します。

ルール一覧と、各ルールについてチェック対象とするかしないかのチェックボックスが表示されます。任意の設定を行います。ここで設定した内容は、

C:\Users\<ユーザー名>\.netbeans\7.0\config\findbugs\UserPreferences.findbugs

に保存されます。(SQEプラグインインストール直後は存在しない)

ルールの抑制

findbugsのアノテーションedu.umd.cs.findbugs.annotations.SuppressWarnings を使用します。

すべてのルールを抑制する

@edu.umd.cs.findbugs.annotations.SuppressWarnings
public class Foo {
  ..
}

クラス全体でFindbugsのチェックを抑制しています。アノテーションは、クラス以外にもパッケージ、コンストラクタ、メソッド、フィールド、引数、ローカル変数にも適用できます。

特定のルールを抑制する

public class Bar {
    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="URF_UNREAD_FIELD", justification="for extension")
    private int count;
    ..
}
value= でルール名を記述し、justification= で抑制する理由を記述します。
@edu.umd.cs.findbugs.annotations.SuppressWarnings(value={"URF_UNREAD_FIELD", "DM_EXIT"})
public class Hoge {
  ..
}
複数のルール名があるときの記述です。
ルールの抑制 別方法

Findbugsには、データマイニングという機能があります。

ルール抑制を、直接コード解析に指定するのではなく、すべてのルール適用結果を出しておいて、そのデータに対してルール抑制をして抽出する、という方法が実現できるのではないか?と考えてますが、未調査です。

PMD

警告の表示

PMDのルールベースに該当した行に警告アイコンが付きます。マウスを警告アイコンの上に移動すると、警告内容が表示されます。

プロジェクト単位で、PMDの警告一覧が表示されます。[ウィンドウ]メニューの[Quality]→[PMD]を選択すると、PMD警告一覧画面が表示されます。

警告対象ルールの設定

PMDのルールベースのうち適用するルールを設定する、ルールのカスタマイズ画面がプラグインで提供されています。

NetBeans共通のルール設定は次の操作で行えますが、2011/1/12版では機能していません。

[ツール]メニューの[オプション]で、上メニューボタン[Quality]を選択し、[PMD]タブを選択します。ルール一覧表が表示されるので、適用する/しないを[Enabled]列のチェックボックスで指定します。

チェックボックスを外して[了解]を押すと、以下の設定ファイルにチェックを外したルール名が追記されます。

C:\Users\<ユーザー名>\.netbeans\7.0\config\pmd\pmd.settings

ヒント(Quick Fix)から抑止設定したルールは機能する(2010/11/19版)

ソースコードの行番号欄にPMDの警告が付いたとき、一緒に修正のヒント(Quick Fix)が表示されます。ここをクリックすると、[Disable PMD Rule: LocalVariableCouldBeFinal]のように表示されます。このメッセージをクリックすると、次からこのルールによる警告が付かなくなりました。

この設定は、プロジェクト固有のディレクトリ(<プロジェクト基点ディレクトリ>\nbproject\pmd.settings に保存されます。このファイルはデフォルトでは存在せず、最初にルールを抑止するときに生成されるようです。

プロジェクトのプロパティからQuality→PMDでルール一覧から設定すると機能する(2010/11/19版)

上記ヒントから抑止したルールは、このルール一覧表で[Enabled]列のチェックが外れています。プロジェクトごとのルール設定は有効です。

Dependency Finder

PMD

SQEとは別に、PMD開発本家などからNetBeans用のプラグインがリリースされています。SQE版のPMDは、ルール設定をマシン全体で共有することができない(バグ?)ため、プロジェクト毎に保持する必要があります。

PMDプラグイン(本家)

本家プラグインでは、マシン全体で共有することができます。

ダウンロードは以下URLから可能です。

[ツール]→[オプション]で[PMD]タブを選択すると、自動検査実行の可否設定およびルール設定ができます。

Enable scan
自動検査実行可否の設定(チェックボックス)
Rules
使用するルール定義の編集
Rulesets

ルールを変更すると、以下に設定が保存されます。

C:\Users\<ユーザー名>\.netbeans\7.0\config\Preferences\pmd.properties
ルールの抑制

PMDのルール抑制は、ソースコード中にアノテーションまたはコメントを記述します。

アノテーションによる抑制

@SuppressWarnings("PMD")
public class Foo {
  ..
}

クラス全体に対するPMDの検証をすべて無効にします。

@SuppressWarningsはJava標準アノテーションです。また、クラスだけでなくメソッドにも付けられるので、特定のメソッドについてPMDのルールチェックを抑制することもできます。

特定のルールを抑制したい場合は、ルール名を列挙します。

@SuppressWarnings({"PMD.MethodNamingConventions","PMD.ClassNamingConventions"})
public class Bar {
  ..
}

コメントによる抑制

public class Hoge {
    public int count; // NOPMD

EasyPMD2プラグイン

Findbugs統合プラグイン

NetBeans 7.2から、Findbugsが統合されるようになります。ただし、デフォルトではFindbugs統合プラグインはインストールされないので、[ツール]メニュー>[プラグイン]>[使用可能なプラグイン]タブを選択、一覧から[Findbugs Integration]にチェックを付けて[インストール]ボタンを押します。

使用方法は、[ソース]メニュー>[検査...]を選択し、「検査」ダイアログが表示されるので、[スコープ]欄から、現在のプロジェクト/開いているプロジェクト のいずれかを選択、[使用]欄から、[構成]を選択し、[FindBugs]を選択、[検査]ボタンを押してFindBugsによる検証を実行します。

ルールの設定は、「検査」ダイアログの[管理]ボタンを押し、「構成」ダイアログで設定します。

ネットワーク(インターネット)に非接続な環境でのプラグインのインストール

NetBeansのプラグインの標準配布手順はインターネット接続が前提となっています。しかし、開発する場所によっては必ずしもインターネットに接続できません。そのようなときの対応として、プラグイン更新サイトからXMLファイルと必要なnbmファイルを事前にダウンロードしてローカルにアップデートセンターを構築する方法を模索してみました。

NetBeansプラグイン・ダウンローダー

アップデートセンターのXMLファイルへのURLを指定すると、その中に記載されているプラグインファイル(*.nbm)をXMLファイルとともにカレントディレクトリにダウンロードするツールを作成しました。とりあえず上記SQEのダウンロードができるようになったもので、他のプラグインについては未検証です。

実行は、javaコマンドで-jarオプションで上記jarファイルを指定し、コマンドラインオプションにアップデートセンター(XMLファイル)へのURLを指定します。カレントディレクトリにファイルをダウンロードします。

使い方

プロジェクト設定

Javaアプリケーション

スプラッシュ画像を実行可能JARファイルに埋め込み使用する

画像ファイルを、ソースパッケージのどこか適当な場所に置きます。mainメソッドを提供するクラス(デフォルトではMain.java)と同じ場所が一つの候補です。

次に、プロジェクトのmanifest.mfを編集します。プロジェクトツリーではmanifest.mfファイルが非表示なので、ファイルツリーを選択します。プロジェクトの直下にmanifest.mfがあります。以下行を追加します。

SplashScreen-Image: myapp/mysplash.jpg
注意点

NetBeans上で実行/デバッグするときは、スプラッシュ画像が表示されません。

Javadocで概要ページ(overview)を指定する

javadocコマンドはオプション-overviewで、生成されるJavadocのトップページ(概要)の説明を記述するHTMLファイルを指定することができます。「プロジェクト・プロパティ」ダイアログでカテゴリ欄の[構築]>[ドキュメント化]を選択し、右側ペインで追加のJavadocオプション欄に、以下のように記述します。

-overview ${basedir}/${src.dir}/overview.html

なぜか、-overview src/overview.html ではエラーになってしまいました。(コマンドプロンプトからant javadocを起動するとうまくいくが)

なお、このjavadoc設定は、プロジェクト単位でantの設定ファイル(nbproject/project.properties)にjavadoc.additionalparamというキーで保存されます。

参考記事

Javadocで独自タグを使用する

javadocコマンドはオプション-tagまたは-tagletで、標準にはない独自のタグを認識することができます。-tagletは別途タグを解析しドキュメントを生成する追加プログラムを作成する必要があるので、簡単に済ます場合は-tagを指定します。「プロジェクト・プロパティ」ダイアログでカテゴリ欄の[構築]>[ドキュメント化]を選択し、右側ペインで追加のJavadocオプション欄に、以下のように記述します。

-tag pre:tcm:"事前条件" -tag post:tcm:"事後条件" -tag inv:t:"不変条件"

便利な使い方

ソースコード編集

名前の変更

[リファクタリング]メニュー→[名前の変更]からダイアログ上で新しい名前を入れる方法もありますが、エディタ上で変更したい名前の上にカーソルを置いて、Ctrl-R キーを押すと、エディタ上で直接名前変更の過程が見えます。いちいちダイアログ(GUI)が出るよりも、エディタ上で直接変更できる、こちらの方法が便利です。

インタフェースを実装するクラス

implements句の挿入

クラスを新規作成後、クラス定義にimplements句を記述します。

上図のように、クラス名の直後にカーソルがある状態で、Ctrl+スペースキーを押す(または[ソース]メニュー→[コードを補完]を選択する)と、この場所で記述可能なキーワードの候補がでるので、implementsを選択します。

次にimplementsの後ろでCtrl+スペースキーを押すと、上図のように実装可能なインタフェースの一覧がでるので、実装したいインタフェースを選択します。

この状態では、interfaceに定義されたメソッドが実装されていないので、クラスがエラー状態にあります。そこで、クラス定義の行にあるヒントアイコンをクリックします。

すると、インタフェースに定義されているメソッドの仮実装コードが展開されます。

コードテンプレート(コード片の挿入)

あらかじめ登録されたコードテンプレートを挿入します。例を次に示します。

ここで、soutvと入力し

続いてTABキーを押すと、

と、System.out.println文が展開され、最も直前に宣言(≠使用)された変数がprintlnの引数に展開されます。

このような便利なコードテンプレートがデフォルトで用意され、カスタマイズできます。[ツール]メニュー→[オプション]で、[エディタ]アイコンを選択し、[コードテンプレート]タブを選択すると現状の定義を確認でき、ここでカスタマイズができます。

デフォルトで登録されているコードテンプレートの例(抜粋)

よく使いそうなと思ったコードテンプレートを抜粋します。

予約語・リテラル・型名・メソッド名の省略形

ab     abstract
as     assert
bo     boolean
br     break;
cl     class
cn     continue
db     double
df     default:
En     Enumeration
eq     equals
Ex     Exception
ex     extends
f      final
fa     false
fi     final
fl     float
ie     interface
im     implements
in     interface
iof    instanceof
ir     import
le     length
na     native
Ob     Object
Pf     public final                         注)大文字の'P'はpublic
Ps     public static
Psf    public static final
Psfb   public static final boolean
Psfi   public static final int
Psfs   public static final String
pe     protected
pf     private final
pr     private
ps     private static
psf    private static final
psfb   private static final boolean
psfi   pricate static final int
pu     public
pvb    private volatile boolean
re     return
St     String
sh     short
st     static
su     super
sy     synchronized
th     throws
tr     transient
vo     volatile

制御構文の展開

do      do {
        } while (ture);

dowhile 

for     for (int i = 0; i < 10; i++) {
        }

forc    for (Iterator it = col.iterator(); it.hasNext();) {
            Object object = it.next();
        }

fore    for (Object object : col) {
        }

fori    for (int i = 0; i < arr.length; i++) {
            Object object = arr[i];
        }

forl    for (int i = 0; i < lst.size(); i++) {
            Object object = lst.get(i);
        }

form    for (Map.Entry<KeyType, ValType> en : m.entrySet()) {
            KeyType key = en.getKey();
            ValType val = en.getValue();
        }

forst   for (StringTokenizer stringTokenizer = new StringTokenizer(STRING);
            stringTokenizer.hasMoreTokens();) {
            String token = stringTokenizer.nextToken();
        }

forv    for (int i = 0; i < vct.size(); i++) {
            Object object = vct.elementAt(i);
        }

spl     for (String string : string.split(",")) {
        }

if      if (true) {
        }
iff     同上

ife     if (true) {
        } else {
        }

ifelse  

inst    if (this instanceof Object) {
            Object object = (Object) this;
        }

sw      switch (var) {
            case val:
                break;
            default:
                throw new AssertionError();
         }

trycatch   try {
           } catch (Exception e) {
           }

wh      while (true) {
        }
whilexp 同上

whileit    while (it.hasNext()) {
               Object object = it.next();
           }

whilen  while (en.hasMoreElements()) {
            Object object = en.nextElement();
        }
 

式・文の展開

o      Object object = new Object();
n      同上
newo   同上

2al    List<String> list = new ArrayList<String>(Arrays.asList(arr));
2ar    clazz[] arr = coll.toArray(new clazz[coll.size()]);
2do    try {
           DataObject dob = DataObject.find(this);
       } catch (DataObjectNotFoundException ex) {
           .printStackTrace(ex);
       }
2f     File file = FileUtilType.toFile(this);
2fo    FileObject fileObject = FileUtilType.toFileObject(FileUtilType.normalizeFile(f));
2l     List<String> list = Arrays.asList(arr);
2s     Set<String> set = new HashSet<String>(Arrays.asList(arr));
al     List<String> list = new ArrayList<String>();
ll     List<String> list = new LinkedList<String>();
set    Set<String> set = new HashSet<String>();
map    Map<String, String> map = new HashMap<String, String>();
asort  Arrays.sort(Array);
csort  Collections.sort(var);

rn     return null;

sb     StringBuilder stringBuilder = new StringBuilder();
ap     sb.append();
apo    if (sb.length() > 0) {
           sb.append(',');
       }
       sb.append("this=");
       sb.append(this);
as     assert true;


iae    throw new IllegalArgumentException("arg");
ise    throw new IllegalStateException("arg");
npe    throw new NullPointerException("arg");
tw     throw new IllegalStateException();
fy     finally { }

log    Logger.getLogger(Foo.class.getName()).log(Level.INFO, "message");
logb   logger.log(Level.INFO, "bundle_key");
logbp  logger.log(Level.INFO, "bundle_key", this);
logbps logger.log(Level.INFO, "bundle_key", new Object[]{null}));
loge   Logger.getLogger(Foo.class.getName()).log(Level.INFO, "message", ex);
logp   Logger.getLogger(Foo.class.getName()).log(Level.INFO, "message {0}", this);
logr   private static final Logger logger = Logger.getLogger(Foo.class.getName());
logrb  private static final Logger logger = Logger.getLogger(Foo.class.getName(), Foo.class.getPackage().getName() + ".Log");

serr   System.err.println("");
sout   System.out.println("");
soutv  System.out.println("exp = " + exp);
pst    printStackTrace();
tds    Thread.dumpStack();

inst   if (this instanceof Object) {
           Object object = (Object) this;
       }

spl    for (String string : string.split(",")) {
       }

jaxbm  try {
           javax.xml.bind.JAXBContext jaxCtx = javax.xml.bind.JAXBContext.newInstance(this.getClass().getPackage().getName());
           javax.xml.bind.Marshaller marshaller = jaxbCtx.createMarshaller();
           marshaller.setProperty(javax.xml.bind.Marshaller.JAXB_ENCODING, "UTF-8");
           marshaller.setProperty(javax.xml.bind.Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
           marshaller.marshal(this, System.out);
       } catch (javax.xml.bind.JAXBException ex) {
           // XXXTODO Handle exception
           java.util.logging.Logger.getLogger("global").log(java.util.logging.Level.SEVER, null, ex);
       }

jaxbu  try {
           javax.xml.bind.JAXBContext jaxbCtx = javax.xml.bind.JAXBContext.newInstance(this.getClass().getPackage().getName());
           javax.xml.bind.Unmarshaller unmarshaller = jaxbCtx.createUnmarshaller();
           this = (MyClass) unmarshaller.unmarshal(new java.io.File("File path"));
       } catch (javax.xml.bind.JAXBException ex) {
           // XXXTODO Handle exception
           java.util.logging.Logger.getLogger("global").log(java.util.logging.Level.SEVER, null, ex);
       }

クラス・メソッドの展開

fc        final class Type {
              Type() {
              }
          }

ic        class Type {
              Type {
              }
          }

pfc       private final class Type {
              Type() {
              }
          }

psfc      private static final class Type {
              Type() {
              }
          }

sc        static class Type {
              Type() {
              }
          }

sfc       static final class Type {
              Type() {
              }
          }

pue       public enum Type {
          }

m         private static final void method() {
          }

Pfm       public final void method() {
          }

Pm        public void method() {
          }

Psfm      public static final void method() {
          }

pfm       private final void method() {
          }

pm        private void method() {
          }

prfm      protected final void method() {
          }

prm       protected void method() {
          }

prsfm     protected static final void method() {
          }

psfm      private static final void method() {
          }

psm       private static void method() {
          }

psvm      public static void main(String[] args) {
          }

rnn       Runnable runnable = new Runnable() {
              public void run() {
              }
          };

その他

fcom      //<editor-fold defaultstate="collapsed" desc="comment">
          //</editor-fold>

プロジェクト設定

プロジェクトグループ

複数のプロジェクトでひとつのアプリケーションなりシステムを構成する場合、プロジェクトを束ねる機能があると便利です。そのときは、プロジェクトグループを作成し、関係するプロジェクトを追加します。

ライブラリ設定の共有

複数の開発者で共同開発するときの設定共有についてのメモです。

プロジェクトで利用するサードパーティ製ライブラリは、通常ライブラリとして登録してプロジェクト設定で参照します。このプロジェクト設定(デフォルトではAntのビルド定義ファイル)を、リポジトリに登録して開発者同士で共有する場合、サードパーティ製ライブラリの登録名を一致しておかないと、エラーとなります。

NetBeansの場合、ユーザーが追加したライブラリ設定は以下のディレクトリに設定ファイルとして保存されます。

Windows OSの場合のパス

%USERPROFILE%\.netbeans\7.0\config\org-netbeans-api-project-libraries\Libraries\

注記)インストール直後で1度もライブラリを登録していない場合、最後のLibrariesディレクトリが作成されていません。

例えば、eventbus ライブラリを、[ツール]>[ライブラリ]>[新規ライブラリ]でライブラリ名に"EventBus"として設定すると、上記ディレクトリの下に、EventBus.xml という名前の設定ファイルが生成されます。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE library PUBLIC "-//NetBeans//DTD Library Declaration 1.0//EN" "http://www.netbeans.org/dtds/library-declaration-1_0.dtd">
<library version="1.0">
    <name>EventBus</name>
    <type>j2se</type>
    <volume>
        <type>classpath</type>
        <resource>jar:file:/C:/Program%20Files/Java/eventbus/eventbus-1.4.jar!/</resource>
    </volume>
    <volume>
        <type>src</type>
        <resource>jar:file:/C:/Program%20Files/Java/eventbus/eventbus-1.4-sources.jar!/</resource>
    </volume>
    <volume>
        <type>javadoc</type>
        <resource>jar:file:/C:/Program%20Files/Java/eventbus/eventbus-1.4-javadoc.jar!//</resource>
    </volume>
    <volume>
        <type>maven-pom</type>
    </volume>
</library>

このファイルを、他のマシンでそのログインユーザーの同様の場所にコピーすれば、ライブラリ設定を共有することができます。

ただし、このXMLファイル例を見ると分かる通り、JARファイルのパスが絶対パスになっているので、ライブラリのインストール先を合わせておくのがよいと思います。(Windows Vista以降なら、ジャンクション/(真の)シンボリックリンクが使えるので、そちらで回避してもよいかも)

Jenkins(旧Hudson)などの自動ビルドツールで、NetBeans プロジェクトをビルドするときの注意点

NetBeansでデフォルトのAntを使ったプロジェクトを作成し、ライブラリ設定で定義したライブラリを参照する場合、そのプロジェクトとソースをビルドするには、NetBeansをインストールしたユーザーで、かつライブラリ設定が同じく定義されている必要があります。サーバーでApacheやJenkinsユーザーなどの権限で動く場合、そのままAntでビルドするとエラーとなります。

NetBeansでプロジェクトを生成すると、nbprojectの下にbuild-impl.xmlというファイルが生成され、これがAntビルドの大半の設定が書かれたファイルとなります。build-impl.xmlファイルは、nbproject\private\private.properties 他のファイルをインクルードしています。privateディレクトリは、複数開発者でプロジェクト設定を共有するときに、除外する(リポジトリにはあげない)というルールになっています。NetBeansでプロジェクトを開くときに、ユーザー固有の環境で自動で作成されるからです。

このprivateディレクトリが生成された後であれば、コマンドからantでNetBeansプロジェクトをビルドすることができます。しかし、NetBeansでプロジェクトを開かずにビルドしようとしたり、Jenkins等の無人環境でリポジトリからチェックアウトしてビルドするときは、エラーとなることがあります(依存関係がない単純なプロジェクトならうまくいく)。

    <target depends="-pre-init" name="-init-private">
        <property file="nbproject/private/config.properties"/>
        <property file="nbproject/private/configs/${config}.properties"/>
        <property file="nbproject/private/private.properties"/>
    </target>
user.properties.file=C:\\Users\\torutk\\.netbeans\\7.0\\build.properties
libs.EventBus.classpath=C:\\Program Files (x86)\\Java\\eventbus-1.4\\eventbus-1.4.jar
libs.EventBus.javadoc=C:\\Program Files (x86)\\Java\\eventbus-1.4\\eventbus-1.4-javadoc.jar
libs.EventBus.maven-pom=
libs.EventBus.src=C:\\Program Files (x86)\\\eventbus-1.4\\eventbus-1.4-sources.jar

ということで、非NetBeans環境でリポジトリからチェックアウトしてビルドするときは、チェックアウト後、nbprojectディレクトリの下に、private/private.propertiesを作成し、あらかじめ同マシンでNetBeans環境からbuild.propertiesをコピーしてそれを指すuser.properteis.file だけ記述しておけばよさそうです。

問題解決

プロジェクトをスキャン中

T.B.D.

GUIビルダーのパレットが表示されない

なにかの拍子で、[デザイン]モードにしたとき、(GUI)パレットが「読み込み中」の表示のままいつまでたってもGUIコンポーネントが表示されないという状態になってしまいました。

いろいろ現象を探っていき、プロジェクトディレクトリを丸ごと(cp -prコマンドで)別ディレクトリにコピーして開いたら、現象が出なくなりました。そこで、キャッシュディレクトリ(ユーザーのホームディレクトリ/.netbeans/7.0/var/cache)をズバッと削除してみたら現象が消えました。