Capire Java di Oracle su Mac

Ho usato Java su OS X per molti, molti anni e recentemente, quando Apple ha smesso di includere Java per impostazione predefinita, lascio andare il sistema operativo e installarlo per me (varietà Apple, ovviamente).

Quindi ora sto usando OS X 10.8 e ho bisogno di installare Java 7, quindi ho appena ricevuto l’aggiornamento 15 di Oracle in formato DMG e ho eseguito il programma di installazione. Ha aggiornato il mio / usr / bin / java (e file correlati) per puntare qui:

/System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java 

Tracciandoli a ‘/System/Library/Framework/JavaVM.framework/Versions’ tutto punta a ‘Current’ o ‘CurrentJDK’, il primo è un link a ‘A’ (che è Oracle Java 7, da quello che posso dimmi, non sono sicuro del motivo per cui è “A”) e quest’ultimo è un collegamento a Java 6 di Apple in “/System/Library/Java/JavaVirtualMachines/1.6.0.jdk”.

Ora questo è tutto davvero confuso ma questa non è ancora la mia domanda. Sembra che ci sia un Java 7 installato qui:

 /System/Library/Frameworks/JavaVM.framework/Versions/A 

Ma c’è anche un Java 7 installato qui:

 /Library/Java/JavaVirtualMachines/jdk1.7.0_15.jdk 

Trovare ‘java’ in entrambi e stampare la versione produce la stessa versione e build (versione java “1.7.0_15”), tuttavia, quando si selezionano i file, sono diversi.

Quindi questo significa che Oracle ha installato Java 7 in due posti diversi? Se è così, perché? Che dovrei usare? E perché alcune cose puntano ancora a Java 6 (CurrentJDK).

Ho consultato il sito Web di Oracle ma nulla chiarisce nulla.

La JVM di Oracle è installata solo in una posizione. Sei stato ingannato!

Come hai notato, i comandi Java in /usr/bin sono /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands 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 usare *, quindi eseguono il binario reale corrispondente all’interno della versione di VM. Questo è il motivo per cui tutti i file binari all’interno di /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands hanno dimensioni quasi identiche, nonostante il fatto che ci si aspetterebbe che implementassero 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 

L’invocazione di dtrace fornita stampa l’argomento path su 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 richiamando quella versione del comando java .

I binari degli stub hanno anche un altro vantaggio: quando rilevano che nessuna VM Java è installata, chiederanno all’utente di installarne una.

Per quanto riguarda il link simbolico CurrentJDK , il meglio che posso dire per ragioni di retrocompatibilità con il passato, quando Apple era l’unica fonte della JVM su OS X.


* Una combinazione di fattori viene presa in considerazione quando si determina quale Java VM deve essere utilizzata. JAVA_HOME viene usato se impostato (prova JAVA_HOME=/tmp java ). Se JAVA_HOME non è impostato, viene individuata l’elenco di tutte le macchine virtuali sul sistema. Le variabili di ambiente JAVA_VERSION e JAVA_ARCH vengono utilizzate, se impostate, per filtrare l’elenco di macchine virtuali in una particolare versione e architettura supportata. L’elenco risultante viene quindi ordinato per architettura (preferendo 64 bit su 32 bit) e versione (più recente è migliore) e viene restituita la migliore corrispondenza.

Oracle Java 7 JRE (ovvero quello utilizzato dal plug-in del browser Web per eseguire applet e Java Web Start) si installa in /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home ed è questo che eventuali aggiornamenti automatici avranno effetto. Il JDK (quello che scarichi da http://www.oracle.com/technetwork/java/javase/downloads/index.html ) si installa creando una directory in /Library/Java/JavaVirtualMachines , e sta a te aggiornare questo te stesso. È ansible avere più versioni JDK installate fianco a fianco, ma solo un JRE “pubblico” sotto JavaAppletPlugin.plugin (che corrisponderà all’ultima versione di JDK installata o successiva se è stata aggiornata automaticamente da allora).

Come spiegato da bdash, i comandi in /usr/bin sono stub che delegano a qualunque JDK / JRE viene puntato dalla variabile d’ambiente JAVA_HOME , o se non è impostato allora selezioneranno il Java più appropriato da eseguire. Puoi usare /usr/libexec/java_home per vedere quale degli stub sceglierebbe. Se non è installato Java, gli stub offriranno l’installazione dell’ultimo Apple Java 6 (per quanto ne so non offriranno l’installazione di Java 7).

Trovo questo post: https://developer.apple.com/library/mac/qa/qa1170/_index.html Lo strumento / usr / libexec / java_home trova in modo dinamico la versione di Java superiore specificata in Preferenze Java per l’utente corrente.