了解Mac上的Oracle Java

rjc*_*arr 39 java oracle macos

我已经在OS X上使用Java很多年了,而且最近苹果公司在默认情况下停止使用Java时我会让操作系统为我安装它(Apple当然是多种多样的).

所以现在我正在使用OS X 10.8,我需要安装Java 7,所以我只是以DMG形式获得了Oracle的Update 15并运行了安装程序.它更新了我的/ usr/bin/java(及相关文件)以指向:

/System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java
Run Code Online (Sandbox Code Playgroud)

将其追溯到'/System/Library/Frameworks/JavaVM.framework/Versions'所有内容都指向'Current'或'CurrentJDK',前者是指向'A'的链接(这是Oracle的Java 7,我可以告诉,不知道为什么它是'A'),后者是'/System/Library/Java/JavaVirtualMachines/1.6.0.jdk'中Apple的Java 6的链接.

现在这真的令人困惑,但这还不是我的问题.看来这里安装了一个Java 7:

/System/Library/Frameworks/JavaVM.framework/Versions/A
Run Code Online (Sandbox Code Playgroud)

但是这里还安装了一个Java 7:

/Library/Java/JavaVirtualMachines/jdk1.7.0_15.jdk
Run Code Online (Sandbox Code Playgroud)

在两者中查找'java'并打印出版本会产生相同的版本和构建(java版本"1.7.0_15"),但是,当对文件进行散列时它们是不同的.

那么这是否意味着Oracle在两个不同的地方安装了Java 7?如果是这样,为什么?我该使用哪个?为什么有些东西仍然指向Java 6(CurrentJDK).

我查看了甲骨文的网站,但没有任何东西可以清除.

bda*_*ash 65

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 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
Run Code Online (Sandbox Code Playgroud)

给定dtrace调用打印出的路径参数posix_spawn时,它被称为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_VERSIONJAVA_ARCH环境变量的使用,如果设置,虚拟机列表中筛选到一个特定的版本和支持的体系结构.然后根据体系结构(优选64位超过32位)和版本(更新更好)对结果列表进行排序,并返回最佳匹配.


Ian*_*rts 9

Oracle Java 7 JRE(即用于运行applet和Java Web Start的Web浏览器插件使用的JRE)安装在其中/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home,并且任何自动更新都会影响这一点.JDK(您从http://www.oracle.com/technetwork/java/javase/downloads/index.html下载的JDK)通过在/Library/Java/JavaVirtualMachines其下创建目录来安装,您可以自行更新.您可以并排安装多个JDK版本,但只能安装一个"公共"JRE JavaAppletPlugin.plugin(对应于最新安装的JDK或更新版本,如果之后已自动更新).

正如bdash所解释的那样,下面的命令/usr/bin是委托给JAVA_HOME环境变量指向的JDK/JRE的存根,或者如果没有设置那么它们将选择最适合运行的Java.您可以使用/usr/libexec/java_home查看存根将选择哪一个.如果没有安装Java,那么存根将提供安装最新的Apple Java 6(据我所知他们不会提供安装Java 7).


小智 5

我找到了这篇文章:https : //developer.apple.com/library/mac/qa/qa1170/_index.html /usr/libexec/java_home 工具为当前用户动态查找 Java 首选项中指定的顶级 Java 版本。