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


108

(これが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設定パネルを起動するように言わないでください。これは機能しません。便利なものは何も含まれておらず、インストールした4つのJVMの1つしかリストされていません。)

更新

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

同様の質問への回答

一方で、この回答 JAVA_HOMEによってピックアップされてからのJavaのバージョンを削除しますハックに相当するものの提供は、それはまだこの問いに答えるしませんどのように JAVA_HOMEがデフォルトを選択し、ユーザーができるかどうかを非破壊的に設定します


「which java」と入力して、パンくずリストに従ってください。/usr/bin/javaは単なるシンボリックリンクです
ブライアンローチ

11
そこに行って、それをやった。/usr/bin/javaを指し/System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/javaます。Versionsディレクトリは、1.8.0 JDKへのシンボリックリンクが含まれていません。代わりに、それは親切というディレクトリが含まにポイントを。「JAVA_HOMEではありませんそれはというサブディレクトリがある。持っているコマンドを、それは、知っている-何をして不透明なユニバーサルバイナリで、私はそれを使用しています疑い。使用するJVMを決定する、など。ACurrentACommandsjavajava_home
クリストファー・シュルツ

2
これがトピックから外れている場合は、閉じるのではなく移行してください。FWIW、これは「プログラマが一般的に使用するソフトウェアツール」に関するものであるため、「オフトピック」を閉じることは不誠実です。
クリストファーシュルツ2013

はい、これはイライラします!全部で1つのJDK、または1.7と1.8を簡単に切り替えることができる2つのJDKが必要です。
ブライアン

1
私はこのSOの回答がこの質問に役立つとわかりました:stackoverflow.com/a/44169445/2987755
dkb

回答:


89

JAVA_HOMEあなたができる最高だと思います。コマンドラインツールはjavajavacその環境変数を尊重し、尊重します。コマンドラインツールでJava 7 を使用/usr/libexec/java_home -v '1.7*'するために、適切な値をJAVA_HOME入力するために使用できます。

export JAVA_HOME="`/usr/libexec/java_home -v '1.7*'`"

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


編集:特にダウンロードページの「アプリケーションバンドル」バージョンを使用し、この特定のアプリがAppBundlerアプリケーションではなく、代わりにメインの実行可能ファイルが番号を呼び出すシェルスクリプトであると想定して、VisualVMを具体的に調べました他のシェルスクリプトのさまざまな構成ファイルを読み取ります。デフォルト/Library/Javaでは、7u10以降である限り最新の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が選択されます。


これは私のシステムには当てはまらないようです。JDK 1.8がインストールされる前にVisualVMを起動しても機能しました。JDK1.8の後で、VisualVMはスプラッシュ画面を表示してから終了します。JDK1.8ディレクトリを/ Library / Javaの外に移動すると、実行する機能が復元されます。
クリストファーシュルツ2013

@ChristopherSchultz VisualVMバンドルの内部を調べたところ、通常のappbundlerアプリケーションではないことがわかりました。可能な回避策については、私の編集を参照してください。
Ian Roberts

申し訳ありませんが、編集前に以前のコメントを書きました。そのテクニックを使用してVisualVMを実行することを確認しますが、普遍的に適用できる可能性は低いです。私はEclipseやJasperReports iReportなどのように、Javaベースのソフトウェアをたくさん実行していますが、これらの影響を受ける可能性があります。JDK1.8ディレクトリをどこか別の場所に移動し、実際に必要な(ほんの数回)だけ明示的にJAVA_HOMEで使用したいと思います。
クリストファーシュルツ2013

1
うん、あなたは正しい、JAVA_HOME行く方法であり、一般的に最善の策は、他の場合に必要なマイナーバージョンを指定することです。逆アセンブルに基づいて、デフォルトでJDK8ではなくJKD7を表示export JAVA_VERSION=1.7することができることがjava_homeわかりましたが、それは追加の制約として解釈され、相互に満たされない制約のためにあきらめ、オプションがあってもデフォルトの1.8で続行されるjava_home -v 1.6ため、失敗java-home--failfastます。
andrewdotn 2014年

2
システム環境設定のJavaコントロールパネルがシェルスクリプト/コマンドに頼るのではなく、選択できるリストを表示しないのはなぜですか。これはブラウザで実行されるアプレットのためだけだと思います...
JGFMK

51

私もそこに行って、どのように/usr/libexec/java_home機能するかを至る所で検索しましたが、それがリストにある利用可能なJava仮想マシンをどのように決定するかについての情報は見つかりませんでした。

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

次に、Info.plistに含まれているキーで降順に並べ替えJVMVersionます。デフォルトでは、最初のエントリをデフォルトの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"

:-)

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

おそらくこれは何もすべきではなく、単に1.8.0をアンインストールします。

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


これでうまくいきました。Mac OSでIdea Sbtプラグインを機能させるために、この調整を使用する必要がありました。私はブログagilebuild.blogspot.com/2014/02/…で
antoine

これは機能しますが、少し注意が必要で、標準の操作手順のようには見えない可能性があります。より良いアプローチがあるかどうか迷います。
Weibo Li

私はまだこれの解決策が欲しいのですが、Intellijが使用するようにJDKを設定するために、これをzshenvに追加しました:export IDEA_JDK = /usr/libexec/java_home -v 1.7。JAVA_HOMEについても同じことをすると思います...
David Resnick

Java 9を使用してダブルクリックアプリケーションを起動することを回避するために、この回答を使用しています(キーストアストアエクスプローラーの問題のため)。ありがとう!
Nicolas Henneaux、2017年

2
macOSでのJDKおよびJREのインストールからの抜粋:macOS 2012-006にJavaをインストールする/usr/bin/javaと、最新の JDKがインストールされていることがわかり、Javaに関連するすべてのコマンドラインツールでが使用され/usr/binます。
Jeremy Kao

7

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

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

1.8がデフォルトであることを想像してください。次に、新しいフォルダー(たとえば、「古い」)を追加し、デフォルトのjdkフォルダーをその新しいフォルダーに移動します。やるjava -version再びら出来上がり、1.7を!


1
信じられないが、それは働いていた...おかげでMac OSのモハーベ
のMichałDobiDobrzański

5

それは非常に簡単です。袖をまくっても構わないのなら... / Library / Java / HomeがJAVA_HOMEのデフォルトであり、次のいずれかを指すリンクにすぎません。

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

したがって、JAVA_HOMEの内容変更せずにデフォルトのJVM / JDKバージョン変更したいと思いました... / 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)

1
これはこれがどのように機能するかではありません。/Library/Java/Home実際にシンボリックリンクですが、それ/System/Library/Frameworks/JavaVM.framework/Home自体がシンボリックリンクの大きなごちゃ混ぜになっており、最終的には...起動する適切なJREを決定する魔法のコマンドです。/usr/libexec/java_homeこの魔法にもリンクしていることに注意してください。したがって、シンボリックリンクを置き換えて単一のJREを指すだけですべてを中断できますが、毎回それを更新する必要があります。明らかにset_preferred_jvm_version似たようなコマンドはありません。
Christopher Schultz

1
ただし、この手法の利点は、JAVA_HOMEどこにも設定する必要がないことです。この手法を試して、「推奨」Java VMでJavaベースのプログラムが起動するかどうかを確認します。私はそうなると思いますが、それはかなり壊れやすいです。
Christopher Schultz

さて最近私はこれを持っています.bash_profileexport JAVA_HOME=`/usr/libexec/java_home -v 12`
jrypkahauer

これは、要点のようなアイコンをダブルクリックした場合には機能しません。コマンドラインからのみ機能するソリューションは...ソリューションではありません。
クリストファーシュルツ

3

OracleのJava 7アンインストール手順は私にとってはうまくいきました。

抜粋:

JDKのアンインストールJDKをアンインストールするには、管理者権限が必要であり、rootとして、またはsudo(8)ツールを使用して削除コマンドを実行する必要があります。

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

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

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

% rm -rf jdk1.7.0_06.jdk


2
この質問は、アンインストールに関するものではありません...インストールされているものから「プライマリ」JVMを選択することに関するものでした...
Christopher Schultz

3

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

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

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


1
おかしい...この時点で、AppleはJavaを完全に削除したと思いました。私はAppleのJava 1.6 JVMを手動で削除したことを覚えていません。とにかく、これは、インストールされている選択肢を指定して優先JVMを指定するという元の問題を実際に修正するものではありません。
クリストファーシュルツ

あなたは正しいです。質問の答えにはなりません。これは答えになります。使用されているJVMを削除すると、リストの「次の」JVMが使用されます。多分それは役立ちます。
Mo'in Creemers 14年

これは、jdk 8インストールを実行した後、JavaVirtualMachinesフォルダーに表示されない理由を説明していますか?インストールするバージョンに関係なく、表示されるのは「1.6.0.jdk」だけです。
whyoz

@whyozは、osx 10.10.2にjdk-8u31-macosx-x64をインストールし、VMがJavaVirtualMachinesフォルダーに期待どおりにインストールされました。
Mo'in Creemers、2015

Parallelsを偶然実行していますか?私は...ないのMac側のexpected..justとしてインストールされたParallelsと8u31のWindowsの側でそれをインストール
whyoz

3

「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

ソースが利用できないので、逆アセンブラで実際にこれを少し見ました。

/ usr / bin / javaと/ usr / libexec / java_homeはどちらもJavaLaunching.frameworkを使用します。実際、JAVA_HOME環境変数は最初に/ usr / bin / javaとその仲間(/ usr / libexec / java_homeではなく)によってチェックされます。フレームワークは、JAVA_VERSIONおよびJAVA_ARCH環境変数を使用して、使用可能なJVMをフィルタリングします。したがって、デフォルトでは:

$ /usr/libexec/java_home -V
Matching Java Virtual Machines (2):
    11.0.5, x86_64: "Amazon Corretto 11"    /Library/Java/JavaVirtualMachines/amazon-corretto-11.jdk/Contents/Home
    1.8.0_232, x86_64:  "Amazon Corretto 8" /Library/Java/JavaVirtualMachines/amazon-corretto-8.jdk/Contents/Home

/Library/Java/JavaVirtualMachines/amazon-corretto-11.jdk/Contents/Home

ただし、たとえば、JAVA_VERSIONを設定すると、デフォルトをオーバーライドできます。

$ JAVA_VERSION=1.8 /usr/libexec/java_home
/Library/Java/JavaVirtualMachines/amazon-corretto-8.jdk/Contents/Home

また、JAVA_LAUNCHER_VERBOSE = 1を設定して、/ usr / bin / javaと/ usr / libexec / java_homeの両方を使用して、検索パス、見つかったJVMなどに関する追加のデバッグログを表示することもできます。

以前は、JavaLaunching.frameworkは実際に設定システム(com.apple.java.JavaPreferencesドメインの下)を使用して優先JVMの順序を設定し、デフォルトのJVMをPlistBuddyで設定できるようにしましたが、私が知る限りでは、最近のバージョンのmacOSではコードが削除されています。環境変数が唯一の方法のようです(JDKバンドル自体のInfo.plistを編集することは別として)。

もちろん、デフォルトの環境変数の設定は、セッションレベルで設定する必要がある場合は、.profileまたはlaunchdを介して行うことができます。


これはすばらしい情報です、ダン。使用.profileは私のユースケース(たとえば、ランチパッドからアプリケーションを起動する)には役立ちませんが、ヒントlaunchdは良いものです。Javaの最近のバージョン管理の狂気は、私が複数の世代のJavaを同時にインストールしており、さまざまなレベルの(個人的な)信頼があるためです。
クリストファーシュルツ

-2

編集:この情報はVisualVM専用であり、他のJavaアプリ用ではありません

他の人が述べたように、あなたはvisualvm.confを変更する必要があります

Mac上の最新バージョンのJvisualVM 1.3.6では、インストールディレクトリが変更されています。

現在 /Applications/VisualVM.app/Contents/Resources/visualvm/etc/visualvm.confにあります。

ただし、これはVisualVMをインストールした場所によって異なる場合があります。VisualVMがそれを開始する場所を見つける最も簡単な方法は、次を使用してプロセスを確認することです。

ps -ef | grep VisualVM

次のようなものが表示されます。

... -Dnetbeans.dirs = / Applications / VisualVM.app / Contents / Resources / visualvm / visualvm ...

netbeans.dirプロパティを取得してディレクトリを検索すると、etcフォルダーが見つかります。

visualvm.confのこの行のコメントを外して、パスをjdkに変更します

visualvm_jdkhome="/path/to/jdk"

さらに、visualvmの速度が遅く、メモリが大量にある場合は、使用可能なメモリの量を大幅に増やし、サーバーモードで実行することをお勧めします。

visualvm_default_options="-J-XX:MaxPermSize=96m -J-Xmx2048m -J-Xms2048m -J-server -J-XX:+UseCompressedOops -J-XX:+UseConcMarkSweepGC -J-XX:+UseParNewGC -J-XX:NewRatio=2 -J-Dnetbeans.accept_license_class=com.sun.tools.visualvm.modules.startup.AcceptLicense -J-Dsun.jvmstat.perdata.syncWaitMs=10000 -J-Dsun.java2d.noddraw=true -J-Dsun.java2d.d3d=false"

悪いアドバイス:特定のアプリケーションの起動スクリプトを修正する可能性の高いアプリケーションを中断しますし、 OSのデフォルトのJVMを変更し、元の問題を解決していません。
クリストファーシュルツ

残念ながら、他の人が述べたように、jvisualvmはjvmを選択するための標準的な方法を使用しません。これは、このアプリの唯一のソリューションです。
Celandro 2013

でIが述べているように私の答えあなたが自分自身のバンドルアプリケーション内で何かを変更する必要はありません、アプリからその設定を読み込むことができます~/Library/Application Support/VisualVM/1.3.6/etc/visualvm.conf
Ian Roberts

-2

私も同じような状況で、次のプロセスでうまくいきました。

  1. ターミナルで次のように入力します

    vi ~/.profile
  2. 次に、この行をファイルに追加して保存します

    export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk<version>.jdk/Contents/Home

    ここで、バージョンは1.7.0_25などのコンピュータ上のバージョンです。

  3. エディターを終了し、次のコマンドを入力して有効にします

    source ~/.profile 

次にjava -versionと入力して結果を確認します

    java -version 

.profileとは何ですか?送信元http : //computers.tutsplus.com/tutorials/speed-up-your-terminal-workflow-with-command-aliases-and-profile--mac-30515

.profileファイルは隠しファイルです。これはオプションのファイルで、プロファイルファイルを持っているユーザーがログインしたときに実行するコマンドをシステムに指示します。たとえば、ユーザー名がbrunoで、/ Users / bruno /に.profileファイルがある場合、そのすべてのコンテンツログイン中に実行されます。


LaunchpadからVisualVMを起動する場合、これは機能しません。JAVA_HOME環境変数を設定できるため、コマンドラインからの起動は問題になりません。
クリストファーシュルツ

-2

MacOSは/ usr / libexec / java_homeを使用して現在のJavaバージョンを見つけます。バイパスする1つの方法は、上記の@ void256で説明されているようにplistファイルを変更することです。その他の方法は、java_homeのバックアップを取り、コード
echo $ JAVA_HOME を持つ独自のスクリプトjava_homeに置き換えることです。

次のコマンドを〜/ .bash_profileに追加して、JAVA_HOMEを目的のバージョンのSDKにエクスポートします。export JAVA_HOME = "/ System / Library / Java / JavaVirtualMachines / 1.6.0.jdk / Contents / Home" launchctl setenv JAVA_HOME $ JAVA_HOME ///環境変数をグローバルにする

上記のコマンドを実行するには、コマンドソース〜/ .bash_profileを実行します。

JAVA_HOMEを変更する必要があるときはいつでも、〜/ .bash_profileファイルのJAVA_HOME値をリセットできます。


環境変数に依存するものは機能しません。ポイントは、LaunchPadなどを介して起動されたアプリケーションには、その環境設定がないということです。上記のplistハックは、実際に目的の結果を達成するという点で「最良の」ハックのようです。欠点についてはまだわかりません。同じ問題がある@Tonyからの回答を参照してください。
クリストファーシュルツ2014

-3

デフォルトのJavaバージョン形式1.6 *を1.7 *に変更したかったのです。私は次の手順を試しましたが、うまくいきました:

  • / usr / binの下からリンク「java」を削除しました
  • 新しい場所を指すようにもう一度作成しました。

ln -s /ライブラリ/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/bin/java java

  • 「java -version」で確認済み

Javaバージョン "1.7.0_51"
Java(TM)SEランタイム環境(ビルド1.7.0_51-b13)
Java HotSpot(TM)64ビットサーバーVM(ビルド24.51-b03、混合モード)


質問には答えません。それはの動作には影響しません/usr/libexec/java_home
クリストファーシュルツ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.