Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
苹果';s最近的Java更新删除了Java首选项,如何从shell中更改?_Java_Macos_Bash_Shell_Zsh - Fatal编程技术网

苹果';s最近的Java更新删除了Java首选项,如何从shell中更改?

苹果';s最近的Java更新删除了Java首选项,如何从shell中更改?,java,macos,bash,shell,zsh,Java,Macos,Bash,Shell,Zsh,苹果本周的Java更新将Java Preferences.app从实用程序中删除。当在不同的开发环境中使用不同版本的Java时,从Java6到Sun的1.7似乎不再像以前那样容易实现 我相信仍然应该有一个shell机制来实现这一点,但是我并不容易找到它在shell会话中,如何正确更改Java的当前活动版本? (我这样说是正确的,因为我想确保所有的环境变量都设置正确,比如JAVA_HOME、it's path等。) 此外,我认为,几年前,我偶然发现了一个脚本,它可以通过简单地列出选项,然后定义切换

苹果本周的Java更新将Java Preferences.app从实用程序中删除。当在不同的开发环境中使用不同版本的Java时,从Java6到Sun的1.7似乎不再像以前那样容易实现

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

(我这样说是正确的,因为我想确保所有的环境变量都设置正确,比如JAVA_HOME、it's path等。)


此外,我认为,几年前,我偶然发现了一个脚本,它可以通过简单地列出选项,然后定义切换到哪个选项来为您更改JavaEnv。可能是我对Ubuntu中的工具感到困惑,但我几乎可以肯定它是针对OSX的。。。这将是有帮助的,要么知道这是什么,或者也许我们应该写一个快速脚本,如果一个不存在,将满足这一需要;也许把它插入自制软件中?

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

这就是我学到的

  • java在哪里
    指向
    /usr/bin/java
  • /usr/bin/java
    是指向
    /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java
  • 在我的Mac电脑上,
    /System/Library/Frameworks/JavaVM.framework/Versions/Current
    是指向当前为Java 1.7.0的
    /System/Library/Frameworks/JavaVM.framework/Versions/a
    的符号链接
我们需要做的是将
Current
重定向到我们想要使用的JVM

在我的系统上,Java 1.6.037安装在
/system/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK
中,它是指向
/system/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents

我所做的是

备份当前的
代码

sudo mv Current Current.bak
sudo mv Current Current.1.6
创建一个新的符号链接到
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)
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.bak
sudo mv Current Current.1.6
然后将
Current
重新链接到
A

sudo ln -s A 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)
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.1.7
sudo mv Current.1.6 Current
向后移动,反向移动向前移动

这个解决方案的灵感来源于,但我不得不尝试一下,以确保;)

已更新


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

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

#!/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

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

您可以重新安装苹果的Java 6,它应该重新安装preferences实用程序(我还没试过),你可以从我的网站上拿一份,我对“倒退”不太感兴趣但是,我更倾向于使用苹果的参数/约束。因此,在没有旧的首选项面板的情况下工作是我试图理解如何在OS X中完成的,因为使用Linux发行版通常非常简单。这很有趣,因为你已经完成了我所做的工作,但是我现在有一些奇怪的错误。你没有在重新链接之后,您运行java应用程序的环境不会有任何问题吗?老实说,我还没有完全测试过,但它确实给了我一些奇怪的开始。我能够让Netbeans暂时将1.6视为一个单独的平台:PInteresting,我将不得不再玩一些。理想情况下,我们需要将其包装到一个包含在自制软件中的脚本,或者类似的,我认为这对于修改版本来说肯定是非常必要的。你得到了我的投票,把它交给workHey@MadProgrammer是一件痛苦的事情。我在这里添加了另一个答案,我认为它确实更全面地解决了我们的问题,我已经在这方面取得了一些坚实的成功。我我想你可能会对这个选项感兴趣。感谢你最初的回答!现在你只需要做它,这样你就可以根据当前设置为默认值的内容前后翻转它。。。