2012-10-20 21:36:09 +0000 2012-10-20 21:36:09 +0000
84
84

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

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

在这次更新之前,我曾经能够打开Java偏好设置,并勾选Java 6或Java 7。但现在我似乎找不到Java偏好设置了。

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

答案 (10)

99
99
99
2013-02-22 12:26:51 +0000

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

假设你的默认是Java 7:

$ java -version
java version "1.7.0_15" 
…

现在让我们激活Java 6:

$export JAVA_HOME=$(/usr/libexec/java_home -v 1.6)

就这样。

$ java -version
java version "1.6.0_41"
…

我把这些加到我的.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
}

java_lsjava_home -V的输出减少到只有版本号。而java_use只是我们上述做法的一个快捷方式。如:java_use 1.6会切换到Java 6。

41
41
41
2012-10-24 17:40:09 +0000

我认为不可能切换JRE(运行时环境),见这里。

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

其中规定:"

只能安装一个JRE。

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

解决办法:

我有一个类似的问题,就像您用Wuala运行Minecraft一样。我需要使用 Java 1.6 运行 Wuala,同时我需要使用 JDK 1.7 进行开发,我通过打开 Wuala.app 包并将其启动脚本修改为。

/Applications/Wuala.app/Contents/MacOS/wuala

从:

exec java ${VMARGS} -cp "${JAR_DIR}/loader3.jar":/System/Library/Java/ com.wuala.loader3.Loader3 -alternateprogrampath "${JAR_DIR}" -installed $*

改为:

/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 $*

即简单地将:exec替换为:

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 ./

/usr/libexec/java_home -v 1.6.0 --exec替换为:/usr/libexec/java_home -v 1.7.0_06 --exec javac -version

。0x6&

这当然是相当复杂的,每次 wuala 自动更新时都会被破坏,但除此之外,它还可以工作。

要使用其他 JDK,请看这里。

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

其中说明。

要运行不同版本的Java,可以指定完整的路径,或者使用java/home工具。0x6&

下面是我的设置中的一个说明和例子。

Oracle 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 ./

苹果提供的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)

这对我来说也可以使用苹果提供的1.6 JDK

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)

在1.7 Oracle版本之间选择。

选择第一个Oracle JDK 1.7.0/04

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)

选择JDK 1.7.0/07

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)

默认JDK是最高版本。

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)

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

0x1& 当只使用次要版本号时,默认为最高的 "补丁级别"。

35
35
35
2013-03-18 22:53:29 +0000

一个轻松切换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  
   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:?;;")  
 }

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

function setjdk
  if [(count $argv) -ne 0]
    set -x PATH (string match -v /System/Library/Frameworks/JavaVM.framework/Home/bin $PATH)
    if [-n "$JAVA_HOME"]
      set -x PATH (string match -v $JAVA_HOME $PATH)
    end
    set -x JAVA_HOME (/usr/libexec/java_home -v $argv)
    set -x PATH $JAVA_HOME/bin $PATH
    echo JAVA_HOME set to $JAVA_HOME
    java -version
  end
end

用法:

0x1

7
7
7
2012-10-23 09:02:28 +0000

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

sudo ln -s /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Commands/java /usr/local/bin/java6

然后用以下方法运行应用程序:java6 -jar myapp.jar

3
3
3
2013-11-12 10:15:22 +0000

下面是一个在mac osx上切换java 6和java 7的简单方法。

第1步:从oracle官网 http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html 下载jdk 7,然后按照提示一步步安装。

步骤2:在.bash/profile中设置$JAVA/_HOME

$ vim .bash_profile 

export JAVA_HOME=$(/usr/libexec/java_home)

$ source .bash_profile

$ echo $JAVA_HOME
/Library/Java/JavaVirtualMachines/1.7.0.jdk/Contents/Home

步骤3:如果你想使用jdk 6,只需将$JAVA/_HOME替换为jdk 6的主路径

$ vim .bash_profile 

export JAVA_HOME=$(/usr/libexec/java_home -v 1.6)

$ source .bash_profile

$ echo $JAVA_HOME
/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
```。
3
3
3
2013-05-16 22:11:30 +0000

在OS X上,不需要改变$JAVA/HOME变量就能即时切换Java版本,这很简单。

我正在运行10.8.2,我的$JAVA/_HOME变量指向/Library/Java/Home

echo $JAVA_HOME

这个路径是一个符号链接,可以通过运行ls -l命令

ls -la /Library/Java

默认符号链接指向

Home -/> /Library/Java/JavaVirtualMachines/1. 6.0/33-b03-424.jdk/Contents/Home/

要将java重定向到我的1.7安装,我只需将旧的Home符号链接替换为指向我的Java 1.7安装的home目录的新符号链接。

cd /Library/Java
mv Home Home-1.6
ln -s /Library/Java/JavaVirtualMachines/jdk1.7.0_21.jdk/Contents/Home/ Home

瞧!java -version显示我现在正在运行java 1.7。只要切换当前名为 “Home "的符号链接,就可以立即改变默认的java JRE。

3
3
3
2014-06-10 17:02:51 +0000

管理你的Java环境(在Mac和Linux上)。 http://www.jenv.be/

类似于Ruby的RVM和Node的N,但适用于Java。

3
3
3
2012-10-21 14:58:46 +0000

Java偏好程序似乎没有列出Java 1.6了。然而,当我在命令行中检查java版本时,我得到了。

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)
2
2
2
2014-02-21 14:32:13 +0000

基于以上内容和其他一些研究,我设计了一个脚本,你可以将它 “源"(或 "点")到你的配置文件中。它将提示你Mac上可用的JAVA/HOMEs菜单,不过你也可以指定默认的主页,或者预先选择一个菜单。

在我的.bash_profile

export PREJAVA_PATH="$PATH:~/bin"
export PATH="${PREJAVA_PATH}"
. gojava -d

注意它需要一个变量PREJAVA_PATH. 你也可以从命令行调用它:

$ . gojava

或者预先选择第二个选项。

$ . gojava -c 2

文件gojava是:

#!/bin/bash

_exe=/usr/libexec/java_home
_defaultHome=$($_exe)

usage() {
cat <<EOF
$0 [-d] [-c menu_choice]

Sets JAVA_HOME and PATH variables based on a user choice from a menu of available JDKs.

Parameters:

  -d : use system default ($_defaultHome)
  -c : specify a menu choice in advance, without being prompted

Note that environment variable PREJAVA_PATH must be set, and should include the PATH that 
you want with everything but JAVA_HOME/bin.

EOF
exit 1
}

setHomePath() {
  export JAVA_HOME="$1"
  export PATH="${JAVA_HOME}/bin":"${PREPATH}"
}

# TODO: [enhancement] figure out a better way to determine a PATH that excludes the JAVA_HOME
if [-z "${PREJAVA_PATH}"]; then
  usage  
else
  PREPATH=${PREJAVA_PATH}
fi

_default=0
_choice=0
OPTIND=1
while getopts "dc:" name; do
 case $name in
      d) _default=1 ;;
      c) _choice="$OPTARG" ;;
      *) echo "unknown parameter $name"
         usage
         ;;
 esac
done

if [$_default -eq 1]; then
  setHomePath "$_defaultHome"
else
  i=1
  while read -r line; do
    choiceList[$i]="$line"
    homeList[$i]=$(echo $line | sed 's/[^\/]*\(\/.*\)//')
    i=$(($i+1))
  done < <($_exe -V 2>&1 | egrep -v '^$|^\/|^Matching')

  if [$_choice -gt 0 -a $_choice -lt $i]; then
    setHomePath "${homeList[$_choice]}"
  else
    printf "\nList of available Java versions:\n"
    select choice in "${choiceList[@]}"; do
      if [$REPLY -gt 0 -a $REPLY -lt $i]; then
        setHomePath "${homeList[$REPLY]}"
        break
      fi
    done
  fi
fi
```。
0
0
0
2016-03-12 13:10:22 +0000

鱼壳版的@alex答案(加到~/config/fish/config.fish):

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
    set JAVA_HOME (/usr/libexec/java_home -v $argv)
    set PATH $JAVA_HOME/bin $PATH
    java -version
end
```。