Snow Leopard に JDK1.5をインストール | Home | 月額4500円のHaaS ソフトバンクテレコムのクラウド
2009/11/17 2:28 | 印刷

前回のエントリーで、Mac OSXのJava環境の切り替えメカニズムがどうも複雑なことがわかりました。
システムの設定であるJava Preferences.appで優先順を指定する方法と、CurrentJDKなどのシンボリックリンクをターミナルで変更する方法、どれが正しいのか? JAVA_HOMEは必要なのか?などなど、もう少し知っておきたいのでいくつか実験というか検証をしてみました。

コマンドで「java -version」として簡易チェックをしてもIDEなどJavaベースのアプリケーションでは別のJavaが使用されるなど、不可解な面も多かったのでコマンドラインとアプリケーションの2つを別々に検証をしています。

まず頻繁に出るパスが長いのでカレントディレクトリを、
 /System/Library/Frameworks/JavaVM.framework/Versions/
として説明してます。


[コマンドラインでのJava]

whichコマンドでわかるように基本は/usr/bin/java なのですが、
 -> Current/Commands/java -> A/Commands/java
というリンクで辿られています。これは実際以下のような挙動をしています。

 1.Java Preferencesの優先順位にもとづき環境を決定する
 2.環境変数にJAVA_HOMEがあればそちらの環境を優先する
また、Java Preferencesを切り替えても、シンボリックリンクもディレクトリAの内容も全く書き換えられていないことから「A/Commands/* はスタブのようなもの」と予想できます。Linuxでいう所のalternativesとは少し違う気がするし、また古いOSXの資料ではここがスクリプトだという記述もあったのでスタブプログラムと思って良いと思います。

なのでCurrentあるいはAに実体をコピーしたりリンクすれば変更することができるという情報にも納得が出来ますが、これだと以降Java Preferencesの設定は完全に無効になるのでやってはならないことですね。

特に1.2.の挙動ルールはコマンドラインの場合でハマるポイントであり、特に環境変数JAVA_HOMEがあるとそれが使われるというのが盲点ではないでしょうか。


[アプリケーションでのJava]

ランチャーなどでアプリケーションが個々に実装できることもあり、さらに複雑になってきます。以下のような複数のパターンが考えられそれぞれに挙動が異なります。
1.規定のJAVA_HOMEパスを使用
一般的な環境変数JAVA_HOMEを参照する。ここに指定するパスは以下のようなパスを入れるのが慣習になっている。
/Library/Java/Homeまたはそのリンク先であるCurrentJDK
この場合CurrentJDKを変更することで環境が変わります。

2.ハードコードされたパス
これは最悪のパターン。CurrentJDKを経由するパスであればかろうじて環境の
切り替えが可能。でもその多くはJAVA_HOMEと同じ、/Library/Java/Homeではないかと、よってこの場合もCurrentJDKを変更することで環境が変わるということになります。

3.コマンドラインでJava起動(exec)
通常のJavaアプリならUnixならシェルコマンド、つまりjava(/usr/bin/java)+引数で起動されると思います。
この場合、Java Preferencesの設定で切り替えが可能です。

4.基本はシステムのデフォルトで独自カスタマイズ可能
NetBeans6.7以降がそうですが、基本はシステム設定であるJava Preferencesの設定で切り替えが可能で、必要に応じ起動パラメータか設定ファイルによってカスタマイズが可能になっています(Appleの推奨ではinfo.plistに記述、NB6.7は独自)。
Apple JDKのどのバージョンが有効かはシステムプロパティで取得出来ます。
ということで、
CurrentJDKはシステムでリンクを変更することはありませんが、1.2.のような経緯から残しており、これは手動で変更するほかないということです。一般のJavaアプリならおそらく3.で起動されるのでコマンドで何かする必要はないでしょう。問題の多くはIDEなどJDKのライブラリを使用するプログラムで、これらについてはそのドキュメントをよく読んでおく必要がありますね。

とにかく、Macではシステムで用意しているJava Preferencesの設定で切り替えるのが本来の使い方ですし、ここに書いていない参照も沢山あったので、CurrentJDKなどのシンボリックリンクはなるべく変えないのが得策かと思います。

コメント追加

タイトル
名前
E-mail
Webサイト
本文
情報保存 する  しない
  • 情報保存をすると次回からお名前等を入力する手間が省けます。
  • E-mailは公開されません - このエントリーの新規コメント通知が必要なら記入します。