как установить или изменить версию java (jdk) по умолчанию на os x?

<p>как вы можете изменить версию java по умолчанию на mac?</p>

<p>сначала запустите <code>/usr/libexec/java\_home -v</code>, который выведет что-то вроде следующего:</p><pre><code>matching java virtual machines (3): 1.8.0\_05, x86\_64: "java se 8" /library/java/javavirtualmachines/jdk1.8.0\_05.jdk/contents/home 1.6.0\_65-b14-462, x86\_64: "java se 6" /system/library/java/javavirtualmachines/1.6.0.jdk/contents/home 1.6.0\_65-b14-462, i386: "java se 6" /system/library/java/javavirtualmachines/1.6.0.jdk/contents/home /library/java/javavirtualmachines/jdk1.8.0\_05.jdk/contents/home </code></pre><p>выберите версию, которую вы хотите использовать по умолчанию (<code>1.6.0\_65-b14-462</code> для аргументов), затем:</p><pre><code>export java\_home=`/usr/libexec/java\_home -v 1.6.0\_65-b14-462` </code></pre><p>или вы можете указать только основную версию, например:</p><pre><code>export java\_home=`/usr/libexec/java\_home -v 1.8` </code></pre><p>теперь, когда вы запустите <code>java -version</code>, вы увидите:</p><pre><code>java version "1.6.0\_65" java(tm) se runtime environment (build 1.6.0\_65-b14-462-11m4609) java hotspot(tm) 64-bit server vm (build 20.65-b04-462, mixed mode) </code></pre><p>просто добавьте строку <code>export java\_home…</code> в файл инициализации вашей оболочки.</p>

<p>этот ответ является попыткой ответить на вопрос: как <strong>управлять общесистемной версией java</strong> \_ (не только в текущей версии shell), когда <strong>несколько версий jdk</strong> установлены в целях разработки на <strong>macos el capitan или новее (сьерра, хай сьерра, мохаве)</strong>. насколько я могу судить, ни один из текущих ответов не делает этого (*).</p><p>как разработчик, я использую несколько jdk и хочу легко переключаться с одного на другой. обычно у меня есть последняя стабильная версия для общего пользования и другие для тестов. но я не хочу, чтобы система (например, когда я запускаю свою ide) использовала последнюю версию «раннего доступа», которая у меня есть на данный момент. я хочу контролировать систему по умолчанию, и она должна быть последней стабильной.</p><p>следующий подход работает как минимум с <strong>java 7–12</strong> (ранний доступ на момент написания этой статьи), с <strong>oracle jdk</strong> или <strong>openjdk</strong> (включая <a href="https://blog.adoptopenjdk.net/2018/10/macos-binary-changes">сборки по adoptopenjdk выпущен после середины октября 2018 года</a> ).</p><h3>решение без сторонних инструментов:</h3><ul> <li>оставьте все jdk в их расположении по умолчанию под <code>/library/java/javavirtualmachines</code>. система выберет самую высокую версию по умолчанию. </li> <li><strong>чтобы исключить выбор jdk по умолчанию, переименуйте его <code>contents/info.plist</code> в <code>info.plist.disabled</code></strong>. этот jdk все еще может быть использован, когда <code>$java_home указывает на него, или явно указан в скрипте или конфигурации. он будет просто игнорироваться системной командой java. системный лаунчер будет использовать jdk с самой высокой версией среди тех, которые имеют файл info.plist.при работе в командной оболочке с альтернативным jdk выберите свой метод среди существующих ответов (jenv или пользовательские псевдонимы/сценарии вокруг /usr/libexec/java_home и т.д.).подробности расследования <a href="https://gist.github.com/hogmoru/8e02cf826c840914a8ed93fd418ed88e">в этом гисте .() текущие ответы либо устарели (больше не действительны для macos el capitan или sierra), либо относятся только к одному jdk, либо не затрагивают общесистемный аспект. многие объясняют, как изменить $java\_home</code>, но это влияет только на текущую оболочку и то, что запускается оттуда. это не повлияет на приложение, запущенное из панели запуска ос (если вы не измените нужный файл и выйдите из системы/войдите в систему, что утомительно). то же самое для jenv, это круто и все такое, но, насколько я могу судить, оно просто меняет переменные окружения, поэтому оно имеет то же ограничение.</p>

<p>в дополнение к ответам, приведенным выше, я добавил следующие строки в свой <code>.bash\_profile</code>, что делает его очень удобным для переключения (включая комментарий @ elektromin для java 9):</p><pre><code>alias j12="export java\_home=`/usr/libexec/java\_home -v 12`; java -version" alias j11="export java\_home=`/usr/libexec/java\_home -v 11`; java -version" alias j10="export java\_home=`/usr/libexec/java\_home -v 10`; java -version" alias j9="export java\_home=`/usr/libexec/java\_home -v 9`; java -version" alias j8="export java\_home=`/usr/libexec/java\_home -v 1.8`; java -version" alias j7="export java\_home=`/usr/libexec/java\_home -v 1.7`; java -version" </code></pre><p>после вставки выполните <code>$ source .bash_profileя могу переключиться на java 8, набрав следующее:$ j8 java version "1.8.0\_102" java(tm) se runtime environment (build 1.8.0\_102-b14) java hotspot(tm) 64-bit server vm (build 25.102-b14, mixed mode) </code></pre>

<p>маленькая рыбка на основе/usr/libexec/java\_home</p><pre><code>function jhome set java\_home (/usr/libexec/java\_home $argv) echo "java_home:" $java\_home echo "java -version:" java -version end </code></pre><p>если вы не используете fish, вы можете сделать что-то подобное в bash:</p><pre><code>#!/bin/bash jhome () { export java\_home=`/usr/libexec/java\_home $@ echo "java_home:" $java\_home echo "java -version:" java -version } </code></pre><p>затем, чтобы переключиться между java сделать:</p><pre><code>$> jhome #switches to latest java $> jhome -v 1.7 #switches to java 1.7 $> jhome -v 1.6 #switches to java 1.6 ref: <a href="https://gist.github.com/kenglxn/1843d552dff4d4233271">https://gist.github.com/kenglxn/1843d552dff4d4233271 

использовать jenv - это простой способ.1. установить jenv curl -s get.jenv.io | удар2. конфиг дженв cd ~/.jenv /андидаты / mkdir java cd java mkdir 1.7 mkdir 1.8 3.симлинк путь jdk ln -s /library/java/javavirtualmachines/jdk1.7.0_79.jdk/contents/home/bin ~/.jenv/sources/java/1.7 ln -s /library/java/javavirtualmachines/jdk1.8.0_45.jdk/contents/home/bin ~/.jenv/sources/java/1.8 4.все все готовокоманда переключения: <blockquote> jenv использует java 1.8 </blockquote>установить по умолчанию: <blockquote> jenv по умолчанию java 1.7 </blockquote>

это немного сложно, но попробуйте выполнить шаги, описанные в <a href="https://stackoverflow.com/questions/19533528/installing-java-on-os-x-10-9-mavericks">установка java на os x 10.9 (mavericks) . по сути, вам придется обновить свой псевдоним до java.шаг за шагом:после установки jdk 1.7 вам нужно будет ввести sudo ln -snf, чтобы изменить ссылку на текущую java. для этого откройте терминал и введите команду:sudo ln -nsf /library/java/javavirtualmachines/jdk1.7.0_51.jdk/contents  /system/library/frameworks/javavm.framework/versions/currentjdk обратите внимание, что каталог jdk1.7.0_51.jdk может меняться в зависимости от установленной версии sdk.теперь вам нужно установить java_home, чтобы указать, где был установлен jdk_1.7.0_xx.jdk. снова откройте терминал и введите:export java_home="/library/java/javavirtualmachines/jdk1.7.0_51.jdk/contents/home" вы можете добавить строку export java_home выше в свой файл .bashrc, чтобы java постоянно находилась в вашем терминале

установить jdk, а не только jre/usr/libexec/java_home -v 1.8 дает/library/java/javavirtualmachines/jdk1.8.0_111.jdk/contents/home следующийtouch .bash_profile open -a textedit.app .bash_profile textedit покажет вам пустую страницу, которую вы можете заполнить.добавить в документ: export java_home=/library/java/javavirtualmachines/jdk1.8.0_111.jdk/contents/homeв терминале:export java_home="$(/usr/libexec/java\_home -v 1.8)" </code></pre><p>попробуйте команду:</p><p><code>javac -version</code></p><p>должен вывести:</p><pre><code>javac 1.8.0\_111 </code></pre>

<p>тл; др</p><p>добавьте строку: </p><p><code>export java\_home='/library/java/javavirtualmachines/jdk1.8.0\_144.jdk/contents/home'</code></p><p>в файл</p><p><code>~/.bash\_profile</code></p><p>заменить на загруженную версию.</p><p>затем <code>source ~/.bash\_profile</code></p>

<pre><code>function setjdk() { if [ $# -ne 0 ]; then removefrompath '/system/library/frameworks/javavm.framework/home/bin' if [ -n "${java\_home+x}" ]; then removefrompath $java_home fi export java_home=/usr/libexec/java_home -v $@` export path=$java_home/bin:$path fi } </code></pre><p>поместите это в ваш ~/.profile и используйте его в своем терминале, например, <code>setjdk 1.8</code>, <code>setjdk 1.7</code>, <code>setjdk 9</code> и т. д. и т. д.</p><p>если у вас нет <code>removefrompath</code>, то это: </p><p><code> function removefrompath() { export path=$(echo $path | sed -e -e "s;:$1;;" -e "s;$1:?;;") } </code></p>

<p>используйте jenv, это как менеджер среды java. это супер легко использовать и чистить</p><p>для mac выполните следующие действия:</p><pre><code>brew install jenv git clone https://github.com/gcuisinier/jenv.git ~/.jenv </code></pre><p>установка: если вы используете bash, выполните следующие действия:</p><pre><code>$ echo 'export path="$home/.jenv/bin:$path"' >> ~/.bash_profile echo 'eval "$(jenv init -)"' >> ~/.bash\_profile $ exec $shell -l </code></pre><p>добавьте нужные версии jvm в jenv:</p><pre><code>jenv add /system/library/java/javavirtualmachines/1.6.0.jdk/contents/home </code></pre><p>jenv add /system/library/java/javavirtualmachines/1.8.0.jdk/contents/home</p><p>проверьте установленные версии:</p><pre><code>jenv versions </code></pre><p>установите версию java, которую вы хотите использовать:</p><pre><code>jenv global oracle64-1.6.0 </code></pre>

<p>с официальной страницы apple <a href="https://developer.apple.com/library/mac/documentation/darwin/reference/manpages/man1/java\_home.1.html">java\_home (1)</a> :</p><pre><code>**usage** /usr/libexec/java\_home helps users set a $java_home in their login rc files, or provides a way for command-line java tools to use the most appropriate jvm which can satisfy a minimum version or archi- tecture requirement. the --exec argument can invoke tools in the selected $java\_home/bin directory, which is useful for starting java command-line tools from launchd plists without hardcoding the full path to the java command-line tool. usage for bash-style shells: $ export java_home=/usr/libexec/java_home usage for csh-style shells: % setenv java_home /usr/libexec/java_home 

если вы все еще не можете установить его. используя эту команду.экспорт java_home = /usr/libexec/java_home -v 1.8тогда вы должны использовать это.экспорт java_home = $(/usr/libexec/java\_home -v 1.8)</code></p><p>это обязательно сработает.</p>

<p>сначала выясните, где вы храните переменные среды. </p><ol> <li>emacs </li> <li>bash\_profile </li> <li>файл zshrc</li> </ol><p><strong>шаги для настройки переменной среды: -</strong></p><ol> <li>загрузите jdk с java</li> <li>установить его двойным щелчком</li> <li><p>теперь настройте переменные окружения в вашем файле</p> <p>а. для <strong>emacs.profile</strong> вы можете использовать эту <a href="http://www.sajeconsultants.com/how-to-set-java\_home-on-mac-os-x/">ссылку</a> or, см. скриншот ниже </p></li> </ol><p> <a href="https://i.stack.imgur.com/rfos1.png"> <img src="https://i.stack.imgur.com/rfos1.png" alt="enter image description here"> </a> </p><p><strong>b. для настройки профиля zsh -</strong></p><pre><code>1. export java\_home=/library/java/javavirtualmachines/jdk1.8.0\_112.jdk/contents/home 2. source ~/.zshrc - restart zshrc to reflect the changes. 3. echo $java_home - make sure path is set up properly ----> /library/java/javavirtualmachines/jdk1.8.0_112.jdk/contents/home 4. java -version --> java version "1.8.0_112" java(tm) se runtime environment (build 1.8.0_112-b16)java hotspot(tm) 64-bit server vm (build 25.112-b16, mixed mode) все готово теперь вы можете легко обновить или снизить версию java.

jdk switch scriptя адаптировал ответ от @alex выше и написал следующее, чтобы исправить код для java 9.$ cat ~/.jdk #!/bin/bash #list available jdks alias jdks="/usr/libexec/java\_home -v" # jdk version switching - e.g. `jdk 6` will switch to version 1.6 function jdk() { echo "switching java version $1"; requestedversion=$1 oldstyleversion=8 # set the version if [ $requestedversion -gt $oldstyleversion ]; then export java\_home=$(/usr/libexec/java_home -v $1); else export java\_home=`/usr/libexec/java\_home -v 1.$1; fi echo "setting java_home=$java\_home" which java java -version; } </code></pre><h1>переключиться на java 8</h1><pre><code>$ jdk 8 switching java version 8 setting java_home=/library/java/javavirtualmachines/jdk1.8.0_131.jdk/contents/home /usr/bin/java java version "1.8.0_131" java(tm) se runtime environment (build 1.8.0_131-b11) java hotspot(tm) 64-bit server vm (build 25.131-b11, mixed mode) переключиться на java 9$ jdk 9 switching java version 9 setting java\_home=/library/java/javavirtualmachines/jdk-9.0.1.jdk/contents/home /usr/bin/java java version "9.0.1" java(tm) se runtime environment (build 9.0.1+11) java hotspot(tm) 64-bit server vm (build 9.0.1+11, mixed mode) </code></pre>

<p>если вы используете fish, и вы используете mac, и вы хотите переключаться между jdk, то ниже для меня работает на mac.</p><p>ответ @ kenglxn не сработал для меня, и я понял, что bcos не установил -g, который является глобальным!</p><p>поместите ниже в ~/.config/fish/config.fish</p><pre><code>alias j8="jhome -v 1.8.0\_162" alias j9="jhome -v 9.0.1" function jhome set -g -x java\_home (/usr/libexec/java\_home $argv) echo "java_home:" $java\_home echo "java -version:" java -version end funcsave jhome </code></pre><p>чтобы узнать, какую версию/минорную версию вы установили, вы можете сделать:</p><pre><code>/usr/libexec/java\_home -v 579ms  wed 14 feb 11:44:01 2018 matching java virtual machines (3): 9.0.1, x86\_64: "java se 9.0.1" /library/java/javavirtualmachines/jdk-9.0.1.jdk/contents/home 1.8.0\_162, x86\_64: "java se 8" /library/java/javavirtualmachines/jdk1.8.0\_162.jdk/contents/home 1.8.0\_121, x86\_64: "java se 8" /library/java/javavirtualmachines/jdk1.8.0\_121.jdk/contents/home </code></pre>

<p>на основе ответа @markhellewell я создал несколько псевдонимов, которые сделают это за вас. просто добавьте их в свой загрузочный файл shell</p><pre><code>#list available jdks alias jdks="/usr/libexec/java\_home -v" # jdk version switching - e.g. `jdk 6` will switch to version 1.6 function jdk() { echo "switching java version"; export java\_home=`/usr/libexec/java\_home -v 1.$1; java -version; }  <a href="https://gist.github.com/noyabronok/0a90e1f3c52d1aaa941013d3caa8d0e4">https://gist.github.com/noyabronok/0a90e1f3c52d1aaa941013d3caa8d0e4 

вот как я это делаю на моем<strong> linux </strong>(ubuntu/mint mate), думаю, mac может сделать это аналогичным образом.установить и настроить<strong> шаги: </strong>  <strong> [базовая - часть] </strong> загрузите jdk (<strong> .tgz </strong>file) вручную.  распакуйте и переименуйте правильно, в нужном месте. например, /mnt/star/program/java/jdk-1.8 сделайте программную ссылку, которая будет изменена для переключения версии java позже. например, ln -s /mnt/star/program/java/jdk-1.8 /mnt/star/program/java/java таким образом, /mnt/star/program/java/java - это мягкая ссылка. установите java_home в стартовом скрипте. может использовать файл типа /etc/profile.d/eric.sh или просто использовать ~/.bashrc. например, java_home=/mnt/star/program/java/java затем откройте новый bash shell. java -version должен напечатать версию java. <strong> [еще версия - часть] </strong> при необходимости загрузите и установите больше версий java, как описано выше. например /mnt/star/program/java/jdk-11 <strong> [переключатель - часть] </strong> в ~/.bashrc определите переменную для различных версий java. например _e_java_home_11='/mnt/star/program/java/jdk-11' _e_java_home_8='/mnt/star/program/java/jdk-8' # dir of default version, _e_java_home_d=$\_e\_java\_home\_8</code></li> <li>в <code>~/.bashrc</code> определите команду для переключения версии java.<br> например<br> <code>## switch java version,</code><br> <code>alias jv11="rm $java_home; ln -s $\_e\_java\_home\_11 $java_home" alias jv8="rm $java\_home; ln -s $_e_java_home_8 $java\_home"</code><br> <code># default java version,</code><br> <code>alias jvd="rm $java_home; ln -s $\_e\_java\_home\_d $java_home" alias jv="java -version" в терминале source ~/.bashrc чтобы изменения вступили в силу. затем можно переключиться с помощью определенных команд.  команды - сверху конфиг<strong> команды: </strong>  jv11 переключиться на java 11 jv8 переключиться на java 8 jvd переключиться на версию java по умолчанию, которая обозначена _e_java_home_d, определенной выше. jv показать версию java. <strong> пример вывода: </strong> eric@eric-pc:~$ jv java version "1.8.0\_191" java(tm) se runtime environment (build 1.8.0\_191-b12) java hotspot(tm) 64-bit server vm (build 25.191-b12, mixed mode) eric@eric-pc:~$ jv11 eric@eric-pc:~$ jv java version "11.0.1" 2018-10-16 lts java(tm) se runtime environment 18.9 (build 11.0.1+13-lts) java hotspot(tm) 64-bit server vm 18.9 (build 11.0.1+13-lts, mixed mode) eric@eric-pc:~$ jvd eric@eric-pc:~$ jv java version "1.8.0\_191" java(tm) se runtime environment (build 1.8.0\_191-b12) java hotspot(tm) 64-bit server vm (build 25.191-b12, mixed mode) eric@eric-pc:~$ механизм он переключается путем изменения программной ссылки, которая используется как java_home. подсказки на моей машине, когда я устанавливаю jdk вручную, я сохраняю минорную версию, затем делаю мягкую ссылку с основной версией, но без минорной версии. например // это фактический каталог, jdk1.8.0_191  // это мягкая ссылка на jdk1.8.0_191 jdk-8  // это мягкая ссылка на jdk-8 или jdk-11 java  я определяю псевдоним команды в ~/.bashrc, но определяю переменную в отдельном файле. я использую ~/.eric_var для определения переменных, и ~/.bashrc будет его источником (например, source $home/.eric\_var</code>).</p></li> </ul>

<p>добавить следующую команду в файл <code>~/.zshenv</code></p><pre><code>export java\_home=`/usr/libexec/java\_home -v 1.8` </code></pre>

<p>если у вас есть несколько версий, и вы хотите что-то запустить с использованием определенной версии, используйте этот пример:</p><pre><code>/usr/libexec/java\_home -v 1.7.0\_75 --exec java -jar you-file.jar </code></pre>

<p>простой способ включить отдельно установленный jdk в список, заданный <code>/usr/libexec/java\_home -v</code>, - создать символическую ссылку на каталог следующим образом:</p><pre><code>sudo ln -s path/to/jdk /library/java/javavirtualmachines/jdk-[some-identifier].jdk </code></pre><p>например, чтобы зарегистрировать jdk, включенный в android studio (1.8.0\_152 на момент написания), используйте:</p><pre><code>sudo ln -s /applications/android\ studio.app/contents/jre/jdk /library/java/javavirtualmachines/jdk-android-studio.jdk </code></pre><p>теперь <code>java\_home</code> выведет jdk в список <code>matching java virtual machines</code>, и вы можете выбрать его, как описано выше.</p>

<p>этот инструмент сделает работу за вас: </p><p> <a href="http://www.guigarage.com/2013/02/change-java-version-on-mac-os/">http://www.guigarage.com/2013/02/change-java-version-on-mac-os/</a> </p><p>это простой javaone, который можно использовать для определения текущей версии java. версия может использоваться в командной консоли, которая открывается после выбора версии в инструменте.</p>