4

今週の Apple の Java アップデートにより、Utilities から Java Preferences.app が削除されます。さまざまな開発環境で異なるバージョンの Java 間で作業している場合、以前のように Java 6 から Sun の 1.7 に変更することは、もはや簡単に実現できないようです。

これを達成するためのシェル メカニズムがまだ存在するはずですが、すぐには見つかりません。 シェル セッション中に現在アクティブな Java のバージョンを適切に変更するにはどうすればよいですか?

(JAVA_HOME、パスなど、すべての環境変数が適切に設定されていることを確認したいので、PROPERLYと言います。)

さらに、数年前に、オプションをリストしてから切り替えるものを定義するだけで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です。これは現在Java1.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

その後、Currentに再リンクA

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 つは、1.7 リリース シナリオで問題が発生している Minecraft を実行するスクリプトを作成することです。明らかに、さまざまな程度の問題を抱えている同様のアプリが他にもあります。これは、デフォルトの方法を使用したり、シンボリックリンクをハックしたりするのではなく、使用する Java バージョンを制御するのにも役立ちます。

于 2012-11-01T06:29:32.280 に答える