JVM Oracle jest instalowana tylko w jednej lokalizacji. Zostałeś wprowadzony w błąd!
Jak zauważyłeś, polecenia Java w /usr/bin
są dowiązaniami symbolicznymi do plików binarnych w /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands
. Pliki binarne w tym katalogu są aplikacjami pośredniczącymi, które określają, której maszyny wirtualnej Java użyć*, a następnie wykonują odpowiedni rzeczywisty plik binarny w tej wersji maszyny wirtualnej. Dlatego wszystkie pliki binarne w /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands
mają prawie identyczny rozmiar, mimo że można by się spodziewać, że będą wdrażać zupełnie inną funkcjonalność.
Możesz to zobaczyć w akcji, używając 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
Podany dtrace
wywołanie wypisuje argument ścieżki do posix_spawn
gdy jest wywoływana przez java -version
. W moim przypadku aplikacja pośrednicząca znalazła środowisko wykonawcze Java 1.6 firmy Apple w /System/Library/Java/JavaVirtualMachines/1.6.0.jdk
i wywołuje tę wersję java
polecenie.
Okrojone pliki binarne mają również inną zaletę:gdy wykryją, że nie zainstalowano żadnej maszyny wirtualnej Java, poproszą użytkownika o zainstalowanie jednej z nich.
Co do CurrentJDK
symlink, najlepiej jak mogę to powiedzieć ze względu na wsteczną kompatybilność z przeszłością, kiedy Apple było jedynym źródłem JVM na OS X.
* Podczas określania, która maszyna wirtualna Java powinna zostać użyta, bierze się pod uwagę kombinację czynników. JAVA_HOME
jest używane, jeśli jest ustawione (spróbuj JAVA_HOME=/tmp java
). Jeśli JAVA_HOME
nie jest ustawiona, wykryta zostanie lista wszystkich maszyn wirtualnych w systemie. JAVA_VERSION
i JAVA_ARCH
zmienne środowiskowe są używane, jeśli są ustawione, do filtrowania listy maszyn wirtualnych do określonej wersji i obsługiwanej architektury. Otrzymana lista jest następnie sortowana według architektury (preferując 64-bitową nad 32-bitową) i wersji (nowsza znaczy lepsza), i zwracane jest najlepsze dopasowanie.