如何在 OS X 10.8.2 上的 Java 7 和 Java 6 之间切换?

Nik*_*how 84 java osx-mountain-lion macos

我正在使用 Java SE 7 为 windows 和 mac 编写简单的游戏,但我必须切换到 java 6 才能在我的计算机上运行诸如 Minecraft 之类的游戏。在我更新到 Mac OS X 10.8.2 Build 12C60 之前,这曾经工作得很好。

在此更新之前,我曾经能够打开 Java Preferences 并检查 Java 6 或 Java 7。但现在我似乎无法找到 Java Preferences。

我正在运行 OS X 10.8.2(最新版本)。

小智 100

人们可以java_home更方便地使用该机制。

假设您将 Java 7 作为默认值:

$ java -version
java version "1.7.0_15" 
…
Run Code Online (Sandbox Code Playgroud)

现在让我们激活 Java 6:

$export JAVA_HOME=$(/usr/libexec/java_home -v 1.6)
Run Code Online (Sandbox Code Playgroud)

它是:

$ java -version
java version "1.6.0_41"
…
Run Code Online (Sandbox Code Playgroud)

.bashrc为了让事情更方便,我将这些添加到我的:

alias java_ls='/usr/libexec/java_home -V 2>&1 | grep -E "\d.\d.\d[,_]" | cut -d , -f 1 | colrm 1 4 | grep -v Home'

function java_use() {
    export JAVA_HOME=$(/usr/libexec/java_home -v $1)
    export PATH=$JAVA_HOME/bin:$PATH
    java -version
}
Run Code Online (Sandbox Code Playgroud)

java_ls将 的输出减少java_home -V到仅版本号。并且java_use只是我们上面所做的快捷方式。例如java_use 1.6将切换到 Java 6。

  • 在 java_use 中,您应该从 $PATH 中删除以前的 java。 (3认同)

小智 41

我认为无法切换 JRE(运行时环境),请参见此处:

http://docs.oracle.com/javase/7/docs/webnotes/install/mac/mac-jre.html

其中指出:

只能安装一个 JRE。安装 JRE 会删除之前安装的 JRE。系统使用的 JRE 版本可以通过以下两种方式之一确定:

解决方法:

我遇到了类似的问题,就像你在使用 Wuala 的 Minecraft 时遇到的一样。我需要使用 Java 1.6 运行 Wuala,而我需要使用 JDK 1.7 进行开发,我通过打开 Wuala.app 包并将其启动脚本更改为:

/Applications/Wuala.app/Contents/MacOS/wuala
Run Code Online (Sandbox Code Playgroud)

从:

exec java ${VMARGS} -cp "${JAR_DIR}/loader3.jar":/System/Library/Java/ com.wuala.loader3.Loader3 -alternateprogrampath "${JAR_DIR}" -installed $*
Run Code Online (Sandbox Code Playgroud)

到:

/usr/libexec/java_home -v 1.6.0 --exec java ${VMARGS} -cp "${JAR_DIR}/loader3.jar":/System/Library/Java/ com.wuala.loader3.Loader3 -alternateprogrampath "${JAR_DIR}" -installed $*
Run Code Online (Sandbox Code Playgroud)

即简单地将:替换exec为:/usr/libexec/java_home -v 1.6.0 --exec

这当然是相当复杂的,每次 wuala 自动更新时都会被破坏,否则它会起作用。

要使用另一个 JDK,请参见此处:

http://docs.oracle.com/javase/7/docs/webnotes/install/mac/mac-jdk.html

其中指出:

要运行不同版本的 Java,请指定完整路径,或使用 java_home 工具: /usr/libexec/java_home -v 1.7.0_06 --exec javac -version

这是我的设置中的插图和示例:

Oracle JDK 安装:

odin:~ geff$ ls -al /Library/Java/JavaVirtualMachines 
total 0
21058660 0 drwxr-xr-x  3 root  wheel  - 102 24 Oct 18:04:33 2012 jdk1.7.0_09.jdk/
21061692 0 drwxr-xr-x  3 root  wheel  - 102 24 Oct 18:06:08 2012 jdk1.7.0_07.jdk/
21042328 0 drwxrwxr-x  3 root  wheel  - 102 20 Apr 06:58:53 2012 1.7.0.jdk/
21031664 0 drwxrwxr-x  7 root  admin  - 238 24 Oct 18:04:16 2012 ../
21042327 0 drwxr-xr-x  5 root  wheel  - 170 24 Oct 18:06:13 2012 ./
Run Code Online (Sandbox Code Playgroud)

Apple 提供的 JDK:

odin:~ geff$ ls -al /System/Library/Java/JavaVirtualMachines 
total 0
21026468 0 drwxr-xr-x  3 root  wheel  - 102  1 Nov 17:49:02 2011 1.6.0.jdk/
21026436 0 drwxr-xr-x  6 root  wheel  - 204 24 Mar 23:04:06 2012 ../
21026467 0 drwxr-xr-x  3 root  wheel  - 102  1 Nov 17:49:02 2011 ./
Run Code Online (Sandbox Code Playgroud)

这也适用于我使用 Apple 提供的 1.6 JDK

odin:~ geff$ /usr/libexec/java_home -v 1.6.0_37 --exec java -version
java version "1.6.0_37"
Java(TM) SE Runtime Environment (build 1.6.0_37-b06-434-11M3909)
Java HotSpot(TM) 64-Bit Server VM (build 20.12-b01-434, mixed mode)
Run Code Online (Sandbox Code Playgroud)

在 1.7 Oracle 版本之间进行选择:

选择第一个 Oracle JDK 1.7.0_04

odin:~ geff$ /usr/libexec/java_home -v 1.7.0_04 --exec java -version
java version "1.7.0_04"
Java(TM) SE Runtime Environment (build 1.7.0_04-b21)
Java HotSpot(TM) 64-Bit Server VM (build 23.0-b21, mixed mode)
Run Code Online (Sandbox Code Playgroud)

选择 JDK 1.7.0_07

odin:~ geff$ /usr/libexec/java_home -v 1.7.0_07 --exec java -version
java version "1.7.0_07"
Java(TM) SE Runtime Environment (build 1.7.0_07-b10)
Java HotSpot(TM) 64-Bit Server VM (build 23.3-b01, mixed mode)
Run Code Online (Sandbox Code Playgroud)

默认JDK是最高的:

odin:~ geff$ java -version
java version "1.7.0_09"
Java(TM) SE Runtime Environment (build 1.7.0_09-b05)
Java HotSpot(TM) 64-Bit Server VM (build 23.5-b02, mixed mode)
Run Code Online (Sandbox Code Playgroud)

仅使用次要版本号时,默认为最高“补丁级别:

odin:~ geff$ /usr/libexec/java_home -v 1.7.0 --exec java -version
java version "1.7.0_09"
Java(TM) SE Runtime Environment (build 1.7.0_09-b05)
Java HotSpot(TM) 64-Bit Server VM (build 23.5-b02, mixed mode)
Run Code Online (Sandbox Code Playgroud)


Nee*_*aks 35

一种轻松切换 JDK(不确定 JRE)的解决方案,适用于任何 JDK 版本,而不仅仅是 6 和 7(源代码):

Bash shell,将此功能添加到您的.bash_profile

function setjdk() {  
  if [ $# -ne 0 ]; then  
   removeFromPath '/System/Library/Frameworks/JavaVM.framework/Home/bin'  
   if [ -n "${JAVA_HOME+x}" ]; then  
    removeFromPath $JAVA_HOME  
   fi
   unset JAVA_HOME # We need this on Big Sur, see https://developer.apple.com/forums/thread/666681
   export JAVA_HOME=`/usr/libexec/java_home -v $@`  
   export PATH=$JAVA_HOME/bin:$PATH  
   echo JAVA_HOME set to $JAVA_HOME  
   java -version  
  fi
 }  
 function removeFromPath() {  
  export PATH=$(echo $PATH | sed -E -e "s;:$1;;" -e "s;$1:?;;")  
 }
Run Code Online (Sandbox Code Playgroud)

Fish shell,将此函数另存为~/.config/fish/functions/setjdk.fish

function setjdk
  if [ (count $argv) -ne 0 ]
    set -g -x PATH (string match -v /System/Library/Frameworks/JavaVM.framework/Home/bin $PATH)
    if [ -n "$JAVA_HOME" ]
      set -g -x PATH (string match -v $JAVA_HOME $PATH)
    end
    set -e JAVA_HOME # We need this on Big Sur, see https://developer.apple.com/forums/thread/666681
    set -g -x JAVA_HOME (/usr/libexec/java_home -v $argv)
    set -g -x PATH $JAVA_HOME/bin $PATH
    echo JAVA_HOME set to $JAVA_HOME
    java -version
  end
end
Run Code Online (Sandbox Code Playgroud)

用法:

$ setjdk 1.7
Run Code Online (Sandbox Code Playgroud)


小智 7

一个快速的解决方法是创建一个指向旧 Java 6 二进制文件的符号链接:

sudo ln -s /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Commands/java /usr/local/bin/java6
Run Code Online (Sandbox Code Playgroud)

然后使用以下命令运行应用程序:java6 -jar myapp.jar