4

Apple 本周的 Java 更新从 Utilities 中删除了 Java Preferences.app。当在不同的开发环境中使用不同版本的 Java 时,似乎不再像以前那样容易地从 Java 6 更改为 Sun 的 1.7。

我相信仍然应该有一个外壳机制来实现这一点,但是我不容易找到它。 在 shell 会话中如何正确更改 Java 的当前活动版本?

(我说正确是因为我想确保所有环境变量都设置得当,例如 JAVA_HOME、它的路径等)

此外,我想,几年前,我偶然发现了一个脚本,它可以通过简单地列出选项然后定义切换到哪个选项来为您更改 Java 环境。可能是我对 Ubuntu 中的工具感到困惑,但我几乎可以肯定它适用于 OS X ......知道这是什么或者我们应该编写一个快速脚本会很有帮助,如果有人不知道的话'不存在,这将满足这种需求;也许将其插入 Homebrew 中?

4

2 回答 2

2

首先,谢谢你的问题,我需要自己解决这个问题。

这是我学到的。。

  • whereis java指着/usr/bin/java
  • /usr/bin/java是一个符号链接/System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java
  • 在我的 Mac 上,/System/Library/Frameworks/JavaVM.framework/Versions/Current是指向 的符号链接/System/Library/Frameworks/JavaVM.framework/Versions/A,目前是 Java 1.7.0._07-b10

我们需要做的是重定向Current到我们想要使用的 JVM。

在我的系统上,Java 1.6.0_37 安装在 中/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK,这是指向的符号链接/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents

我所做的是...

备份Current

sudo mv Current Current.bak

创建一个新的符号链接到CurrentJDK

sudo ln -s CurrentJDK Current

然后在命令行,我做java -version了并得到了

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)

现在,要将其移回,我只需将Current

sudo mv Current Current.1.6

然后重新链接CurrentA

sudo ln -s A Current

然后在命令行,我做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)

现在我需要做的就是向后移动sudo mv Current Current.1.7sudo mv Current.1.6 Current反转它以向前移动。

该解决方案的灵感来自https://discussions.apple.com/thread/4444438?start=0&tstart=0,但我不得不尝试使用它来确保 ;)

更新

在玩了一些之后,我创建了一个java6符号链接,它位于/usr/bin/java6并指向/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Commands/java,这基本上允许我java6从命令行执行而无需切换版本

于 2012-10-21T23:31:12.820 回答
0

感谢最初回答这个问题的@MadProgrammer。我进一步探索了一些东西,并找到了一些示例,这些示例帮助我使用了以下脚本,我现在使用这些脚本来执行当前无法在 Java 1.7 中运行的 Java 应用程序:

#!/usr/bin/env bash
# Or plug in `zsh` instead of `bash` above if that is your preferred shell

DIR=$(pwd)
cd "$DIR"
APPLICATION_NAME="App Name"

echo -n "Locating Java ... "

PLATFORM=$(uname)
JAVA_PATH="java"
JAVA_VER=$($JAVA_PATH -version 2>&1 | sed 's/java version "\(.*\)\.\(.*\)\..*"/\1\2/; 1q')

if [[ "$JAVA_VER" == *"command not found"* ]]; then
    echo "Java not found."
else
    JAVA_VER_FULL=$($JAVA_PATH -version 2>&1 | awk -F '"' '/version/ {print $2}')

    if [[ $JAVA_VER -eq 17 ]]; then
        echo "v1.7 found."

        if [[ $PLATFORM -eq "Darwin" ]]; then
            echo "[!!!] WARNING: Java v1.7 on OS X is known to have problems with ${APPLICATION_NAME}."
            echo -n "Looking for compatible version of Java ... "

            JAVA_PATH="/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home/bin/java"
            if [[ -f "$JAVA_PATH" ]]; then
                JAVA_VER=$($JAVA_PATH -version 2>&1 | sed 's/java version "\(.*\)\.\(.*\)\..*"/\1\2/; 1q')
                JAVA_VER_FULL=$($JAVA_PATH -version 2>&1 | awk -F '"' '/version/ {print $2}')
                if [[ $JAVA_VER -eq 16 ]]; then
                    echo "$JAVA_VER_FULL found. Using this version."
                else
                    echo "No known compatible versions of Java could be found. ${APPLICATION_NAME} may not run properly, or at all."
                fi
            fi
        else
            echo "$JAVA_VER_FULL found."
        fi
    else
        echo "$JAVA_VER_FULL found."
    fi
fi

echo ""


echo "Starting ${APPLICATION_NAME}..."


# Insert the java application or jar that you wish to execute here prepended by `$JAVA_PATH` instead of simply `java`
# For example:
#
# $JAVA_PATH -jar /path/to/the/application.jar

对此可能有用的一种情况是创建一个脚本来运行在 1.7 版本场景中存在问题的 Minecraft。显然,还有其他类似的应用程序存在不同程度的问题,这对于控制您希望使用的 Java 版本同样有用,而不仅仅是使用默认方法或试图破解符号链接。

于 2012-11-01T06:29:32.280 回答