JVM на Oracle е инсталиран само на едно място. Бяхте подведени!
Както отбелязахте, Java командите в /usr/bin са символни връзки към двоични файлове в /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands . Двоичните файлове в тази директория са заглушки приложения, които определят коя Java VM да се използва* и след това изпълняват съответния реален двоичен файл в тази версия на VM. Ето защо всички двоични файлове в /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands са почти идентични по размер, въпреки факта, че бихте очаквали да имплементират доста различна функционалност.
Можете да видите това в действие, като използвате dtrace :
example@sqldat.com:~$ 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 . В моя случай приложението-крайник е намерило времето за изпълнение на Java 1.6 на Apple в /System/Library/Java/JavaVirtualMachines/1.6.0.jdk и извиква тази версия на java команда.
Двоичните файлове на мъничките имат и друго предимство:когато открият, че не е инсталирана Java VM, те ще подканят потребителя да инсталира такава.
Що се отнася до CurrentJDK symlink, доколкото мога да кажа това в името на обратната съвместимост с миналото, когато Apple беше единственият източник на JVM на OS X.
* Комбинация от фактори се взема предвид, когато се определя коя Java VM трябва да се използва. JAVA_HOME се използва, ако е зададено (опитайте JAVA_HOME=/tmp java ). Ако JAVA_HOME не е зададен, тогава се открива списъкът с всички виртуални машини в системата. JAVA_VERSION и JAVA_ARCH променливите на средата се използват, ако са зададени, за филтриране на списъка с виртуални машини до определена версия и поддържана архитектура. След това полученият списък се сортира по архитектура (предпочита се 64-битова пред 32-битова) и версия (по-нова е по-добра) и се връща най-доброто съвпадение.