Dado el diseño de su sistema de archivos, ¿cómo funciona la instalación de Oracle Java JDK 8?

2

Esto es no una pregunta ingenua; por favor ten paciencia conmigo.

¿Alguien puede decirme cómo una invocación de /usr/bin/java en un Apple MacBook Pro desde mediados de 2010 con el JDK de Apple y el JDK de Oracle 1.8.0 instalado hace que se encuentre y se use el JDK de Oracle 1.8.0?

Tenga en cuenta que mi versión del JDK 1.6 instalado por Apple es lo suficientemente reciente como para que la aplicación de Preferencias de Java haya sido eliminada por ellos, por lo que no se toma en cuenta la determinación de qué Java VM usar.

Además, tenga en cuenta que /usr/libexec/java_home no se invoca (por mi parte, de todos modos) en ninguno de mis ejemplos a continuación.

Bien, aquí vamos.

El JDK 1.8 de Oracle se instala en /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/ . Bien.

/usr/bin/java , que está bajo el control de Apple, es un enlace simbólico que apunta a /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java . ( /System/Library/Frameworks/JavaVM.framework/Versions/Current es un enlace simbólico que apunta a /System/Library/Frameworks/JavaVM.framework/Versions/A (un directorio), por lo que, por extensión, /usr/bin/java después de la resolución del enlace simbólico apunta a /System/Library/Frameworks/JavaVM.framework/Versions/A/Commands/java .)

/System/Library/Frameworks/JavaVM.framework/Versions/A/Commands/java es no un enlace simbólico. Es un ejecutable. Su última marca de tiempo modificada es bastante antigua, probablemente correspondiente a cuando instalé JDK 7 hace algún tiempo. En cualquier caso, no corresponde a la fecha en la que instalé JDK 8.

/Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/bin/java no es igual en tamaño a /System/Library/Frameworks/JavaVM.framework/Versions/A/Commands/java . Tampoco es un enlace simbólico. Su última marca de tiempo modificada corresponde a cuando instalé JDK 8. Estos dos son programas diferentes.

Sin embargo, al invocar cualquiera de estas variantes java con un argumento -version se obtiene una cadena de versión que las identifica como 1.8.

¿Cómo se establece el enlace semántico entre /System/Library/Frameworks/JavaVM.framework/Versions/A/Commands/java y /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/bin/java , dado que ninguno de ellos es un enlace simbólico con el otro?

En segundo lugar, ¿quién "posee" /System/Library/Frameworks/JavaVM.framework/Versions/A : Oracle o Apple?

Además, considere la siguiente salida, especialmente la configuración argv[0] que identifica /usr/bin/java como el nombre del programa, aunque nunca escribí eso (línea 13 en la salida a continuación):

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

0 respuestas

Lea otras preguntas en las etiquetas