当前位置: 首页 > 面试题库 >

了解Mac上的Oracle Java

冀阳文
2023-03-14
问题内容

我在OS X上使用Java已经很多年了,最近,当Apple停止默认包含Java时,我让OS继续为我安装它(当然,Apple的品种很多)。

因此,现在我正在使用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
Java 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)。

我看过Oracle的网站,但那里什么也看不清。


问题答案:

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

给定的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_VERSIONJAVA_ARCH环境变量的使用,如果设置,虚拟机列表中筛选到一个特定的版本和支持的体系结构。然后,将结果列表按体系结构(最好是64位而不是32位)和版本(更新更好)进行排序,并返回最佳匹配。



 类似资料:
  • echo$JAVA_HOME给出: /library/java/javavirtualmachines/jdk1.8.0_73.jdk/contents/home /usr/libexec/java_home 如果是的话,我如何用我目前拥有的东西做到这一点? “/usr/libexec/java_home-v”的输出 匹配的Java虚拟机(4):1.8.0_73,X86_64:“Java SE 8

  • 我正在学习Spring Security的一些代码。我想了解我在Internet 1上找到的这个例子: } 我不明白这个配置,为什么这个代码: 在之前。authorizeRequests()?(1) 这是什么意思? 你能解释一下这个例子吗? 2: 在第二种情况下,有什么区别? 使用requestMatchers()有什么影响? 如果我向“/rest/v1/test/hello2”发送请求,我会收到

  • 问题内容: 这是与Leopard一起安装的目录布局。什么是“ A”目录?为什么除了“ CurrentJDK”之外还有“当前”目录? 看起来您可以通过移动CurrentJDK链接轻松地切换当前JDK,但是Current和A下的内容将不同步。 和A的内容 问题答案: (,符号链接到)是Mac OS X框架结构的一部分。除了实际的JVM安装之外,此框架中可能还包含C或Objective-C代码。因此,除

  • 问题内容: 我认为我对 .NET 的经验可能会影响我的理解,因此我想一些代码示例: 我正在尝试让快速控制器在返回响应之前等待5秒: 该代码不起作用,浏览器不断加载和加载,从不显示任何内容。 我基于此SO答案构建的函数以及控制器方法,是基于(对)其工作原理的(错误的)理解,因此我需要进行一些澄清和更正: 1.我应该什么时候使用? 据我了解,您应该在函数调用之前使用。这样对吗?另外,为什么我可以在返回

  • 尝试使用以下命令启动集线器和节点。 java-jar selenium-server-standalone-2.39.0.jar-角色中心-端口1234 java-jar selenium-server-standalone-2.39.0.jar-角色节点-中心http://x.x.x.x:1234/grid/register-浏览器“browserName=safari,setjavascrip

  • 在学习之前,我正在学习我希望从spring安装spring。我已经下载并解压了,我需要关于在哪里放置文件夹的帮助,这样我就可以开始在Mac上使用工作了。 我知道这是一个很小的问题,但我还没有找到这样的安装,大多数教程使用spring.io生成一个zip文件,或者使用maven完成安装。