Oracle's JVM chỉ được cài đặt ở một vị trí. Bạn đã nhầm lẫn!
Như bạn đã lưu ý, các lệnh Java trong /usr/bin
là các liên kết tượng trưng đến các tệp nhị phân trong /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands
. Các tệp nhị phân trong thư mục đó là các ứng dụng sơ khai xác định máy ảo Java nào sẽ sử dụng *, sau đó thực thi tệp nhị phân thực tương ứng trong phiên bản máy ảo đó. Đây là lý do tại sao tất cả các mã nhị phân trong /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands
có kích thước gần như giống hệt nhau, mặc dù thực tế là bạn mong đợi chúng triển khai các chức năng khá khác nhau.
Bạn có thể thấy điều này thực tế bằng cách sử dụng 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
dtrace
đã cho lệnh gọi in ra đối số đường dẫn tới posix_spawn
khi nó được gọi bằng java -version
. Trong trường hợp của tôi, ứng dụng sơ khai đã tìm thấy thời gian chạy Java 1.6 của Apple trong /System/Library/Java/JavaVirtualMachines/1.6.0.jdk
và đang gọi phiên bản đó của java
lệnh.
Các mã nhị phân sơ khai cũng có một lợi ích khác:khi chúng phát hiện không có máy ảo Java nào được cài đặt, chúng sẽ nhắc người dùng cài đặt một chương trình.
Đối với CurrentJDK
liên kết biểu tượng, tốt nhất tôi có thể nói điều này vì lợi ích tương thích ngược với quá khứ khi Apple là nguồn duy nhất của JVM trên OS X.
* Sự kết hợp của các yếu tố được xem xét khi xác định máy ảo Java nào nên được sử dụng. JAVA_HOME
được sử dụng nếu được đặt (thử JAVA_HOME=/tmp java
). Nếu JAVA_HOME
không được thiết lập thì danh sách tất cả các máy ảo trên hệ thống sẽ được phát hiện. JAVA_VERSION
và JAVA_ARCH
Các biến môi trường được sử dụng, nếu được đặt, để lọc danh sách các máy ảo theo một phiên bản cụ thể và kiến trúc được hỗ trợ. Sau đó, danh sách kết quả được sắp xếp theo kiến trúc (ưu tiên 64 bit hơn 32 bit) và phiên bản (mới hơn thì tốt hơn) và kết quả phù hợp nhất sẽ được trả về.