122

(これが 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 が実行されます。これはシンリンクなどの問題ではありません。

同様の質問への回答

この回答は、Java のバージョンが java_home によって取得されないようにするハックに相当するものを提供しますが、 java_home がデフォルトをどのように選択するか、およびユーザーが非破壊的に設定できるかどうかというこの質問にはまだ答えていません。

4

12 に答える 12

56

私もそこに行って、どのように機能するかを検索しましたが/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 をアンインストールするだけです。

しかし、これまでのところ、これは私にとってはうまくいきました。

于 2014-01-08T11:54:49.737 に答える
10

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

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

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

于 2014-02-08T09:09:07.093 に答える
3

Java 7の Oracle のアンインストール手順がうまくいきました。

抜粋:

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

于 2013-11-07T03:31:07.573 に答える
3

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

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

Java を使用して Mac で Google App Engine 用のアプリを開発する場合、これは非常にうまく機能します。OpenJDK はうまく機能せず、Mac OSX Yosemite のアップグレードに付属する Java バージョンでは、App Engine 用の Eclipse プラグインがデプロイごとにクラッシュし、「読み取りがタイムアウトしました」という役立つエラーが表示されます。

于 2014-11-12T19:46:15.447 に答える
-1

編集:この情報は特に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"
于 2013-11-19T19:43:46.390 に答える
-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 /// 環境変数をグローバルにする

コマンド source ~/.bash_profile を実行して、上記のコマンドを実行します。

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

于 2014-07-29T11:35:18.870 に答える
-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 ファイルがある場合、そのすべての内容ログイン手続き時に実行されます。

于 2014-02-11T06:52:12.060 に答える