Java

Mac OSXにOpenJDKをインストール #openjdk #java7

Mac OSXにOpenJDKを入れてみました。
ソースコードからビルドしなければいけないと思っていたけれども既にインストーラが用意されていて簡単です。

1. インストーラをダウンロード
以下のページより OpenJDK-OSX-1.7-universal-2011MMDD.dmg をダウンロード。
以前は32bit版と64bit版で分かれていましたがおとといユニーバーサルバイナリがリリースされたようです。
Downloads – openjdk-osx-build – Build and package scripts for OpenJDK 1.7 under OS/X – Google Project Hosting

2. .dmgをダブルクリックし、インストーラを起動
Java7正式リリースを目前にDukeも上機嫌のご様子。

3. インストール完了
フツーのインストーラです。簡単。

4. 確認
Appleより提供されているJVMは通常 /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home に置いてありますが、OpenJDKは /Library/Java/JavaVirtualMachines/openjdk-1.7-x86_64/Contents/Home に配置されるようです。

/Applications/Utilities/Java Preferences.app からもちゃんと認識されていますね。

32ビット版と64ビット版が別々に認識されているのはいいとして・・なぜか3つ認識されてます。・・???まいっか。

5. JAVA_HOMEの設定
JAVA_HOMEを設定すればok。

$ java -version
java version “1.6.0_26”
Java(TM) SE Runtime Environment (build 1.6.0_26-b03-384-10M3425)
Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02-384, mixed mode)
$ export JAVA_HOME=/Library/Java/JavaVirtualMachines/openjdk-1.7-x86_64/Contents/Home/
$ java -version
openjdk version “1.7.0-internal”
OpenJDK Runtime Environment (build 1.7.0-internal-henri_2011_06_24_19_03-b00)
OpenJDK 64-Bit Server VM (build 21.0-b16, mixed mode)

6. アプリケーションの起動
を起動してみます。

$ java -jar samurai.jar
java.awt.HeadlessException
at java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:202)
at java.awt.Window.(Window.java:534)
at java.awt.Frame.(Frame.java:420)
at java.awt.Frame.(Frame.java:385)
at javax.swing.JFrame.(JFrame.java:180)
at samurai.swing.MainFrame.(MainFrame.java:93)
at samurai.swing.Samurai$1.run(Samurai.java:33)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:705)
at java.awt.EventQueue.access$000(EventQueue.java:101)
at java.awt.EventQueue$3.run(EventQueue.java:666)
at java.awt.EventQueue$3.run(EventQueue.java:664)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:675)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

はい、ダメでした。
HeadlessExceptionは通常 -Djava.awt.headless=true (サーバなどでGUIがない環境)を指定しているのにSwingやAWTのウインドウを表示しようとした際に投げられる例外です。つまりまだMac版のOpenJDKはサーバサイド用途にしか使えない???

試しに headless=false と指定してみたところ一X11が起動した後クラッシュしました。

$ java -Djava.awt.headless=false -jar samurai.jar
Trace/BPT trap

クラッシュレポートをみるとスレッド17、com.apple.CoreFoundation#__CFInitialize で落ちているみたい。

OSX OpenJDK7 crash report — Gist

ひとまずヘッドレスでは動くので自宅サーバにも入れてみようと思います。

7. IntelliJ IDEA で認識させる
IntelliJ IDEA はもちろんJava7に対応済みです。
設定は簡単でFile → Project Structure → SDKs → 右ペインの+ボタン → JSDK を選択し、/Library/Java/JavaVirtualMachines/openjdk-1.7-x86_64/Contents/Home/を指定します。

ただ、Mac のJVMはディレクトリ構成がちょっと異なるので標準API(java.*, javax.*)をそのままでは認識してくれません。
Classpathタブの[Add…]ボタンより、Contents/Home/jre/lib/rt.jar も付け加えます。

OpenJDKを指定し、rt.jar をクラスパスに追加したところ。

あとはJava7を多いに楽しむだけ!

ちなみにソースコードからビルド、インストールするのも比較的簡単です。以下の頁にステップバイステップで説明されています。
Mac OS X Port – OpenJDK – wikis.sun.com