我已经在OS X上使用Java很多年了,最近苹果公司在默认情况下停止使用Java时我会让操作系统为我安装(当然是苹果的)。
所以现在我正在使用OS X 10.8,我需要安装Java 7,所以我只是以DMG格式获得了Oracle的Update 15并运行了安装程序。它更新了我的/ usr / bin / java(及相关文件),指向这里:
/System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java
将其追溯到'/System/Library/Frameworks/JavaVM.framework/Versions',所有内容都指向'Current'或'CurrentJDK',前者是指向'A'的链接(这是Oracle的Java 7,来自我可以告诉,不知道为什么它是'A')后者是'/System/Library/Java/JavaVirtualMachines/1.6.0.jdk'中Apple Apple 6的链接。
现在这一切都让人感到困惑,但这还不是我的问题。看来这里安装了Java 7:
/System/Library/Frameworks/JavaVM.framework/Versions/A
但是这里还安装了Java 7:
/Library/Java/JavaVirtualMachines/jdk1.7.0_15.jdk
在两者中查找'java'并打印出版本会产生相同的版本和版本(java版本“1.7.0_15”),但是,当对文件进行散列时它们是不同的。
这是否意味着Oracle在两个不同的地方安装了Java 7?如果是这样,为什么?我该使用哪个?为什么有些东西仍然指向Java 6(CurrentJDK)。
我查看了甲骨文的网站,但没有任何内容可以解决。
答案 0 :(得分:63)
Oracle的JVM仅安装在一个位置。你被误导了!
正如您所指出的,/usr/bin
中的Java命令是/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 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
调用在posix_spawn
调用时将java -version
的路径参数打印出来。在我的例子中,存根应用程序在/System/Library/Java/JavaVirtualMachines/1.6.0.jdk
中找到了Apple的Java 1.6运行时,并且正在调用该java
命令的版本。
存根二进制文件还有另一个好处:当他们检测到没有安装Java VM时,会提示用户安装一个。
对于CurrentJDK
符号链接,尽管我可以告诉它,但为了向后兼容过去,Apple是OS X上唯一的JVM源。
*在确定应使用哪个Java VM时,会考虑多种因素的组合。如果设置{try JAVA_HOME
),则使用JAVA_HOME=/tmp java
。如果未设置JAVA_HOME
,则会发现系统上所有虚拟机的列表。如果设置了JAVA_VERSION
和JAVA_ARCH
环境变量,则将虚拟机列表过滤为特定版本和支持的体系结构。然后根据体系结构(更喜欢64位超过32位)和版本(更新更好)对结果列表进行排序,并返回最佳匹配。
答案 1 :(得分:9)
Oracle Java 7 JRE (即Web浏览器插件用来运行applet和Java Web Start的那个)在/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home
中自行安装,就是这个任何自动更新都会影响。 JDK (您从http://www.oracle.com/technetwork/java/javase/downloads/index.html下载的那个)通过在/Library/Java/JavaVirtualMachines
下创建目录来安装,您可以自行更新。您可以并排安装多个JDK版本,但只能安装一个" public" JavaAppletPlugin.plugin
下的JRE(对应于最新安装的JDK或更新的版本,如果它已经自动更新)。
正如bdash所解释的那样,/usr/bin
下的命令是委托给JAVA_HOME
环境变量指向的JDK / JRE的存根,或者如果未设置,那么它们将选择最多适当的Java运行。您可以使用/usr/libexec/java_home
查看存根将选择哪一个。如果安装了 no Java,那么存根将提供安装最新的Apple Java 6(据我所知他们将不提供安装Java 7)。
答案 2 :(得分:3)
我发现这篇文章: https://developer.apple.com/library/mac/qa/qa1170/_index.html / usr / libexec / java_home工具动态查找当前用户在Java Preferences中指定的顶级Java版本。