Oracles JVM är bara installerat på en plats. Du har blivit vilseledd!
Som du har noterat, Java-kommandon i /usr/bin
är symboliska länkar till binärer i /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands
. Binärfilerna i den katalogen är stubbapplikationer som bestämmer vilken Java VM som ska användas*, och sedan exekverar motsvarande riktiga binär i den VM-versionen. Det är därför alla binärfiler inom /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands
är nästan identiska i storlek, trots att du förväntar dig att de ska implementera helt olika funktioner.
Du kan se detta i praktiken genom att använda dtrace
:
[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
Den givna dtrace
invocation skriver ut sökvägsargumentet till posix_spawn
när den anropas av java -version
. I mitt fall har stubbapplikationen hittat Apples Java 1.6 runtime i /System/Library/Java/JavaVirtualMachines/1.6.0.jdk
och anropar den versionen av java
kommando.
Stubbbinärfilerna har också en annan fördel:när de upptäcker att ingen Java VM är installerad kommer de att uppmana användaren att installera en.
När det gäller CurrentJDK
symbollänk, så gott jag kan berätta detta för bakåtkompatibilitetens skull med det förflutna när Apple var den enda källan till JVM på OS X.
* En kombination av faktorer beaktas när man bestämmer vilken Java VM som ska användas. JAVA_HOME
används om inställt (försök med JAVA_HOME=/tmp java
). Om JAVA_HOME
inte är inställt så upptäcks listan över alla virtuella maskiner på systemet. JAVA_VERSION
och JAVA_ARCH
miljövariabler används, om de är inställda, för att filtrera listan över virtuella maskiner till en viss version och vilken arkitektur som stöds. Den resulterande listan sorteras sedan efter arkitektur (föredrar 64-bitars framför 32-bitars) och version (nyare är bättre), och den bästa matchningen returneras.