web-dev-qa-db-ja.com

/ usr / libexec / Java_homeから返されたMac OSのデフォルトのJava VMを変更するにはどうすればよいですか

(これがSUに続くかどうかはわかりませんでした...移行は確かにオプションですが、より多くのプログラマーがここで質問を読むので、ここに行きます)。

Mac OS X 10.8.4を実行していますが、AppleのJDK 1.6.0_51とOracleのJDK 1.7.0_25がインストールされています。私は最近、それを必要とするいくつかのプレリリースソフトウェア用にOracle 1.8プレビューJDKをインストールしました。さて、/ usr/libexec/Java_homeを実行すると、次のようになります:

$ /usr/libexec/Java_home -V
Matching Java Virtual Machines (4):
    1.8.0, x86_64:  "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home
    1.7.0_25, x86_64:   "Java SE 7" /Library/Java/JavaVirtualMachines/jdk1.7.0_25.jdk/Contents/Home
    1.6.0_51-b11-457, x86_64:   "Java SE 6" /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
    1.6.0_51-b11-457, i386: "Java SE 6" /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home

すばらしいです。

ただし、実行中:

$ Java -version

戻り値:

Java version "1.8.0-ea"

つまり、現在のJavaのデフォルトバージョンはプレリリースバージョンであり、一部の「通常の」パッケージ(私の場合はVisualVM)を破壊します。

Java_HOMEを設定することはできません。アプリケーションを起動すると、コマンドラインから起動する場合でも環境変数が無視されるためです(例:$ open /Applications/VisualVM.app)。

だから、JVMの順序設定を設定できる場所に編集できるファイルがありますかグローバルに

(Java Preferences Panelを起動するように指示しないでください。これは単に機能しないため、有用なものは何も含まれておらず、インストールした4つのJVMの1つのみをリストします。)

更新

Oracle JVMは/Library/Java/JavaVirtualMachinesに存在します。 JDK 1.8ディレクトリの名前をjdk1.8.0.jvm.xyzに変更しても何も変わりません。Java_homeは正しい場所にあり、/ usr/bin/Javaを実行しても1.8 JVMが実行されます。これは、シンリンクなどの問題ではありません。

同様の質問に対する回答

この回答 は、JavaのバージョンをJava_homeが取得するのを削除するハックに相当しますが、のこの質問にはまだ答えていませんhowJava_homeはデフォルトを選択し、ユーザーが 非破壊的に設定 できるかどうかを選択します。

98

Java_HOMEが最善の方法だと思います。 Javajavacなどのコマンドラインツールはその環境変数を尊重します。/usr/libexec/Java_home -v '1.7*'を使用して、コマンドラインツールでJavaを使用するためにJava_HOMEに入れる適切な値を指定できます。

export Java_HOME="`/usr/libexec/Java_home -v '1.7*'`"

ただし、標準のダブルクリック可能なアプリケーションバンドルは、/Library/Javaの下にインストールされたJDKをまったく使用しません。 AppleのJavaApplicationStubを使用した古いスタイルの.appバンドルは、/System/Library/FrameworksのApple Java 6を使用し、バンドルされたJREなしで AppBundler で構築された新しいスタイル/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Homeの「パブリック」JRE-これはスタブコードにハードコーディングされており、変更できません。また、2つの異なるパブリックJREを同時にインストールすることはできません。


編集:VisualVMを具体的に見てきました。 ダウンロードページ の「アプリケーションバンドル」バージョンを使用しており、この特定のアプリはAppBundlerアプリケーションではなく、そのメインの実行可能ファイルが他の多くのシェルスクリプトを呼び出し、さまざまな構成ファイルを読み取るシェルスクリプト。 7u10以降である限り、デフォルトで/Library/Javaから最新のJDKを選択するか、Java 7インストールがアップデート9以前の場合はJava 6を使用します。しかし、シェルスクリプトのロジックを解明すると、構成ファイルを使用して特定のJDKを指定できるように思えます。

行を含むテキストファイル~/Library/Application Support/VisualVM/1.3.6/etc/visualvm.conf(1.3.6を使用しているVisualVMのバージョンに置き換えます)を作成します

visualvm_jdkhome="`/usr/libexec/Java_home -v '1.7*'`"

これにより、強制的に8ではなくJava 7が選択されます。

85
Ian Roberts

私もそこに行き、/usr/libexec/Java_homeがどのように機能するかを検索しましたが、使用可能なJava仮想マシンを決定する方法に関する情報を見つけることができませんでした。

私は少し実験をしましたが、単にls /Library/Java/JavaVirtualMachinesを実行し、そこで見つかったすべてのランタイムの./<version>/Contents/Info.plistを検査するだけだと思います。

次に、Info.plistに含まれるキーJVMVersiondescendingをソートし、デフォルトで最初のエントリをデフォルトのJVMとして使用します。

私たちができることは、plist:Sudo vi /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Info.plistを変更し、JVMVersionを1.8.0から、!1.8.0のように、トップではなくボトムにソートする他の何かに変更することだけだと思います。

何かのようなもの:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.Apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    ...
    <dict>
            ...
            <key>JVMVersion</key>
            <string>!1.8.0</string>   <!-- changed from '1.8.0' to '!1.8.0' -->`

そして、それはリストの上部から魔法のように消えます:

/usr/libexec/Java_home -verbose
Matching Java Virtual Machines (3):
    1.7.0_45, x86_64:   "Java SE 7" /Library/Java/JavaVirtualMachines/jdk1.7.0_45.jdk/Contents/Home
    1.7.0_09, x86_64:   "Java SE 7" /Library/Java/JavaVirtualMachines/jdk1.7.0_09.jdk/Contents/Home
    !1.8.0, x86_64: "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home

次に、ログアウト/ログインしてから、次の手順を実行する必要があります。

Java -version
Java version "1.7.0_45"

:-)

もちろん、他に何かが壊れているのか、それとも1.8.0-eaバージョンのJavaがまだ正しく動作するのかはわからない

おそらくこれを行うべきではなく、単に1.8.0を削除するだけです。

しかしこれまでのところ、これは私のために働いています。

48
void256

Oracleの Java 7のアンインストール手順 が機能しました。

抜粋:

JDKのアンインストールJDKをアンインストールするには、管理者特権を持ち、rootまたはSudo(8)ツールを使用してremoveコマンドを実行する必要があります。

/ Library/Java/JavaVirtualMachinesに移動し、次の形式に一致する名前のディレクトリを削除します。*

/Library/Java/JavaVirtualMachines/jdk<major>.<minor>.<macro[_update]>.jdk

たとえば、7u6をアンインストールするには:

% rm -rf jdk1.7.0_06.jdk

5
duma

袖をまくり上げてもかまわない場合は非常に簡単です... / Library/Java/HomeはJava_HOMEのデフォルトであり、次のいずれかを指す単なるリンクです。

  • /System/Library/Java/JavaVirtualMachines/1.?.?.jdk/Contents/Home
  • /ライブラリ/Java/JavaVirtualMachines/jdk1.?.?_??.jdk/Contents/Home

だから、デフォルトのJVM/JDKバージョンを変更したかったwithout Java_HOMEの内容を変更する.../Library/Java/Homeは現在のJVM/JDKの標準の場所であり、それが保存したかった...副作用が最も少ないものを変更する最も簡単な方法であるように思えます。

実際には非常に簡単です。 Java -versionで表示されるJavaのバージョンを変更するために必要なことは、このバージョンの一部のみです。

cd /Library/Java
Sudo rm Home
Sudo ln -s /Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home ./Home

時間はかかりませんが、/ usr/libexec/Java_homeとlnを使用して上記のシンボリックリンクを再ポイントする非常に単純なシェルスクリプトは、簡単に作成できるはずです...

/ Library/Java/Homeが指す場所を変更したら...正しい結果が得られます。

cerebro:~ magneto$ Java -version
Java version "1.8.0_60"
Java(TM) SE Runtime Environment (build 1.8.0_60-b27) Java HotSpot(TM)
64-Bit Server VM (build 25.60-b23, mixed mode)
5
jrypkahauer

実際には非常に簡単です。 JavaVirtualMachinesフォルダにこれがあるとしましょう:

  • jdk1.7.0_51.jdk
  • jdk1.8.0.jdk

1.8がデフォルトであるとし、新しいフォルダー(たとえば「old」)を追加して、デフォルトのjdkフォルダーをその新しいフォルダーに移動するだけです。もう一度Java -versionを実行して、1.7!

5
User404

少し遅れましたが、これはMac OSXで進行中の問題です...

私が見つけた最も簡単な解決策は、AppleがインストールするOpenJDKのものを単に削除することでした。 Mac OSXのアップデートが届くたびにインストールされますので、再度削除する必要があります。

Javaを使用してMac上でGoogle App Engine用のアプリを開発する場合、これは非常にうまく機能します。 OpenJDKはうまく機能せず、Mac OSX Yosemiteアップグレードに付属するJavaバージョンでは、すべてのデプロイメントでApp Engine用Eclipseプラグインがクラッシュし、「Read timed out」というエラーが発生します。

4
Mo'in Creemers

「jenv」や「Java_HOME」の設定など、他のことをテストしましたが成功しませんでした。今、私は次のソリューションに行き着きます

function setJava {
    export Java_HOME="$(/usr/libexec/Java_home -v $1)"
    launchctl setenv Java_HOME $Java_HOME
    Sudo ln -nsf "$(dirname ${Java_HOME})/MacOS" /Library/Java/MacOS 
    Java -version
}

(〜/ .bashrcまたは〜/ .bash.profileまたは〜/ .zshrcに追加)

そして、そのような呼び出し:

setJava 1.8

Java_homeは間違った入力を処理します。あなたは何か間違ったことをすることはできません。 Mavenやその他のものは今すぐ適切なバージョンを選択します。

1
Yuna Braska