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
:
[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
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.