Понимание 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 для текущего пользователя.