torutkのブログ

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

自宅PC(Windows)のJava環境メモ(JDK7/JDK8, NetBeans IDE)

JDKJava SE 開発キット)

自宅PC(Windows 8 64bit)のJDKを、Java SE 7 u21にアップデートしました。OSは64bit版ですが、JDKは32bit版と64bit版の両方をインストールしています。Javaで書かれたプログラム(クラスファイル)だけなら64bit版Javaだけインストールしていれば動きますが、ネイティブコードを伴うプログラムは32bit版ネイティブコードの場合32bit版Javaが必要になるので両方をインストールしています。

次に、Java SE 8の早期アクセス版(毎週公開されているJDK8の開発途上版)をインストールしました。本日時点では、2013-05-02付けのBuild b88版が最新です。以下URLで公開されています。

早期アクセス版のインストールでは、インストーラ上でインストールする機能から[Public JRE]を除外(×「この機能は使用できなくなります」を選択)しておくとよいでしょう。

Java SE 8は正式版のリリース予定が当初の今年秋から来年春に延期されていますが、JDK8の新しい言語仕様やAPIを実際に使うことができるので、新機能に興味ある方はここから入手していろいろいじってみると面白いと思います。まだ一部機能が載っていませんが、今後の予定が次のURLで公開されています。

NetBeans IDE開発版

NetBeans IDE上でJava SE 8の新しい言語仕様を使いたい場合、最新リリース版のNetBeans IDE 7.3はまだJava SE 8言語仕様に対応していないので、NetBeans IDE開発版(次のバージョンに向けた開発途上版、ほぼ毎晩ビルドされたものが公開)を入手してインストールします。NetBeans IDEのダウンロードページ(次のURL)で右上のバージョン選択を[開発版]にすると、開発版ダウンロードができます。

NetBeans IDEはインストール時に使用するJDKを探して確認ダイアログを表示します。ここでJDK8が選ばれなかった場合、ここで手動で変更するか後でコマンドラインオプションまたはNetBeans設定ファイルでJDK8を使用するよう指定します。

コマンドラインオプションの場合は、--jdkhome で使用するJDKディレクトリを指定します。NetBeans設定ファイルの場合は、\etc\netbeans.confの中でnetbeans_jdkhome行を変更します。

NetBeansは、正式版と開発版は別ディレクトリにインストールされるので、両方インストールしても問題はありません。なお、開発版を起動時に「前のバージョンの設定を引き継ぐか?」的なことを聞かれた場合、「いいえ」にしておくとトラブルが少ないです。

本日時点の最新JDK8早期アクセス版とNetBeans IDE開発版は喰い合わせが悪い

コマンドラインオプションでJDK8を指定しても、なぜかJDK7で立ち上がってしまい、NetBeans設定ファイルにJDK8を指定したら今度はキャプション表示後落ちてしまいました。NetBeansの起動ログを見ると、

java.lang.IllegalStateException: java.lang.IllegalAccessException: Class 
org.openide.util.WeakListenerImpl$ProxyListener can not access a member of class 
org.openide.filesystems.$Proxy0 with modifiers "public"

	at org.openide.util.WeakListenerImpl$ProxyListener.<init>(WeakListenerImpl.java:423)
  :(以下略)

とエラーで落ちています。IllegalAccessExceptionということで、最近のJavaのセキュリティ脆弱性対応が思い浮かびます。

調べてみると、NetBeansのバグにこの現象が登録されていました(2013-04-29付)。

JDK8 b87で入った修正(dynamic proxyのアクセス制御はJava言語仕様のそれに従うべし)が原因のようです。

でもNetBeans IDE開発版自体はJDK7で動かしてJDK8のプログラムを記述することはできる

NetBeans IDE開発版をJDK7で動かし、JavaプラットフォームとしてJDK 8(またはJDK 8 Lambda)を作成し、プロジェクト・プロパティでJavaプラットフォームをJDK 8に指定してみたところ、Javaエディタでラムダ式が認識されました。コンソール実行もOKです。

あわよくばJavaFXも?と動かそうとしてみたところ、jfxrt.jarが「壊れている参照」となっています。jdk8のディレクトリをざっと見ると確かにjfxrt.jarがありません。おや、jarファイル名も変わる変化があったのでしょうか。