63

好的,我对 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

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

4

4 回答 4

134

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您只需将您的指向即可切换回 1.6 /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home。您可以使用该/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

alias java_jre='/Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java'
于 2013-03-25T21:57:21.093 回答
11

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

根据 Oracle 的 JRE安装文档

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

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

Oracle安装常见问题解答

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

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

如果您计划编写 Java 应用程序,请安装 Java Development Kit (JDK)。

于 2013-03-25T21:47:11.880 回答
5

首先,您是否退出控制台并再次打开它,以便有机会接受 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 位置。

于 2013-03-25T21:13:36.040 回答
-1

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

java7() {
    /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java "$@"
}
export -f java7
于 2013-11-09T22:56:02.170 回答