Oracles JVM er kun installeret ét sted. Du er blevet vildledt!
Som du har bemærket, Java-kommandoer i /usr/bin
er symbolske links til binære filer i /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands
. De binære filer i den mappe er stub-applikationer, der bestemmer, hvilken Java VM der skal bruges*, og derefter udfører den tilsvarende rigtige binære i den VM-version. Dette er grunden til, at alle binære filer i /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands
er næsten identiske i størrelse, på trods af at du ville forvente, at de implementerer en helt anden funktionalitet.
Du kan se dette i aktion ved at bruge 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 givne dtrace
invocation udskriver sti-argumentet til posix_spawn
når den kaldes af java -version
. I mit tilfælde har stub-applikationen fundet Apples Java 1.6 runtime i /System/Library/Java/JavaVirtualMachines/1.6.0.jdk
og påberåber denne version af java
kommando.
Stub-binære filer har også en anden fordel:Når de opdager, at ingen Java VM er installeret, vil de bede brugeren om at installere en.
Med hensyn til CurrentJDK
symlink, så godt jeg kan fortælle dette af hensyn til bagudkompatibilitet med fortiden, da Apple var den eneste kilde til JVM på OS X.
* En kombination af faktorer tages i betragtning, når det bestemmes, hvilken Java VM der skal bruges. JAVA_HOME
bruges, hvis indstillet (prøv JAVA_HOME=/tmp java
). Hvis JAVA_HOME
ikke er indstillet, bliver listen over alle virtuelle maskiner på systemet opdaget. JAVA_VERSION
og JAVA_ARCH
miljøvariabler bruges, hvis de er indstillet, til at filtrere listen over virtuelle maskiner til en bestemt version og understøttet arkitektur. Den resulterende liste sorteres derefter efter arkitektur (foretrækker 64-bit frem for 32-bit) og version (nyere er bedre), og det bedste match returneres.