(Не был уверен, должно ли это происходить в 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, которые я установил.)
Обновление :
JVM Oracle живут в /Library/Java/JavaVirtualMachines
. Переименование каталога JDK 1.8 на jdk1.8.0.jvm.xyz
ничего не меняет: он по- java_home
прежнему находится в нужном месте, а при запуске / usr / bin / java по-прежнему выполняется JVM 1.8. Это не проблема с синлинками и т. Д.
Ответы на похожие вопросы
Хотя этот ответ предлагает то, что составляет взлом, который удалит версии Java из подбора java_home, он все еще не отвечает на этот вопрос о том, как java_home выбирает свое значение по умолчанию и могут ли пользователи установить его неразрушающим образом .
/usr/bin/java
это просто символическая ссылка/usr/bin/java
указывает на/System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java
.Versions
Каталог не содержит символьную ссылку на 1.8.0 JDK. Вместо этого, он содержит каталог услужливо под названием ,A
котороеCurrent
указывает.A
не является "JAVA_HOME. У него есть подкаталог,Commands
который называется, в котором естьjava
команда, но это непрозрачный универсальный двоичный файл, который делает неизвестно что. Я подозреваю, что он используетjava_home
и т. д., чтобы решить, какую JVM использовать.Ответы:
Я думаю,
JAVA_HOME
это лучшее, что ты можешь сделать. Инструменты командной строки, такие какjava
иjavac
будут учитывать эту переменную среды, вы можете использовать,/usr/libexec/java_home -v '1.7*'
чтобы дать вам подходящее значение для вводаJAVA_HOME
, чтобы инструменты командной строки использовали Java 7.Но стандартные пакеты приложений с двойным щелчком вообще не используют установленные под ними JDK
/Library/Java
. Пакеты старого стиля,.app
использующие Apple,JavaApplicationStub
будут использовать Apple Java 6 от/System/Library/Frameworks
, а пакеты нового стиля, созданные с помощью AppBundler без встроенной JRE, будут использовать "общедоступную" JRE in/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home
- это жестко запрограммировано в заглушке и не может быть изменено, и нельзя одновременно установить две разные общедоступные JRE.Изменить: я специально изучил VisualVM, предполагая, что вы используете версию «пакета приложений» со страницы загрузки , и это конкретное приложение не является приложением AppBundler, вместо этого его основной исполняемый файл представляет собой сценарий оболочки, который вызывает номер других сценариев оболочки и читает различные файлы конфигурации. По умолчанию
/Library/Java
он выбирает самый новый JDK, если это 7u10 или новее, или использует Java 6, если ваша установка Java 7 - это обновление 9 или более ранней версии. Но, разгадывая логику в сценариях оболочки, мне кажется, что вы можете указать конкретный JDK с помощью файла конфигурации.Создайте текстовый файл
~/Library/Application Support/VisualVM/1.3.6/etc/visualvm.conf
(замените 1.3.6 любой версией VisualVM, которую вы используете), содержащий строкуи это заставит его выбрать Java 7 вместо 8.
источник
JAVA_HOME
путь, и в целом лучше всего указать младшую версию, которая вам нужна в других случаях. Основываясь на разборке, оказывается, что вы можетеexport JAVA_VERSION=1.7
поjava_home
умолчанию показывать JKD7 вместо JDK8, но это не работает,java_home -v 1.6
потому чтоjava-home
интерпретирует его как дополнительное ограничение и отказывается из-за взаимно невыполнимых ограничений, а затем просто идет с 1,8 по умолчанию даже с--failfast
опцией.Я тоже был там и везде искал, как
/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
.Что-то вроде:
а затем он волшебным образом исчезает из верхней части списка:
Теперь вам нужно будет выйти / войти в систему, а затем:
:-)
Конечно, я понятия не имею, сломается ли что-то еще или версия java 1.8.0-ea по-прежнему работает правильно.
Вероятно, вам не следует делать ничего из этого, а просто удалить 1.8.0.
Однако до сих пор это работало для меня.
источник
/usr/libexec/java_home -v 1.7
. Думаю, я сделаю то же самое для JAVA_HOME .../usr/bin/java
будет найдена самая новая версия JDK, которая будет использоваться для всех связанных с Java инструментов командной строки в/usr/bin
.На самом деле это довольно просто. Допустим, у нас есть это в нашей папке JavaVirtualMachines:
Представьте, что по умолчанию используется версия 1.8, затем мы просто добавляем новую папку (например, «старую») и перемещаем папку jdk по умолчанию в эту новую папку. Сделайте еще
java -version
раз и вуаля, 1.7!источник
Это довольно просто, если вы не против закатать рукава ... / Library / Java / Home - это значение по умолчанию для JAVA_HOME, и это просто ссылка, указывающая на одно из:
Поэтому я хотел изменить свою версию JVM / JDK по умолчанию, не изменяя содержимое JAVA_HOME ... / Library / Java / Home - стандартное расположение для текущей JVM / JDK, и это то, что я хотел сохранить ... мне кажется быть самым простым способом изменить ситуацию с наименьшими побочными эффектами.
На самом деле это действительно просто. Чтобы изменить версию java, которую вы видите с помощью java -version, все, что вам нужно сделать, это какая-то ее версия:
Я не нашел времени, но очень простой сценарий оболочки, который использует / usr / libexec / java_home и ln для повторения указанной выше символической ссылки, должен быть глупо простым в создании ...
После того, как вы изменили расположение / Library / Java / Home ... вы получите правильный результат:
источник
/Library/Java/Home
это действительно символическая ссылка, но она указывает на то,/System/Library/Frameworks/JavaVM.framework/Home
что само находится в большом беспорядке символических ссылок, что, наконец, приводит вас к ... волшебной команде, которая определяет правильную JRE для запуска. Обратите внимание, что это/usr/libexec/java_home
также относится к этой магии. Итак, вы можете прервать все, просто заменив символические ссылки и указав на одну JRE, но вам придется обновлять ее каждый раз. Очевидно, нет команды вродеset_preferred_jvm_version
или чего-то подобного.JAVA_HOME
где-либо. Я поиграю с этой техникой, чтобы увидеть, приведет ли она к запуску программ на основе Java с «предпочтительной» виртуальной машиной Java. Я подозреваю, что будет, но он довольно хрупкий..bash_profile
:export JAVA_HOME=`/usr/libexec/java_home -v 12`
У меня сработали инструкции Oracle по удалению Java 7 .
Выдержка:
источник
Немного поздно, но поскольку это постоянная проблема с Mac OSX ...
Самым простым решением, которое я нашел, было просто удалить файлы OpenJDK, которые устанавливает Apple. Каждый раз, когда приходит обновление Mac OSX, оно устанавливается, и вам нужно будет удалить его снова.
Это действительно хорошо работает, если вы разрабатываете приложения для Google App Engine на своем Mac с использованием Java. OpenJDK не работает должным образом, а версия Java, поставляемая с обновлением Mac OSX Yosemite, вызывает сбой подключаемого модуля Eclipse для App Engine при каждом развертывании с полезной ошибкой: «Истекло время чтения».
источник
Я безуспешно тестировал jenv и другие вещи, например установку JAVA_HOME. Теперь я и нашел следующее решение
(добавлен в ~ / .bashrc или ~ / .bash.profile или ~ / .zshrc)
И так зовут:
java_home обработает неправильный ввод. так что вы не можете сделать что-то не так. Maven и другие сотрудники сейчас подберут нужную версию.
источник
Я на самом деле немного посмотрел на это в дизассемблере, так как исходный код недоступен.
В / usr / bin / java и / usr / libexec / java_home используется JavaLaunching.framework. Переменная среды JAVA_HOME действительно сначала проверяется / usr / bin / java и друзьями (но не / usr / libexec / java_home). Фреймворк использует переменные среды JAVA_VERSION и JAVA_ARCH для фильтрации доступных JVM. Итак, по умолчанию:
Но установка, скажем, JAVA_VERSION может переопределить значение по умолчанию:
Вы также можете установить 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 , если вам нужно, чтобы они были установлены на уровне сеанса.
источник
.profile
бесполезно для моего варианта использования (запуск приложения, например, с панели запуска), но подсказкаlaunchd
хорошая. Мне придется попробовать, поскольку недавнее безумие Java по управлению версиями означает, что у меня одновременно установлено несколько поколений Java с разным уровнем (личного) доверия.Изменить: эта информация предназначена специально для 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 = / Applications / VisualVM.app / Contents / Resources / visualvm / visualvm ...
Вы хотите взять свойство netbeans.dir и найти каталог, и вы найдете папку etc.
Раскомментируйте эту строку в visualvm.conf и измените путь к jdk
Кроме того, если у вас медленная работа с вашим visualvm и у вас много памяти, я бы предложил значительно увеличить объем доступной памяти и запустить его в режиме сервера:
источник
~/Library/Application Support/VisualVM/1.3.6/etc/visualvm.conf
.У меня была похожая ситуация, и у меня сработал следующий процесс:
В терминале введите
Затем добавьте эту строку в файл и сохраните
где версия - это версия на вашем компьютере, например 1.7.0_25
Выйдите из редактора, затем введите следующую команду, чтобы она вступила в силу
Затем введите java -version, чтобы проверить результат
Что такое .profile? Источник: http://computers.tutsplus.com/tutorials/speed-up-your-terminal-workflow-with-command-aliases-and-profile--mac-30515
источник
MacOS использует / usr / libexec / java_home для поиска текущей версии Java. Один из способов обойти - изменить файл plist, как описано выше в @ void256. Другой способ - сделать резервную копию java_home и заменить ее своим собственным скриптом java_home с кодом
echo $ JAVA_HOME
Теперь экспортируйте JAVA_HOME в нужную версию SDK, добавив следующие команды в ~ / .bash_profile. export JAVA_HOME = "/ System / Library / Java / JavaVirtualMachines / 1.6.0.jdk / Contents / Home" launchctl setenv JAVA_HOME $ JAVA_HOME /// Сделайте переменную среды глобальной
Запустите источник команды ~ / .bash_profile для выполнения вышеуказанных команд.
Каждый раз, когда нужно изменить JAVA_HOME, он может сбросить значение JAVA_HOME в файле ~ / .bash_profile.
источник
Я хотел изменить версию Java по умолчанию с 1.6 * на 1.7 *. Я попробовал следующие шаги, и у меня это сработало:
ln -s /Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/bin/java java
java версия "1.7.0_51"
Java (TM) SE Runtime Environment (сборка 1.7.0_51-b13
) 64-разрядная серверная виртуальная машина Java HotSpot (TM) (сборка 24.51-b03, смешанный режим)
источник
/usr/libexec/java_home
.