A JVM da Oracle é instalada apenas em um local. Você foi enganado!
Como você notou, os comandos Java em
/usr/bin
são links simbólicos para binários em /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands
. Os binários nesse diretório são aplicativos stub que determinam qual Java VM usar* e, em seguida, executam o binário real correspondente nessa versão de VM. É por isso que todos os binários dentro de /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands
são quase idênticos em tamanho, apesar do fato de que você esperaria que implementassem funcionalidades bem diferentes. Você pode ver isso em ação usando
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
O
dtrace
fornecido invocação imprime o argumento de caminho para posix_spawn
quando é chamado por java -version
. No meu caso, o aplicativo stub encontrou o tempo de execução Java 1.6 da Apple em /System/Library/Java/JavaVirtualMachines/1.6.0.jdk
e está invocando essa versão do java
comando. Os binários stub também têm outro benefício:quando detectam que nenhuma Java VM está instalada, eles solicitam que o usuário instale uma.
Quanto ao
CurrentJDK
symlink, o melhor que posso dizer por causa da compatibilidade com versões anteriores, quando a Apple era a única fonte da JVM no OS X. * Uma combinação de fatores é considerada ao determinar qual Java VM deve ser usada.
JAVA_HOME
éusado se estiver definido (experimente JAVA_HOME=/tmp java
). Se JAVA_HOME
não estiver definido, a lista de todas as máquinas virtuais no sistema será descoberta. O JAVA_VERSION
e JAVA_ARCH
variáveis de ambiente são usadas, se configuradas, para filtrar a lista de máquinas virtuais para uma determinada versão e arquitetura suportada. A lista resultante é então classificada por arquitetura (preferindo 64 bits em vez de 32 bits) e versão (mais recente é melhor), e a melhor correspondência é retornada.