Oracle's JVM is slechts op één locatie geïnstalleerd. Je bent misleid!
Zoals je hebt opgemerkt, zijn de Java-commando's in /usr/bin
zijn symbolische links naar binaire bestanden in /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands
. De binaire bestanden in die map zijn stub-applicaties die bepalen welke Java-VM moet worden gebruikt*, en vervolgens het overeenkomstige echte binaire bestand binnen die VM-versie uitvoeren. Dit is de reden waarom alle binaire bestanden in /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands
zijn bijna identiek in grootte, ondanks het feit dat je zou verwachten dat ze een heel andere functionaliteit zouden implementeren.
Je kunt dit in actie zien door dtrace
. te gebruiken :
[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
De gegeven dtrace
aanroep drukt het padargument af naar posix_spawn
wanneer het wordt aangeroepen door java -version
. In mijn geval heeft de stub-toepassing de Java 1.6-runtime van Apple gevonden in /System/Library/Java/JavaVirtualMachines/1.6.0.jdk
en roept die versie van de java
. op commando.
De stub-binaire bestanden hebben nog een ander voordeel:wanneer ze detecteren dat er geen Java VM is geïnstalleerd, zullen ze de gebruiker vragen er een te installeren.
Wat betreft de CurrentJDK
symlink, zo goed als ik dit kan zeggen omwille van achterwaartse compatibiliteit met het verleden toen Apple de enige bron van de JVM op OS X was.
* Bij het bepalen welke Java-VM moet worden gebruikt, wordt rekening gehouden met een combinatie van factoren. JAVA_HOME
wordt gebruikt indien ingesteld (probeer JAVA_HOME=/tmp java
). Als JAVA_HOME
niet is ingesteld, wordt de lijst met alle virtuele machines op het systeem ontdekt. De JAVA_VERSION
en JAVA_ARCH
omgevingsvariabelen worden, indien ingesteld, gebruikt om de lijst met virtuele machines te filteren op een bepaalde versie en ondersteunde architectuur. De resulterende lijst wordt vervolgens gesorteerd op architectuur (bij voorkeur 64-bit boven 32-bit) en versie (nieuwer is beter), en de beste overeenkomst wordt geretourneerd.