JVM Oracle hanya diinstal di satu lokasi. Anda telah disesatkan!
Seperti yang telah Anda catat, perintah Java di /usr/bin
adalah symlink ke binari di /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands
. Binari dalam direktori tersebut adalah aplikasi rintisan yang menentukan VM Java mana yang akan digunakan*, dan kemudian menjalankan biner nyata yang sesuai dalam versi VM tersebut. Inilah sebabnya mengapa semua binari dalam /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands
ukurannya hampir sama, meskipun Anda mengharapkan mereka mengimplementasikan fungsi yang sangat berbeda.
Anda dapat melihat ini beraksi dengan menggunakan 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
yang diberikan doa mencetak argumen jalur ke posix_spawn
ketika dipanggil dengan java -version
. Dalam kasus saya, aplikasi rintisan telah menemukan runtime Java 1.6 Apple di /System/Library/Java/JavaVirtualMachines/1.6.0.jdk
dan menjalankan versi java
perintah.
Binari stub juga memiliki manfaat lain:ketika mendeteksi bahwa tidak ada Java VM yang diinstal, mereka akan meminta pengguna untuk menginstalnya.
Adapun CurrentJDK
symlink, sebaik yang saya tahu ini demi kompatibilitas mundur dengan masa lalu ketika Apple adalah satu-satunya sumber JVM di OS X.
* Kombinasi faktor dipertimbangkan saat menentukan Java VM mana yang harus digunakan. JAVA_HOME
digunakan jika disetel (coba JAVA_HOME=/tmp java
). Jika JAVA_HOME
tidak diatur maka daftar semua mesin virtual pada sistem ditemukan. JAVA_VERSION
dan JAVA_ARCH
variabel lingkungan digunakan, jika disetel, untuk memfilter daftar mesin virtual ke versi tertentu dan arsitektur yang didukung. Daftar yang dihasilkan kemudian diurutkan berdasarkan arsitektur (lebih memilih 64-bit daripada 32-bit) dan versi (lebih baru lebih baik), dan kecocokan terbaik dikembalikan.