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)