49

私は何年もの間OSXでJavaを使用してきましたが、最近AppleがデフォルトでJavaを含めるのをやめたとき、私はOSを手放してインストールしました(もちろんAppleの種類もあります)。

そのため、現在OS X 10.8を使用しており、Java 7をインストールする必要があるため、OracleのUpdate15をDMG形式で入手してインストーラーを実行しました。/ usr / bin / java(および関連ファイル)を更新して、ここを指すようにしました。

/System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java

これを「/System/Library/Frameworks/JavaVM.framework/Versions」に戻すと、すべてが「Current」または「CurrentJDK」を指します。前者は「A」(これはOracleのJava 7であり、私ができることから)へのリンクです。なぜそれが「A」であるのかわからない)、後者は「/System/Library/Java/JavaVirtualMachines/1.6.0.jdk」にあるAppleのJava6へのリンクです。

さて、これはすべて本当に紛らわしいですが、これはまだ私の質問ではありません。ここにJava7がインストールされているようです。

/System/Library/Frameworks/JavaVM.framework/Versions/A

ただし、ここにはJava7もインストールされています。

/Library/Java/JavaVirtualMachines/jdk1.7.0_15.jdk

両方で「java」を見つけてバージョンを出力すると、同じバージョンとビルド(javaバージョン「1.7.0_15」)が生成されますが、ファイルをハッシュする場合は異なります。

これは、OracleがJava7を2つの異なる場所にインストールしたことを意味しますか?もしそうなら、なぜですか?どちらを使うべきですか?そして、なぜいくつかのことがまだJava 6(CurrentJDK)を指しているのでしょうか。

オラクルのウェブサイトを見ましたが、何もわかりません。

4

3 に答える 3

79

OracleのJVMは1つの場所にのみインストールされます。あなたは誤解されてきました!

お気づきのとおり、のJavaコマンドは、の/usr/binバイナリへのシンボリックリンク/System/Library/Frameworks/JavaVM.framework/Versions/Current/Commandsです。そのディレクトリ内のバイナリは、使用するJava VM *を決定し、そのVMバージョン内の対応する実際のバイナリを実行するスタブアプリケーションです。/System/Library/Frameworks/JavaVM.framework/Versions/Current/Commandsこれが、まったく異なる機能を実装することを期待しているにもかかわらず、内部のすべてのバイナリのサイズがほぼ同じである理由です。

次を使用して、これが実際に動作していることを確認できますdtrace

mrowe@angara:~$ sudo dtrace -n 'syscall::posix_spawn:entry { trace(copyinstr(arg1)); }' -c "/usr/bin/java -version"
dtrace: description 'syscall::posix_spawn:entry ' matched 1 probe
dtrace: pid 44727 has exited
CPU     ID                    FUNCTION:NAME
  8    619                posix_spawn:entry   /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/bin/java

指定された呼び出しは、によって呼び出されたときdtraceのパス引数を出力します。私の場合、スタブアプリケーションはAppleのJava 1.6ランタイムを検出し、そのバージョンのコマンドを呼び出しています。posix_spawnjava -version/System/Library/Java/JavaVirtualMachines/1.6.0.jdkjava

スタブバイナリには別の利点もあります。JavaVMがインストールされていないことを検出すると、ユーザーにJavaVMをインストールするように求めます。

シンボリックリンクに関してはCurrentJDK、AppleがOS X上のJVMの唯一のソースであった過去との下位互換性のために、私ができる限りこれを伝えることができます。


*使用するJavaVMを決定する際には、要素の組み合わせが考慮されます。JAVA_HOME設定されている場合は使用されます(try JAVA_HOME=/tmp java)。が設定されていない場合JAVA_HOME、システム上のすべての仮想マシンのリストが検出されます。および環境変数は、設定されている場合、仮想マシンのリストを特定のバージョンおよびサポートされているアーキテクチャにフィルタリングするために使用されますJAVA_VERSIONJAVA_ARCH結果のリストは、アーキテクチャ(32ビットよりも64ビットを優先)とバージョン(新しい方が良い)でソートされ、最適なものが返されます。

于 2013-02-28T10:40:08.647 に答える
11

Oracle Java 7 JRE(つまり、WebブラウザプラグインがアプレットとJava Web Startを実行するために使用するJRE)は/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home、にインストールされます。これは、自動更新が影響を与えるものです。JDK ( http://www.oracle.com/technetwork/java/javase/downloads/index.htmlからダウンロードしたもの)は、の下にディレクトリを作成してインストールし/Library/Java/JavaVirtualMachinesます。これは自分で更新する必要があります。複数のJDKバージョンを並べてインストールできますが、その下にある「パブリック」JREは1つだけですJavaAppletPlugin.plugin(これは、最新のインストール済みJDKまたはそれ以降に自動更新された場合はそれ以降のバージョンに対応します)。

bdashで説明されているように、下のコマンド/usr/binは、環境変数が指すJDK / JREを委任するスタブですJAVA_HOME。設定されていない場合は、実行するのに最も適切なJavaを選択します。/usr/libexec/java_homeスタブがどれを選択するかを確認するために使用できます。Javaがインストールされていない場合、スタブは最新のApple Java 6のインストールを提案します(私が知る限り、 Java 7のインストールは提供されません)。

于 2013-02-28T11:08:03.293 に答える
5

この投稿を見つけました: https : //developer.apple.com/library/mac/qa/qa1170/_index.html / usr / libexec / java_homeツールは、現在のユーザーのJava設定で指定された最上位のJavaバージョンを動的に検索します。

于 2015-05-18T09:51:02.307 に答える