Понимание Oracle Java на Mac

Я использую Java в OS X в течение многих, многих лет, и недавно, когда Apple перестала включать Java по умолчанию, я позволяю ОС пойти и установить ее для меня (конечно, Apple).

Итак, теперь я использую OS X 10.8, и мне нужно установить Java 7, поэтому я просто получил Oracle Update 15 в форме 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" ), а последний является ссылкой на Apple Java 6 в "/System/Library/Java/JavaVirtualMachines/1.6.0.jdk".

Теперь все это действительно запутывает, но это еще не мой вопрос. Похоже, здесь установлен Java 7:

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

Но здесь также установлен Java 7:

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

Поиск "java" в обоих случаях и печать версии дает ту же версию и сборку (версия java "1.7.0_15" ), однако при хэшировании файлов они отличаются.

Значит ли это, что Oracle установила Java 7 в двух разных местах? Если да, то почему? Что я должен использовать? И почему некоторые вещи все еще указывают на Java 6 (CurrentJDK).

Я смотрел сайт Oracle, но ничего там ничего не очищает.

Ответ 1

Oracle JVM устанавливается только в одном месте. Вы были введены в заблуждение!

Как вы уже отмечали, команды Java в /usr/bin являются символическими ссылками на двоичные файлы в /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands. Бинарные файлы в этом каталоге представляют собой приложения-заглушки, которые определяют, какую виртуальную машину Java использовать *, а затем выполняют соответствующий реальный двоичный файл в этой версии VM. Вот почему все двоичные файлы в /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands почти идентичны по размеру, несмотря на то, что вы ожидаете, что они будут реализовывать совершенно разные функции.

Вы можете увидеть это в действии, используя dtrace:

[email protected]:~$ 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 выдает аргумент пути posix_spawn, когда он вызывается java -version. В моем случае приложение-заглушка обнаружило среду выполнения Apple Java 1.6 в /System/Library/Java/JavaVirtualMachines/1.6.0.jdk и вызывает эту версию команды java.

У двоичных файлов-заглушек также есть другое преимущество: когда они обнаруживают, что Java VM не установлена, они попросят пользователя установить его.

Что касается символической ссылки CurrentJDK, насколько я могу это объяснить ради обратной совместимости с прошлым, когда Apple была единственным источником JVM на OS X.


* При определении того, какая Java VM должна использоваться, учитывается комбинация факторов. JAVA_HOME используется, если установлено (try JAVA_HOME=/tmp java). Если JAVA_HOME не задано, список всех виртуальных машин в системе обнаружен. Переменные среды JAVA_VERSION и JAVA_ARCH используются, если они установлены, для фильтрации списка виртуальных машин на определенную версию и поддерживаемую архитектуру. Получившийся список затем сортируется по архитектуре (предпочитая 64-битную над 32-разрядной версией) и версии (более новый лучше), и возвращается наилучшее совпадение.

Ответ 2

Oracle Java 7 JRE (т.е. тот, который используется плагином веб-браузера для запуска апплетов и Java Web Start) устанавливается в /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home, и именно в этом будут влиять любые автоматические обновления. JDK (тот, который вы загрузили из http://www.oracle.com/technetwork/java/javase/downloads/index.html), установил, создав каталог под /Library/Java/JavaVirtualMachines, и вам решать обновить его самостоятельно, У вас может быть несколько версий JDK, установленных рядом друг с другом, но только одна "открытая" JRE под JavaAppletPlugin.plugin (которая будет соответствовать последней установленной JDK или более поздней версии, если она была автоматически обновлена ​​с тех пор).

Как объясняется bdash, команды под /usr/bin - это заглушки, которые делегируют в зависимости от того, на какой JDK/JRE указывает переменная среды JAVA_HOME, или если она не установлена, то они выберут наиболее подходящую Java для запуска, Вы можете использовать /usr/libexec/java_home, чтобы узнать, какой из них будет выбирать заглушки. Если Java не установлена, заглушки предложит установить последнюю версию Apple Java 6 (насколько я знаю, они не будут предлагать установку Java 7).

Ответ 3

Я нахожу это сообщение: https://developer.apple.com/library/mac/qa/qa1170/_index.html Средство /usr/libexec/java _home динамически находит верхнюю версию Java, указанную в Java Preferences для текущего пользователя.