(これが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はデフォルトを選択し、ユーザーが 非破壊的に設定 できるかどうかを選択します。
Java_HOME
が最善の方法だと思います。 Java
やjavac
などのコマンドラインツールはその環境変数を尊重します。/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が選択されます。
私もそこに行き、/usr/libexec/Java_home
がどのように機能するかを検索しましたが、使用可能なJava仮想マシンを決定する方法に関する情報を見つけることができませんでした。
私は少し実験をしましたが、単にls /Library/Java/JavaVirtualMachines
を実行し、そこで見つかったすべてのランタイムの./<version>/Contents/Info.plist
を検査するだけだと思います。
次に、Info.plistに含まれるキーJVMVersion
でdescendingをソートし、デフォルトで最初のエントリをデフォルトの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を削除するだけです。
しかしこれまでのところ、これは私のために働いています。
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
袖をまくり上げてもかまわない場合は非常に簡単です... / Library/Java/HomeはJava_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)
実際には非常に簡単です。 JavaVirtualMachinesフォルダにこれがあるとしましょう:
1.8がデフォルトであるとし、新しいフォルダー(たとえば「old」)を追加して、デフォルトのjdkフォルダーをその新しいフォルダーに移動するだけです。もう一度Java -version
を実行して、1.7!
少し遅れましたが、これはMac OSXで進行中の問題です...
私が見つけた最も簡単な解決策は、AppleがインストールするOpenJDKのものを単に削除することでした。 Mac OSXのアップデートが届くたびにインストールされますので、再度削除する必要があります。
Javaを使用してMac上でGoogle App Engine用のアプリを開発する場合、これは非常にうまく機能します。 OpenJDKはうまく機能せず、Mac OSX Yosemiteアップグレードに付属するJavaバージョンでは、すべてのデプロイメントでApp Engine用Eclipseプラグインがクラッシュし、「Read timed out」というエラーが発生します。
「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やその他のものは今すぐ適切なバージョンを選択します。