Oracle JVM je nainstalován pouze na jednom místě. Byli jste uvedeni v omyl!
Jak jste si všimli, příkazy Java v /usr/bin jsou symbolické odkazy na binární soubory v /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands . Binární soubory v tomto adresáři jsou stub aplikace, které určují, který virtuální počítač Java se má použít*, a poté spouštějí odpovídající skutečné binární soubory v rámci této verze virtuálního počítače. To je důvod, proč všechny binární soubory v /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands mají téměř identickou velikost, a to navzdory skutečnosti, že byste očekávali, že implementují zcela odlišné funkce.
Můžete to vidět v akci pomocí 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
Daný dtrace vyvolání vypíše argument cesty k posix_spawn když je volána java -version . V mém případě aplikace stub našla běhové prostředí Apple Java 1.6 v /System/Library/Java/JavaVirtualMachines/1.6.0.jdk a vyvolává tuto verzi java příkaz.
Binární soubory stub mají také další výhodu:když zjistí, že není nainstalován žádný Java VM, vyzve uživatele, aby si ho nainstaloval.
Pokud jde o CurrentJDK symlink, jak nejlépe to mohu říct, kvůli zpětné kompatibilitě s minulostí, kdy byl Apple jediným zdrojem JVM na OS X.
* Při určování, který Java VM by měl být použit, se bere v úvahu kombinace faktorů. JAVA_HOME se používá, pokud je nastaveno (zkuste JAVA_HOME=/tmp java ). Pokud JAVA_HOME není nastaven, pak se zjistí seznam všech virtuálních počítačů v systému. JAVA_VERSION a JAVA_ARCH Proměnné prostředí se používají, pokud jsou nastaveny, k filtrování seznamu virtuálních strojů podle konkrétní verze a podporované architektury. Výsledný seznam je poté seřazen podle architektury (upřednostňuje 64bitovou před 32bitovou) a verzí (novější je lepší) a vrátí se nejlepší shoda.