Как я могу изменить Java VM по умолчанию Mac OS, возвращенную из /usr/libexec/java_home
(Не был уверен, стоит ли это делать с SU... миграция, безусловно, вариант, но больше программистов читают вопросы здесь, так что здесь).
Я использую Mac OS X 10.8.4, и у меня установлен Apple JDK 1.6.0_51, а также Oracle JDK 1.7.0_25. Недавно я установил Oracle 1.8 Preview 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.)
Обновление:
Oracle JVM живут в /Library/Java/JavaVirtualMachines
, Переименование каталога JDK 1.8 в jdk1.8.0.jvm.xyz
ничего не меняет java_home
по-прежнему находит его в нужном месте, а запуск /usr/bin/java по-прежнему выполняет 1.8 JVM. Это не проблема с ссылками и т. Д.
16 ответов
Я думаю JAVA_HOME
это лучшее, что вы можете сделать. Инструменты командной строки, такие как java
а также javac
будет уважать эту переменную среды, вы можете использовать /usr/libexec/java_home -v '1.7*'
чтобы дать вам подходящее значение, чтобы положить в JAVA_HOME
чтобы сделать инструменты командной строки, используйте Java 7.
export JAVA_HOME="`/usr/libexec/java_home -v '1.7*'`"
Но стандартные пакеты приложений с двойным кликом не используют JDK, установленные под /Library/Java
совсем. Старый стиль .app
связки с использованием Apple JavaApplicationStub
будет использовать Apple Java 6 из /System/Library/Frameworks
и в новых стилях, созданных с помощью AppBundler без JRE в комплекте, будет использоваться "публичный" JRE в /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home
- это жестко запрограммировано в коде заглушки и не может быть изменено, и вы не можете установить две разные публичные JRE одновременно.
Редактировать: я специально посмотрел на VisualVM, предполагая, что вы используете версию "комплекта приложений" со страницы загрузки, и это конкретное приложение не является приложением AppBundler, вместо этого его основной исполняемый файл представляет собой сценарий оболочки, который вызывает число других сценариев оболочки и читает различные файлы конфигурации. По умолчанию выбирается новейший JDK из /Library/Java
до тех пор, пока это 7u10 или более поздняя версия, или использует Java 6, если ваша версия Java 7 имеет обновление 9 или более раннюю версию. Но при раскрытии логики в сценариях оболочки мне кажется, что вы можете указать конкретный JDK с помощью файла конфигурации.
Создать текстовый файл ~/Library/Application Support/VisualVM/1.3.6/etc/visualvm.conf
(замените 1.3.6 любой версией VisualVM, которую вы используете), содержащей строку
visualvm_jdkhome="`/usr/libexec/java_home -v '1.7*'`"
и это заставит его выбрать Java 7 вместо 8.
Я был там и искал везде, как /usr/libexec/java_home
работает, но я не смог найти никакой информации о том, как он определяет доступные виртуальные машины Java, которые он перечисляет.
Я немного поэкспериментировал, и я думаю, что это просто выполняет ls /Library/Java/JavaVirtualMachines
а затем осматривает ./<version>/Contents/Info.plist
из всех сред выполнения он находит там.
Затем сортирует их по убыванию по ключу JVMVersion
содержится в Info.plist и по умолчанию он использует первую запись в качестве 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.
Однако пока это сработало для меня.
На самом деле я немного посмотрел на это в дизассемблере, так как исходный код недоступен.
В /usr/bin/java и /usr/libexec/java_home используется JavaLaunching.framework. Переменная среды JAVA_HOME действительно сначала проверяется /usr/bin/java и друзьями (но не /usr/libexec/java_home). Фреймворк использует переменные среды JAVA_VERSION и JAVA_ARCH для фильтрации доступных JVM. Итак, по умолчанию:
$ /usr/libexec/java_home -V
Matching Java Virtual Machines (2):
11.0.5, x86_64: "Amazon Corretto 11" /Library/Java/JavaVirtualMachines/amazon-corretto-11.jdk/Contents/Home
1.8.0_232, x86_64: "Amazon Corretto 8" /Library/Java/JavaVirtualMachines/amazon-corretto-8.jdk/Contents/Home
/Library/Java/JavaVirtualMachines/amazon-corretto-11.jdk/Contents/Home
Но установка, скажем, JAVA_VERSION может переопределить значение по умолчанию:
$ JAVA_VERSION=1.8 /usr/libexec/java_home
/Library/Java/JavaVirtualMachines/amazon-corretto-8.jdk/Contents/Home
Вы также можете установить JAVA_LAUNCHER_VERBOSE=1, чтобы увидеть некоторые дополнительные журналы отладки, касающиеся путей поиска, найденных JVM и т. Д., С обоими /usr/bin/java и /usr/libexec/java_home.
В прошлом JavaLaunching.framework фактически использовал систему предпочтений (в домене com.apple.java.JavaPreferences) для установки предпочтительного порядка JVM, позволяя установить JVM по умолчанию с помощью PlistBuddy, но насколько я могу судить, это код был удален в последних версиях macOS. Переменные среды кажутся единственным выходом (помимо редактирования Info.plist в самих пакетах JDK).
Установка переменных среды по умолчанию, конечно, может быть выполнена через ваш.profile или через launchd, если вам нужно, чтобы они были установлены на уровне сеанса.
Это на самом деле довольно легко. Допустим, у нас есть это в нашей папке JavaVirtualMachines:
- jdk1.7.0_51.jdk
- jdk1.8.0.jdk
Представьте, что 1.8 является нашим значением по умолчанию, тогда мы просто добавляем новую папку (например, "старая") и перемещаем папку jdk по умолчанию в эту новую папку. Делать java -version
опять эт вуаля, 1,7!
Я проверил "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 и другие вещи теперь подберут правильную версию.
Это довольно просто, если вы не против закатать рукава... / Library / Java / Home по умолчанию для JAVA_HOME, и это просто ссылка, которая указывает на одно из:
- /System/Library/Java/JavaVirtualMachines/1.?.?.jdk/Contents/Home
- /Library/Java/JavaVirtualMachines/jdk1.?.?_??.jdk/Contents/Home
Поэтому я хотел изменить версию JVM/JDK по умолчанию без изменения содержимого JAVA_HOME... /Library/Java/Home - это стандартное расположение для текущей JVM/JDK, и это то, что я хотел сохранить... мне кажется, быть самым простым способом изменить вещи с наименьшим количеством побочных эффектов.
Это на самом деле очень просто. Чтобы изменить версию java, которую вы видите с помощью java -version, все, что вам нужно сделать, это некоторая версия этого:
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)
Немного поздно, но так как это постоянная проблема с Mac OSX...
Самым простым решением, которое я нашел, было простое удаление материалов OpenJDK, которые устанавливает Apple. Каждый раз, когда приходит обновление Mac OSX, оно устанавливается, и вам нужно будет удалить его снова.
Это работает очень хорошо, если вы разрабатываете приложения для Google App Engine на своем Mac с использованием Java. OpenJDK не работает должным образом, и версия Java, которая поставляется с обновлением Mac OSX Yosemite, приведет к сбою подключаемого модуля Eclipse для App Engine при каждом развертывании с полезной ошибкой: "Тайм-аут чтения".
Oracle's uninstallation instructions for Java 7 worked for me.
Выдержка:
Удаление JDK Чтобы удалить JDK, у вас должны быть права администратора и выполнить команду удаления от имени пользователя root или с помощью инструмента sudo(8).
Перейдите в /Library/Java/JavaVirtualMachines и удалите каталог, имя которого соответствует следующему формату:*
/Library/Java/JavaVirtualMachines/jdk<major>.<minor>.<macro[_update]>.jdk
Например, чтобы удалить 7u6:
% rm -rf jdk1.7.0_06.jdk
Можно очень легко добавить в java_home.
Способ установки JAVA_HOME в MacOS выглядит следующим образом. Добавьте, например, следующее в ваш файл ~/.zshrc. Сценарий подберет последнюю версию JDK, установленную в вашей системе.
JAVA_HOME=$(/usr/libexec/java_home)
Когда сценарий java_home запускается с ключом -V, в нем отображаются установленные в данный момент JDK. Мой MacOS (Монтерей) по умолчанию Java Home (JAVA_HOME) был таким.
/usr/libexec/java_home -V (Command to list installed JDK versions)
1.8.0_292 (x86_64) "AdoptOpenJDK" - "AdoptOpenJDK 8" /Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home
Загрузите версию JavaOpenJDK отсюда . Обязательно загрузите пакет JDK .dmg . У него есть установщик, который обновляет JAVA_HOME . После установки v18.0 мое изменилось на следующее.
/usr/libexec/java_home -V
Matching Java Virtual Machines (2):
18 (x86_64) "Azul Systems, Inc." - "Zulu 18.28.13" /Library/Java/JavaVirtualMachines/zulu-18.jdk/Contents/Home
1.8.0_292 (x86_64) "AdoptOpenJDK" - "AdoptOpenJDK 8" /Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home
Теперь он выбирает верхний элемент, т.е. версию 18. Если верхний элемент по умолчанию не является предпочтительным, измените имена так, чтобы тот, который вы хотите, был первым в списке, как описано выше void256. Ключ сортировки здесь.
/Library/Java/JavaVirtualMachines/*/Contents/Info.plist.
Теперь все инструменты могут использовать jdk из JAVA_HOME.
MacOS использует /usr/libexec/java_home для поиска текущей версии Java. Один из способов обойти это изменить plist-файл, как описано выше в @void256. Другой способ - взять резервную копию java_home и заменить ее собственным скриптом java_home, имеющим код
echo $JAVA_HOME
Теперь экспортируйте JAVA_HOME в нужную версию SDK, добавив следующие команды в файл ~/.bash_profile. export JAVA_HOME="/ Система / Библиотека /Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home" launchctl setenv JAVA_HOME $JAVA_HOME /// Сделать глобальную переменную среды
Запустите источник команды ~ /.bash_profile, чтобы запустить приведенные выше команды.
В любое время, когда нужно изменить JAVA_HOME, он может сбросить значение JAVA_HOME в файле ~ /.bash_profile.
К сути вопроса: я бы сделал это
экспорт JAVA_HOME=$(/usr/libexec/java_home -- v xyz)
где xyz — номер версии jdk.
Изменить: эта информация предназначена для VisualVM, а не для любого другого Java-приложения
Как уже упоминалось, вам нужно изменить visualvm.conf
В последней версии JvisualVM 1.3.6 для Mac каталоги установки изменены.
В настоящее время он находится в/Applications/VisualVM.app/Contents/Resources/visualvm/etc/visualvm.conf.
Однако это может зависеть от того, где вы установили VisualVM. Самый простой способ узнать, где ваш VisualVM - запустить его, а затем посмотреть на процесс, используя:
ps -ef | grep VisualVM
Вы увидите что-то вроде:
... -Dnetbeans.dirs = / Приложения / VisualVM.app / Содержание / Ресурсы / 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"
Упрощать нужно :-)
Шаги к изменениям --
Найдите установленную версию на вашем компьютере, выполнив следующую команду
/usr/libexec/java_home -V
то вы можете увидеть, как показано ниже, если установлено несколько версий JDK
11.0.16 (arm64) "Homebrew" - "OpenJDK 11.0.16" /opt/homebrew/Cellar/blabla
1.8.0_292 (x86_64) "AdoptOpenJDK" - "AdoptOpenJDK 8" /Library/Java/JavaVirtualMachines/bala
Создайте файл Env на основе вашей машины, для Mac, как показано ниже, создайте или отредактируйте файл среды вашей системы либо .zshenv, .zshprofile и т. д.
nano ~/.zshenv
export JAVA_HOME=$(/usr/libexec/java_home -v 1.8.0_292)
Затем волшебство сделано, где бы эта символическая ссылка ни использовала все те java, которые ссылаются на версию, которую вы установили! Удачного кодирования Мальчики и девочки.
команда /usr/libexec/java_home может искать новую версию Java. яйцо. JD_GUI.приложение. в этом приложении. я не могу работать. поэтому я нахожу скрипт в /Applications/JD-GUI.app/Contents/MacOS/universalJavaApplicationStub.sh для поиска JAVA_HOME, я просто получаю прямой путь. тогда работоспособен. введите сюда описание изображения
введите сюда описание изображения и посмотрите так. введите описание изображения здесь, просто весело
У меня была похожая ситуация, и у меня работал следующий процесс:
В терминале введите
vi ~/.profile
Затем добавьте эту строку в файл и сохраните
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk<version>.jdk/Contents/Home
где версия на вашем компьютере, например 1.7.0_25
Выйдите из редактора, затем введите следующую команду, чтобы он вступил в силу
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, то все его содержимое будет выполнен во время процедуры входа в систему.
Я хотел изменить стандартную версию Java версии 1.6* на 1.7*. Я попробовал следующие шаги, и это сработало для меня:
- Удалена ссылка "java" из / usr / bin
- Создал его снова, указывая на новое местоположение:
ln -s /Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/bin/java java
- проверено с помощью "Java-версии"
Java-версия "1.7.0_51"
Java (TM) SE Runtime Environment (сборка 1.7.0_51-b13)
Java HotSpot (TM) 64-разрядная серверная виртуальная машина (сборка 24.51-b03, смешанный режим)