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
:
[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
. В моя случай приложението-крайник е намерило времето за изпълнение на 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-битова) и версия (по-нова е по-добра) и се връща най-доброто съвпадение.