OracleのJVMは1つの場所にのみインストールされます。誤解されました!
お気づきのとおり、/usr/bin
のJavaコマンド /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands
のバイナリへのシンボリックリンクです。 。そのディレクトリ内のバイナリは、使用するJava VM *を決定し、そのVMバージョン内の対応する実際のバイナリを実行するスタブアプリケーションです。これが、/System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands
内のすべてのバイナリが理由です。 まったく異なる機能を実装していると予想されるにもかかわらず、サイズはほぼ同じです。
dtrace
を使用すると、これが実際に動作していることを確認できます。 :
[email protected]:~$ sudo dtrace -n 'syscall::posix_spawn:entry { trace(copyinstr(arg1)); }' -c "/usr/bin/java -version"
dtrace: description 'syscall::posix_spawn:entry ' matched 1 probe
dtrace: pid 44727 has exited
CPU ID FUNCTION:NAME
8 619 posix_spawn:entry /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/bin/java
指定されたdtrace
呼び出しにより、パス引数がposix_spawn
に出力されます。 java -version
によって呼び出されたとき 。私の場合、スタブアプリケーションは/System/Library/Java/JavaVirtualMachines/1.6.0.jdk
でAppleのJava1.6ランタイムを検出しました。 そのバージョンのjava
を呼び出しています コマンド。
スタブバイナリには、もう1つの利点があります。JavaVMがインストールされていないことを検出すると、ユーザーにJavaVMのインストールを求めるプロンプトが表示されます。
CurrentJDK
について シンボリックリンク、AppleがOS X上のJVMの唯一のソースであった過去との下位互換性のために、これを私が知ることができる限り最善です。
*使用するJavaVMを決定する際には、要素の組み合わせが考慮されます。 JAVA_HOME
設定されている場合に使用されます(JAVA_HOME=/tmp java
を試してください )。 JAVA_HOME
の場合 が設定されていない場合、システム上のすべての仮想マシンのリストが検出されます。 JAVA_VERSION
およびJAVA_ARCH
環境変数は、設定されている場合、仮想マシンのリストを特定のバージョンおよびサポートされているアーキテクチャにフィルタリングするために使用されます。結果のリストは、アーキテクチャ(32ビットよりも64ビットを優先)とバージョン(新しい方が良い)で並べ替えられ、最適な一致が返されます。