Die JVM von Oracle wird nur an einem Ort installiert. Sie wurden in die Irre geführt!
Wie Sie bemerkt haben, sind die Java-Befehle in /usr/bin
sind symbolische Links zu Binärdateien in /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands
. Die Binärdateien in diesem Verzeichnis sind Stub-Anwendungen, die bestimmen, welche Java-VM verwendet werden soll*, und dann die entsprechende echte Binärdatei in dieser VM-Version ausführen. Aus diesem Grund sind alle Binärdateien in /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands
haben fast die gleiche Größe, obwohl Sie erwarten würden, dass sie ganz andere Funktionen implementieren.
Sie können dies in Aktion sehen, indem Sie dtrace
verwenden :
[email protected]:~$ sudo dtrace -n 'syscall::posix_spawn:entry { trace(copyinstr(arg1)); }' -c "/usr/bin/java -version"
dtrace: description 'syscall::posix_spawn:entry ' matched 1 probe
dtrace: pid 44727 has exited
CPU ID FUNCTION:NAME
8 619 posix_spawn:entry /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/bin/java
Der angegebene dtrace
Aufruf gibt das Pfadargument zu posix_spawn
aus wenn es von java -version
aufgerufen wird . In meinem Fall hat die Stub-Anwendung Apples Java 1.6-Laufzeit in /System/Library/Java/JavaVirtualMachines/1.6.0.jdk
gefunden und ruft diese Version von java
auf Befehl.
Die Stub-Binärdateien haben noch einen weiteren Vorteil:Wenn sie feststellen, dass keine Java VM installiert ist, werden sie den Benutzer auffordern, eine zu installieren.
Wie beim CurrentJDK
Symlink, so gut ich das aus Gründen der Abwärtskompatibilität mit der Vergangenheit sagen kann, als Apple die einzige Quelle der JVM unter OS X war.
* Bei der Bestimmung, welche Java VM verwendet werden sollte, wird eine Kombination von Faktoren berücksichtigt. JAVA_HOME
wird verwendet, wenn gesetzt (versuchen Sie JAVA_HOME=/tmp java
). Wenn JAVA_HOME
nicht festgelegt ist, wird die Liste aller virtuellen Maschinen auf dem System erkannt. Die JAVA_VERSION
und JAVA_ARCH
Umgebungsvariablen werden, falls gesetzt, verwendet, um die Liste der virtuellen Maschinen nach einer bestimmten Version und unterstützten Architektur zu filtern. Die resultierende Liste wird dann nach Architektur (bevorzugt 64-Bit gegenüber 32-Bit) und Version (neuer ist besser) sortiert und die beste Übereinstimmung wird zurückgegeben.