Как я могу изменить Mac OS по умолчанию Java VM, возвращенную из/usr/libexec/java_home
(Не был уверен, стоит ли это делать с SU... миграция, безусловно, вариант, но больше программистов читают вопросы здесь, так что здесь).
Я использую Mac OS X 10.8.4, и у меня установлена Apple JDK 1.6.0_51 и Oracle JDK 1.7.0_25. Я недавно установил JDK предварительного просмотра Oracle 1.8 для некоторой предварительной версии программного обеспечения, которое требует этого. Теперь, когда я запускаю /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
. jdk1.8.0.jvm.xyz
каталога JDK 1.8 в jdk1.8.0.jvm.xyz
ничего не меняет: java_home
прежнему находит его в нужном месте, а запуск /usr/bin/java по-прежнему выполняет 1.8 JVM. Это не проблема с ссылками и т.д.
Ответы на похожие вопросы
Хотя этот ответ предлагает то, что составляет хак, который удалит версии Java от выбора java_home, он по-прежнему не отвечает на вопрос о том, как java_home выбирает значение по умолчанию и могут ли пользователи устанавливать его неразрушающим образом.
Ответы
Ответ 1
Я думаю, что 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 специально, предполагая, что вы используете версию "application bundle" из страницы загрузки, и это конкретное приложение не является приложением AppBundler, вместо этого его основным исполняемым файлом является оболочка script, которая вызывает ряд других сценариев оболочки и считывает различные файлы конфигурации. По умолчанию он выбирает новый 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.
Ответ 2
Я тоже был там и искал везде, где работает /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.
Однако пока это сработало для меня.
Ответ 3
Инструкции по удалению Oracle для Java 7 помогли мне.
Выдержка:
Удаление 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
Ответ 4
На самом деле это довольно легко.
Скажем, мы имеем это в нашей папке JavaVirtualMachines:
- jdk1.7.0_51.jdk
- jdk1.8.0.jdk
Представьте, что 1.8 является нашим по умолчанию, мы просто добавляем новую папку (например, "old" ) и переместите папку jdk по умолчанию в эту новую папку.
Сделайте java -version
снова et voila, 1.7!
Ответ 5
Это довольно просто, если вы не против разматывать рукава... /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
Я не нашел времени, но очень простая оболочка script, которая использует /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)
Ответ 6
Немного поздно, но поскольку это проблема с Mac OSX...
Самое простое решение, которое я нашел, это просто удалить материал OpenJDK, который Apple устанавливает. Каждый раз, когда приходит обновление Mac OSX, он устанавливается, и вам нужно будет удалить его снова.
Это работает очень хорошо, если вы разрабатываете приложения для Google App Engine на своем Mac с помощью Java. OpenJDK не работает, а версия Java, которая поставляется с обновлением Mac OSX Yosemite, заставит подключаемый модуль Eclipse для аварийного восстановления App Engine при каждом развертывании с полезной ошибкой: "Прочитайте приурочен".
Ответ 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 и другие вещи теперь подберут правильную версию.
Ответ 8
MacOS использует /usr/libexec/java _home, чтобы найти текущую версию Java. Один из способов обойти - изменить файл plist, как описано в @void256 выше.
Другие способы - сделать резервную копию java_home и заменить ее на свой собственный script java_home, имеющий код
echo $JAVA_HOME
Теперь экспортируйте JAVA_HOME в нужную версию SDK, добавив следующие команды в файл ~/.bash_profile. экспорт JAVA_HOME = "/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Содержание/Главная" launchctl setenv JAVA_HOME $JAVA_HOME///Сделать переменную окружения глобальной
Запустите источник команды ~/.bash_profile для запуска указанных команд.
В любое время, когда нужно изменить JAVA_HOME, он может reset значение JAVA_HOME в файле ~/.bash_profile.
Ответ 9
Изменить: эта информация предназначена для 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"
Ответ 10
У меня была аналогичная ситуация, и для меня работал следующий процесс:
-
В терминале введите
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 файл, все его содержимое будет выполняться во время процедуры входа в систему.
Ответ 11
Я хотел изменить версию java версии по умолчанию 1.6 * до 1.7 *. Я пробовал следующие шаги, и это сработало для меня:
- Удалена ссылка "java" из /usr/bin
- Создал его снова, указав на новое местоположение:
ln -s/Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/bin/java java
- проверено с помощью "java -version"
версия java "1.7.0_51"
Java (TM) SE Runtime Environment (сборка 1.7.0_51-b13)
Java HotSpot (TM) 64-разрядная серверная VM (сборка 24.51-b03, смешанный режим)