torutkのブログ

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

Apache incubetorプロジェクトから提供されるNetBeans 9.0 betaを動かすまで

NetBeans IDEは、1996年のチェコの学生プロジェクトが発端となったJava開発ツールで、1999年にSun Microsystemsに買収され、オープンソースプロジェクトとして運営されてきました。OracleによるSun Microsystems買収後はOracleが引き継いでいましたが、バージョン8.2のリリースを最後にApacheソフトウェア財団に譲渡されました。

現在、Apache Incubatorプロジェクトの下で譲渡後の最初のリリースになる9.0の準備が進められています。NetBeans IDEのライセンスは、Oracleの下ではCDDLおよびクラスパス例外付きGPLv2のデュアルライセンスでしたが、Apacheに譲渡後はAPL2になります。

なお、このライセンスの変更作業ですが、すべてのソースファイルの先頭コメントにあるライセンスヘッダーを書き換えるなど手間がかかるものです。

NetBeans の行方

NetBeansは開発環境(IDE)だけでなく、主にデスクトップ向けアプリケーションの開発基盤としても利用されています。次のURLにNetBeans Platform上に構築されたアプリケーション例が多数紹介されています。航空宇宙・輸送・防衛・石油ガス・地理空間・農業・、、、など多数の分野での利用例が掲載されています。

NetBeansApache墓場行きと揶揄されることもありますが、IDEだけでなくPlatformの利用も含めて考えれば、特に不安・危惧することはないのかと思います。

NetBeans IDEの入手(ベータ版)

ここから、次のアーカイブファイルがダウンロードできます*1

これを、任意の場所に展開します。

Windows OS上で実行する場合は、展開した中にあるbin\netbeans64.exeを実行します。MacUNIXでは、bin\netbeans を実行します。

設定

NetBeans IDEを展開した中にある、etc\netbeans.confに必要事項を記述します。
netbeans.confに書く可能性の高い項目は次と思います。

No. 項目名 デフォルト値
1 netbeans_default_userdir "${DEFAULT_USERDIR_ROOT}/dev"
2 netbeans_default_cachedir "${DEFAULT_CACHEDIR_ROOT}/dev"
3 netbeans_jdkhome コメントアウト

No.1と2は、開発バージョン(プレリリース)を複数使うときに場所を変えておきます。古い開発バージョンを削除して新しい開発バージョンを入れる場合は、変更しなくてもよいですが、このディレクトリ下のデータを削除しておきます。

No.3は、デフォルトのパスにあるJavaではないJDKを使うときに指定します。

Windows 10 での設定例

Oracle JDK 1.8.0u162, JDK-9.0.4 をインストールしているWindows 10(64bit版)での設定です。コマンドプロンプトからjavaコマンドを実行すると、JDK-9.0.4のjavaが実行される環境です。

また、NetBeans IDE 開発版(201709300002)を入れている環境です。

JDK 9.0.4で実行するので、No.3のnetbeans_jdkhomeは設定不要設定が必要です。
No.1と2は、既に入れているNetBeans IDE 201709300002 とバッティングしないように変更します。

netbeans_default_userdir="${DEFAULT_USERDIR_ROOT}/9.0-beta"
netbeans_default_cachedir="${DEFAULT_CACHEDIR_ROOT}/9.0-beta"

ちなみに、Windows環境でのDEFAULT_USERDIR_ROOTは、%APPDATA%\NetBeansを、DEFAULT_CACHEDIR_ROOTは、%LOCALAPPDATA%\NetBeans\Cacheを指します。

ベータの起動(初起動)

Windows 10(64bit版)、JDK 8u162とJDK-9.0.4が入っている環境で起動しました。インストール後の最初に起動すると、「License Agreement」画面が表示されます。
Apache Licenseとなっています。

次に、以前のバージョンのNetBeansが存在していると、設定を引き継ぐか聞いてきます。バージョンが違う場合に設定を引き継ぐと支障がでたことがあったので、ここでは引き継がない([No]ボタンをクリック)ようにします。

NetBeansのスプラッシュ画面が表示されます。正式リリースではないので、バージョン番号ではなく、「DEVELOPMENT VERSION」と表示されています。

NetBeans IDEの画面が表示されますが、その上に次のモーダルダイアログ「Java features limited」が表示されます。

これは、JDK 8でNetBeansを起動したときに表示されるそうなのですが(次のきしださんの日記参照)、なぜか出ています。

いったん[Cancel]して進めてみました。NetBeans IDE画面の[Help]メニュー > [About]をクリックすると「About」ダイアログが表示されます。ここにNetBeansを起動したJavaVMのバージョンが載っています。これを見ると、なんとJDK 8u162で動いています。あれ?

ということで、netbeans.confの設定No.3のnetbeans_jdkhomeをコメントアウトから解除し、JDK-9.0.4のパスを指定することとします。

netbeans_jdkhome="C:/Program Files/Java/jdk-9.0.4"

NetBeans IDEを起動して、[Help]メニュー > [About]をクリックすると次の通りJDK-9.0.4で動作しています。

起動したNetBeans画面は次のとおりです。メニューが英語となっています。

JDK 9で起動した場合、NetBeansの通知領域にnb-javac libraryをインストールするよう通知メッセージがしばらく表示されます。

nb-java libraryがないと後述のように支障が出るので、入れておくのがよいでしょう。

nb-javac libraryのインストールについて

JDK 9でNetBeansを起動し、nb-javac libraryをインストールしない状態で、Java SE 9で導入されたJava Platform Module Systemのmodule-info.javaを編集しようとしたところ、例外がばしばし発生しました。

[Show Details]ボタンを押すと、次のスタックトレースが表示されます。

java.lang.NullPointerException
	at jdk.compiler/com.sun.tools.javac.code.Symtab.lookupPackage(Symtab.java:644)
	at jdk.compiler/com.sun.tools.javac.code.Symtab.packageExists(Symtab.java:723)
	at jdk.compiler/com.sun.tools.javac.comp.TypeEnter$HeaderPhase.runPhase(TypeEnter.java:833)
	at jdk.compiler/com.sun.tools.javac.comp.TypeEnter$Phase.doCompleteEnvs(TypeEnter.java:270)
	at jdk.compiler/com.sun.tools.javac.comp.TypeEnter$Phase.completeEnvs(TypeEnter.java:245)
	at jdk.compiler/com.sun.tools.javac.comp.TypeEnter$Phase.completeEnvs(TypeEnter.java:254)
	at jdk.compiler/com.sun.tools.javac.comp.TypeEnter$Phase.completeEnvs(TypeEnter.java:254)
	at jdk.compiler/com.sun.tools.javac.comp.TypeEnter.complete(TypeEnter.java:195)
	at jdk.compiler/com.sun.tools.javac.code.Symbol.complete(Symbol.java:633)
	at jdk.compiler/com.sun.tools.javac.code.Symbol$ClassSymbol.complete(Symbol.java:1314)
	at jdk.compiler/com.sun.tools.javac.comp.Enter.complete(Enter.java:577)
	at org.netbeans.lib.nbjavac.services.NBJavadocEnter.main(NBJavadocEnter.java:66)
	at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.enterTrees(JavaCompiler.java:1052)
	at org.netbeans.modules.java.hints.spiimpl.Utilities.constructScope(Utilities.java:764)
	at org.netbeans.modules.java.hints.spiimpl.pm.PatternCompiler.compile(PatternCompiler.java:38)
	at org.netbeans.modules.java.hints.spiimpl.hints.HintsInvoker.doComputeHints(HintsInvoker.java:535)
	at org.netbeans.modules.java.hints.spiimpl.hints.HintsInvoker.computeHintsImpl(HintsInvoker.java:283)
	at org.netbeans.modules.java.hints.spiimpl.hints.HintsInvoker.computeHints(HintsInvoker.java:228)
	at org.netbeans.modules.java.hints.spiimpl.hints.HintsInvoker.computeHints(HintsInvoker.java:193)
	at org.netbeans.modules.java.hints.spiimpl.hints.HintsInvoker.computeHints(HintsInvoker.java:166)
	at org.netbeans.modules.java.hints.spiimpl.hints.HintsInvoker.computeHints(HintsInvoker.java:128)
	at org.netbeans.modules.java.hints.spiimpl.hints.HintsTask.run(HintsTask.java:114)
	at org.netbeans.modules.java.hints.spiimpl.hints.HintsTask.run(HintsTask.java:65)
[catch] at org.netbeans.modules.java.source.JavaSourceAccessor$CancelableTaskWrapper.run(JavaSourceAccessor.java:273)
	at org.netbeans.modules.parsing.impl.TaskProcessor.callParserResultTask(TaskProcessor.java:561)
	at org.netbeans.modules.parsing.impl.TaskProcessor$RequestPerformer.run(TaskProcessor.java:786)
	at org.openide.util.lookup.Lookups.executeWith(Lookups.java:279)
	at org.netbeans.modules.parsing.impl.TaskProcessor$RequestPerformer.execute(TaskProcessor.java:702)
	at org.netbeans.modules.parsing.impl.TaskProcessor$CompilationJob.run(TaskProcessor.java:663)
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:514)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:1418)
	at org.netbeans.modules.openide.util.GlobalLookup.execute(GlobalLookup.java:45)
	at org.openide.util.lookup.Lookups.executeWith(Lookups.java:278)
	at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:2033)

そこで、nb-javac libraryをインストールします。

*1:このアーカイブファイルは、https://dist.apache.org/repos/dist/dev/incubator/netbeans/incubating-netbeans-java/ で公開されている beta-rc3 と内容同一です。