Как я могу изменить 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, смешанный режим)