Bu naif bir soru değil ; lütfen bana eşlik et.
Birisi bana /usr/bin/java
2010 yılının ortalarından itibaren bir Apple MacBook Pro'nun hem Apple JDK hem de Oracle 1.8.0 JDK ile nasıl çağrıldığını ve Oracle 1.8.0 JDK'nın kullanılmasının ve kullanılmasının nasıl sonuçlandığını söyleyebilir mi?
Lütfen Apple tarafından yüklenen JDK 1.6 sürümümün Java Tercihleri uygulamasının onlar tarafından kaldırıldığı kadar yeni olduğunu ve hangi Java VM'nin kullanılacağının belirlenmesini etkilemeyeceğini unutmayın.
Ayrıca /usr/libexec/java_home
, aşağıdaki örneklerin hiçbirinde (zaten benim tarafımdan) kullanılmadığını lütfen unutmayın .
Tamam, işte başlıyoruz.
Oracle'ın JDK 1.8'i kuruldu /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/
. İnce.
/usr/bin/java
Apple kontrolünde olan, işaret eden sembolik bir bağdır /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java
. ( (bir dizine) /System/Library/Frameworks/JavaVM.framework/Versions/Current
işaret eden sembolik bir bağdır /System/Library/Frameworks/JavaVM.framework/Versions/A
, yani, /usr/bin/java
sembolik bağ çözümlemesinin işaret ettiği noktaya göre /System/Library/Frameworks/JavaVM.framework/Versions/A/Commands/java
.)
/System/Library/Frameworks/JavaVM.framework/Versions/A/Commands/java
olduğu değil sembolik bir bağ. Bu bir çalıştırılabilir. Son değiştirilen zaman damgası oldukça eski, muhtemelen JDK 7'yi bir süre önce kurduğum zamana denk geliyor . Her durumda, JDK 8'i kurduğum tarihe karşılık gelmiyor.
/Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/bin/java
boyut olarak eşit değil /System/Library/Frameworks/JavaVM.framework/Versions/A/Commands/java
. Bu da sembolik bir bağlantı değildir. Son değiştirilen zaman damgası, JDK 8'i yüklediğim zamana karşılık geliyor.
Bununla birlikte, bu java
değişkenlerden herhangi birini bir -version
argümanla çağırmak, bunları 1.8 olarak tanımlayan bir sürüm dizgisi oluşturur.
/System/Library/Frameworks/JavaVM.framework/Versions/A/Commands/java
/Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/bin/java
Diğerleri arasında sembolik bir bağlantı olmadığı için ve arasında semantik bağlantı nasıl kurulur ?
İkincisi, kim "sahibi" /System/Library/Frameworks/JavaVM.framework/Versions/A
: Oracle veya Apple?
Ayrıca, aşağıdakileri, özellikle program adını argv[0]
tanımlayan ayarı /usr/bin/java
, hiç yazmamış olmama rağmen (aşağıdaki çıktıdaki satır 13):
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)
/System/Library/Frameworks/JavaVM.framework/Versions/A/Commands/java
ve belgesiz olarak /usr/libexec/java_home
adlandırılan özel bir çerçeve başlattım JavaLaunching
. Koşu strings
üzerinde (!) Basit bir aptal tarama yapar düşündürmektedir ait /Library/Java/JavaVirtualMachines
ve sonra en son hangi anlamaya biraz (belgesiz) sezgisel bir yaklaşım kullanır. Çirkin ve şaşırtıcı.