Mac OSX Java 终端版本不正确

Posted

技术标签:

【中文标题】Mac OSX Java 终端版本不正确【英文标题】:Mac OSX Java Terminal version incorrect 【发布时间】:2013-03-15 12:23:30 【问题描述】:

好的,我对 Mac 和 OSX 有点陌生,但我选择了一个,以便我可以对我的 Java 程序进行一些故障排除,因为我工作的公司使用 OSX 和 Windows 机器的组合。我遇到的问题是,当我从 Oracle 的网站安装 Java 7 时,它会更新首选项菜单并在双击它们时似乎正确执行 .jar 文件,但终端窗口的版本仍然是 1.6.0_43 并运行由于旧版本,来自终端的相同 .jar 文件会导致运行时错误。

当我导航到 /Library/Java/JavaVirtualMachines/ 时,我看到了一个空文件夹。从我在其他文章中看到的情况来看,Java 1.7.0 的版本文件夹应该位于此处。知道发生了什么吗?如何让终端使用正确版本的 Java?

编辑:@DWilches 对他的原始答案发表评论: (1)

total 64
lrwxr-xr-x  1 root  wheel   10 Mar 17 21:38 1.4 -> CurrentJDK
lrwxr-xr-x  1 root  wheel   10 Mar 17 21:38 1.4.2 -> CurrentJDK
lrwxr-xr-x  1 root  wheel   10 Mar 17 21:38 1.5 -> CurrentJDK
lrwxr-xr-x  1 root  wheel   10 Mar 17 21:38 1.5.0 -> CurrentJDK
lrwxr-xr-x  1 root  wheel   10 Mar 17 21:38 1.6 -> CurrentJDK
lrwxr-xr-x  1 root  wheel   10 Mar 17 21:38 1.6.0 -> CurrentJDK
drwxr-xr-x  8 root  wheel  272 Mar 17 21:38 A
lrwxr-xr-x  1 root  wheel    1 Mar 17 21:38 Current -> A
lrwxr-xr-x  1 root  wheel   59 Mar 17 21:38 CurrentJDK -> /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents

(2)

ls -ld /usr/bin/java
lrwxr-xr-x  1 root  wheel  74 Mar 17 21:38 /usr/bin/java -> /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java

编辑:对于新答案的错误感到抱歉,太习惯了在这么长时间后阻止编辑原始帖子的网站......

【问题讨论】:

Mac OSX 上的 Java 集成是一团糟,因为 Apple 停止了官方支持,而 Oracle 并不真正知道或关心如何正确集成。如果在 /Library/Java/JavaVirtualMachines 中找不到 Java 7,请查看 /System/Library/Frameworks/JavaVM.framework/Versions。它应该作为独立目录存在或链接到Current 很简单 - 苹果代码,只有苹果代码在 /System 中,所有用户的第三方都在 /Library 中 @DGolberg - 你到底安装了什么 Java 甲骨文提供了 JRE 和 JDK @Mark 我安装了 JRE 从 Java 8 开始,这对于 Oracle Java 应该有很大改进。 【参考方案1】:

JDK

在 Mac OS 上,/usr/bin/java 和朋友是委托给真正 JDK 命令的存根。这些存根尊重您的 JAVA_HOME 环境变量的设置,但要使其工作,您需要安装 JDK(来自 http://www.oracle.com/technetwork/java/javase/downloads/index.html)而不是 JRE(来自http://java.com)。

JDK 安装到 /Library/Java/JavaVirtualMachines/jdk1.7.0_NN.jdk(无论 NN 的值如何),因此将您的 JAVA_HOME 环境变量设置为 /Library/Java/JavaVirtualMachines/jdk1.7.0_NN.jdk/Contents/Home 以使 /usr/bin/java 使用 1.7。您只需将JAVA_HOME 指向/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home 即可切换回1.6。您可以使用/usr/libexec/java_home 工具自动找到正确的值,例如让/usr/bin/java 使用Java 7 即可

export JAVA_HOME=`/usr/libexec/java_home -v '1.7*'`

为了让它使用 Java 6,你可以这样做

export JAVA_HOME=`/usr/libexec/java_home -v '1.6*'`

这同样适用于 Java 8(使用 -v '1.8*')。这将选择相关主要版本的最新安装的JDK,您无需记住在安装更新时手动更改NN

JRE

如果您想从命令行运行 1.7 或 1.8 JRE,可以在 /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java 中找到它。这是一条固定路径,您在任何给定时间只能安装一个“公共”JRE。

$ /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java -version
java version "1.7.0_13"
Java(TM) SE Runtime Environment (build 1.7.0_13-b20)
Java HotSpot(TM) 64-Bit Server VM (build 23.7-b01, mixed mode)

您可以在 .bashrc 中使用 shell 别名

alias java_jre='/Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java'

【讨论】:

这解决了我如何让终端使用 Java 1.7 的问题。非常感谢伊恩! 一些奇怪的原因,当您发布您的消息时我没有收到警报(或者我可能检查了另一个并错过了它)。我确实尝试过这个,到目前为止它似乎对我也有效。谢谢伊恩! 这个别名正是我所需要的,让所有东西都能很好地播放。谢谢!【参考方案2】:

问题在于 Oracle 的 JRE 安装不会更改 /usr/bin/java 可执行文件。如果你想使用这个 Java,你必须使用 /Library 下的路径(需要找到这是我安装的 JDK,所以可能会有所不同)

根据 Oracle 的 JRE installation document

从 Oracle 安装 JRE 不会更新 java -version 符号链接或 将 java 添加到您的路径。为此,您需要安装 JDK。

Oracle JDK 确实将 /usr/bin/java 更改为指向 Java 7 可执行文件。如果您正在进行开发,那么您应该使用它,因为它包含的不仅仅是 JRE。

Oracle install FAQ 说

问:我应该安装 JRE 还是 JDK?

答:如果您计划运行 Java 应用程序,请安装 Java Runtime 环境 (JRE)。 JRE 也称为 Oracle Java。一次 您已经安装了 JRE,您可以启动 Java 小程序并 通过双击 JAR 文件、JNLP 文件并通过 浏览器。请注意,32 位浏览器,例如 32 位模式下的 Firefox, JRE 不支持和 Chrome。

如果您打算编写 Java 应用程序,请安装 Java Development 工具包 (JDK)。

【讨论】:

我在我的 Windows 机器上进行开发,这对我来说不那么令人头疼。 Mac 当前设置为仅用于查找问题。例如,我的程序的一个用户可以运行该程序(一个 Swing 应用程序),但是直到他安装了 JDK 之后,一些用于 shutdownhook 的代码才被执行;我试图弄清楚为什么在这个测试平台上,但是终端中的 JRE 不正确,因此由于开发机器和测试机器之间的版本差异(从终端运行时),它甚至在到达该点之前就出错了. 我安装了 JDK,但它并没有改变我的路径。使用 OSX 10.9.1 它不会改变路径只是更新 /usr/bin/java 运行的内容 在 Mac OS X Yosemite (10.10.2) 上,我安装了 JRE 和 JDK 8u40。关闭终端并重新打开它,我试图运行的 java 程序工作正常。感谢您的信息。【参考方案3】:

首先,您是否退出控制台并再次打开它,以便它有机会接受 PATH 变量中的更改?

如果您已经这样做了,请检查您的 Java 的默认版本是:

dwilches@ ~$ cd /System/Library/Frameworks/JavaVM.framework/Versions/
dwilches@ Versions$ ls -l
lrwxr-xr-x  1 root  wheel   59 Mar 19 10:07 CurrentJDK -> /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents
lrwxr-xr-x  1 root  wheel   10 Mar 19 10:07 1.6.0 -> CurrentJDK
lrwxr-xr-x  1 root  wheel   10 Mar 19 10:07 1.6 -> CurrentJDK
lrwxr-xr-x  1 root  wheel   10 Mar 19 10:07 1.5.0 -> CurrentJDK
lrwxr-xr-x  1 root  wheel   10 Mar 19 10:07 1.5 -> CurrentJDK
lrwxr-xr-x  1 root  wheel   10 Mar 19 10:07 1.4.2 -> CurrentJDK
lrwxr-xr-x  1 root  wheel   10 Mar 19 10:07 1.4 -> CurrentJDK
lrwxr-xr-x  1 root  wheel    1 Mar 19 10:08 Current -> A
drwxr-xr-x  8 root  wheel  272 Mar 25 10:03 A

现在,您可以看到“当前”版本是“A”(那是我的 Java7)。如果我想将其更改为 Java 1.6,那么我可以这样写:

dwilches@ Versions$ sudo unlink Current
dwilches@ Versions$ sudo ln -s 1.6 Current

然后:

dwilches@ Versions$ java -version
java version "1.6.0_43"
Java(TM) SE Runtime Environment (build 1.6.0_43-b01-447-11M4203)
Java HotSpot(TM) 64-Bit Server VM (build 20.14-b01-447, mixed mode)

因此,您可以使用它使“当前”指向您想要的 Java 位置。

【讨论】:

是的,甚至重启了整个系统;仍然说它的版本是 1.6.0_43 你能把这3个的结果贴出来吗:(1) ls -l /System/Library/Frameworks/JavaVM.framework/Versions/ (2) whereis java (3) ls -ld /usr/ bin/java 更新了原帖...忘记可以在本站编辑原帖了。 Current 已为您更新,但您的代码 sn-p 中的 CurrentJDK 仍然是 1.6.0.... 抱歉,这很旧,但对我来说仍然是个问题。跨度> 【参考方案4】:

就像 Ian 说的,但可能你希望从 .sh 脚本调用 java7,所以你需要一个函数而不是别名添加到 .bash_profile:

java7() 
    /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java "$@"

export -f java7

【讨论】:

以上是关于Mac OSX Java 终端版本不正确的主要内容,如果未能解决你的问题,请参考以下文章

python子进程终端mac osx

如何打开Mac OSX 终端的颜色

MAC下安装多版本JDK和切换几种方式

如何通过终端/CLI 在 Mac 机器上安装 OSX .provisionprofile?

苹果mac os怎么用命令行终端打开app应用程序

苹果mac os怎么用命令行终端打开app应用程序