La JVM di Oracle è installata solo in una posizione. Sei stato fuorviato!
Come hai notato, i comandi Java in /usr/bin
sono collegamenti simbolici ai binari in /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands
. I binari all'interno di quella directory sono applicazioni stub che determinano quale Java VM utilizzare*, quindi eseguono il corrispondente binario reale all'interno di quella versione della VM. Questo è il motivo per cui tutti i binari all'interno di /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands
hanno dimensioni quasi identiche, nonostante ti aspetteresti che implementino funzionalità abbastanza diverse.
Puoi vederlo in azione usando 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
Il dato dtrace
l'invocazione stampa l'argomento del percorso in posix_spawn
quando viene chiamato da java -version
. Nel mio caso l'applicazione stub ha trovato il runtime Java 1.6 di Apple in /System/Library/Java/JavaVirtualMachines/1.6.0.jdk
e sta invocando quella versione di java
comando.
Gli stub binari hanno anche un altro vantaggio:quando rilevano che nessuna Java VM è installata, chiederanno all'utente di installarne una.
Per quanto riguarda il CurrentJDK
collegamento simbolico, come meglio posso dire per motivi di compatibilità con le versioni precedenti con il passato quando Apple era l'unica fonte della JVM su OS X.
* Viene considerata una combinazione di fattori quando si determina quale Java VM deve essere utilizzata. JAVA_HOME
viene utilizzato se impostato (prova JAVA_HOME=/tmp java
). Se JAVA_HOME
non è impostato, quindi viene rilevato l'elenco di tutte le macchine virtuali sul sistema. Il JAVA_VERSION
e JAVA_ARCH
le variabili di ambiente vengono utilizzate, se impostate, per filtrare l'elenco delle macchine virtuali in base a una versione particolare e all'architettura supportata. L'elenco risultante viene quindi ordinato per architettura (preferendo 64 bit rispetto a 32 bit) e versione (più recente è migliore) e viene restituita la corrispondenza migliore.