La JVM d'Oracle n'est installée qu'à un seul endroit. Vous avez été trompé !
Comme vous l'avez noté, les commandes Java dans /usr/bin
sont des liens symboliques vers les binaires dans /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands
. Les fichiers binaires de ce répertoire sont des applications stub qui déterminent quelle machine virtuelle Java utiliser*, puis exécutent le fichier binaire réel correspondant dans cette version de machine virtuelle. C'est pourquoi tous les binaires dans /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands
sont presque identiques en taille, malgré le fait que vous vous attendriez à ce qu'ils implémentent des fonctionnalités assez différentes.
Vous pouvez voir cela en action en utilisant 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
Le dtrace
donné l'invocation affiche l'argument du chemin vers posix_spawn
lorsqu'il est appelé par java -version
. Dans mon cas, l'application stub a trouvé le runtime Java 1.6 d'Apple dans /System/Library/Java/JavaVirtualMachines/1.6.0.jdk
et invoque cette version de java
commande.
Les fichiers binaires stub ont également un autre avantage :lorsqu'ils détectent qu'aucune machine virtuelle Java n'est installée, ils invitent l'utilisateur à en installer une.
Quant au CurrentJDK
lien symbolique, pour autant que je sache, par souci de rétrocompatibilité avec le passé, lorsque Apple était la seule source de la JVM sur OS X.
* Une combinaison de facteurs est prise en compte lors de la détermination de la machine virtuelle Java à utiliser. JAVA_HOME
est utilisé s'il est défini (essayez JAVA_HOME=/tmp java
). Si JAVA_HOME
n'est pas défini, la liste de toutes les machines virtuelles du système est découverte. Le JAVA_VERSION
et JAVA_ARCH
les variables d'environnement sont utilisées, si elles sont définies, pour filtrer la liste des machines virtuelles selon une version particulière et une architecture prise en charge. La liste résultante est ensuite triée par architecture (64 bits de préférence à 32 bits) et version (la plus récente est la meilleure), et la meilleure correspondance est renvoyée.