Questa è non una domanda ingenua; per favore portami con me.
Qualcuno può dirmi come un'invocazione di /usr/bin/java
su un Apple MacBook Pro a partire dalla metà del 2010 sia con il JDK di Apple che con il JDK Oracle 1.8.0 risultati trovati nel JDK di Oracle 1.8.0 e utilizzati?
Si noti che la mia versione del JDK 1.6 installato da Apple è abbastanza recente da essere stata rimossa dall'applicazione Java Preferences, in modo tale da non influire sulla determinazione di quale Java VM utilizzare.
Inoltre, tieni presente che /usr/libexec/java_home
non è invocato (da me, comunque) in nessuno dei miei esempi di seguito.
OK, eccoci.
Il JDK 1.8 di Oracle viene installato in /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/
. Bene.
/usr/bin/java
, che è sotto il controllo Apple, è un collegamento simbolico che punta a /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java
. ( /System/Library/Frameworks/JavaVM.framework/Versions/Current
è un collegamento simbolico che punta a /System/Library/Frameworks/JavaVM.framework/Versions/A
(una directory), quindi, per estensione, /usr/bin/java
dopo la risoluzione del link simbolico punta a /System/Library/Frameworks/JavaVM.framework/Versions/A/Commands/java
.)
/System/Library/Frameworks/JavaVM.framework/Versions/A/Commands/java
è non un link simbolico. È un eseguibile. La sua ultima timestamp modificata è piuttosto vecchia, probabilmente corrispondente a quando ho installato JDK 7 qualche tempo fa. In ogni caso, non corrisponde alla data in cui ho installato JDK 8.
/Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/bin/java
non è uguale in dimensioni a /System/Library/Frameworks/JavaVM.framework/Versions/A/Commands/java
. Neanche questo è un collegamento simbolico. Il suo ultimo timestamp modificato corrisponde a quando ho installato JDK 8. Questi due sono programmi diversi.
Tuttavia, richiamando una di queste varianti java
con un argomento -version
si ottiene una stringa di versione che li identifica come 1.8.
Come viene stabilito il collegamento semantico tra /System/Library/Frameworks/JavaVM.framework/Versions/A/Commands/java
e /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/bin/java
, dato che nessuno dei due è un collegamento simbolico all'altro?
In secondo luogo, chi "detiene" /System/Library/Frameworks/JavaVM.framework/Versions/A
: Oracle o Apple?
Inoltre, considera il seguente output, in particolare l'impostazione argv[0]
che identifica /usr/bin/java
come nome del programma, anche se non l'ho mai scritto (riga 13 nell'output sottostante):
Laird-Nelsons-MacBook-Pro:repository ljnelson$ env _JAVA_LAUNCHER_DEBUG=true /System/Library/Frameworks/JavaVM.framework/Versions/A/Commands/java -version
----_JAVA_LAUNCHER_DEBUG----
Launcher state:
debug:on
javargs:off
program name:java
launcher name:java
javaw:off
fullversion:1.8.0-b132
dotversion:1.8
ergo_policy:DEFAULT_ERGONOMICS_POLICY
Command line args:
argv[0] = /usr/bin/java
argv[1] = -version
JRE path is /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/jre
jvm.cfg[0] = ->-server<-
jvm.cfg[1] = ->-client<-
69 micro seconds to parse jvm.cfg
Default VM: server
Does '/Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/jre/lib/server/libjvm.dylib' exist ... yes.
----_JAVA_LAUNCHER_DEBUG----
Launcher state:
debug:on
javargs:off
program name:java
launcher name:java
javaw:off
fullversion:1.8.0-b132
dotversion:1.8
ergo_policy:DEFAULT_ERGONOMICS_POLICY
Command line args:
argv[0] = /usr/bin/java
argv[1] = -version
JRE path is /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/jre
jvm.cfg[0] = ->-server<-
jvm.cfg[1] = ->-client<-
33 micro seconds to parse jvm.cfg
Default VM: server
Does '/Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/jre/lib/server/libjvm.dylib' exist ... yes.
JVM path is /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/jre/lib/server/libjvm.dylib
2242 micro seconds to LoadJavaVM
JavaVM args:
version 0x00010002, ignoreUnrecognized is JNI_FALSE, nOptions is 4
option[ 0] = '-Dsun.java.launcher.diag=true'
option[ 1] = '-Dsun.java.launcher.diag=true'
option[ 2] = '-Djava.class.path=.'
option[ 3] = '-Dsun.java.launcher=SUN_STANDARD'
Picked up _JAVA_OPTIONS: -Dfile.encoding=UTF-8
java version "1.8.0"
Java(TM) SE Runtime Environment (build 1.8.0-b132)
Java HotSpot(TM) 64-Bit Server VM (build 25.0-b70, mixed mode)