Dato il suo layout di file system, come funziona l'installazione di Oracle Java JDK 8?

2

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)
    
posta Laird Nelson 16.04.2014 - 22:26
fonte

0 risposte

Leggi altre domande sui tag