Oracle的JVM仅安装在一个位置。你被误导了!
您已经注意到,中的Java命令
/usr/bin是指向中二进制文件的符号链接
/System/Library/frameworks/JavaVM.framework/Versions/Current/Commands。该目录中的二进制文件是存根应用程序,它们确定要使用的Java
VM
*,然后在该VM版本中执行相应的实际二进制文件。这就是为什么其中所有二进制文件的
/System/Library/frameworks/JavaVM.framework/Versions/Current/Commands大小几乎相同的原因,尽管您希望它们实现的功能完全不同。
您可以使用来查看此操作
dtrace:
mrowe@angara:~$ sudo dtrace -n 'syscall::posix_spawn:entry { trace(copyinstr(arg1)); }' -c "/usr/bin/java -version"dtrace: description 'syscall::posix_spawn:entry ' matched 1 probedtrace: pid 44727 has exitedCPU ID FUNCTION:NAME 8 619 posix_spawn:entry /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/bin/java给定的
dtrace调用将打印出
posix_spawn当被调用时的path参数
java-version。在我的情况下,存根应用程序已在其中找到Apple的Java
1.6运行时,
/System/Library/Java/JavaVirtualMachines/1.6.0.jdk并正在调用该
java命令版本。
存根二进制文件还有另一个好处:当它们检测到未安装Java VM时,将提示用户安装一个。
至于
CurrentJDK符号链接,就我向后的兼容性而言,尽我所能告诉我,Apple是OS X上唯一的JVM来源。
*在确定应使用哪个Java VM时要考虑多种因素。
JAVA_HOME如果已设置(尝试
JAVA_HOME=/tmp java),则使用。如果
JAVA_HOME未设置,则发现系统上所有虚拟机的列表。该
JAVA_VERSION和
JAVA_ARCH环境变量的使用,如果设置,虚拟机列表中筛选到一个特定的版本和支持的体系结构。然后,将结果列表按体系结构(最好是64位而不是32位)和版本(更新更好)进行排序,并返回最佳匹配。



