it-swarm.com.ru

Как установить или изменить версию Java (JDK) по умолчанию на OS X?

Как вы можете изменить версию Java по умолчанию на Mac?

470
Venkat

Сначала запустите /usr/libexec/Java_home -V, который выведет что-то вроде следующего:

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

Выберите версию, которую вы хотите использовать по умолчанию (1.6.0_65-b14-462 для аргументов), затем:

export Java_HOME=`/usr/libexec/Java_home -v 1.6.0_65-b14-462`

или вы можете указать только основную версию, например:

export Java_HOME=`/usr/libexec/Java_home -v 1.8`

Теперь, когда вы запустите Java -version, вы увидите:

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)

Просто добавьте строку export Java_HOME… в файл инициализации вашей оболочки.

854
markhellewell

Этот ответ является попыткой ответить на вопрос: как управлять общесистемной версией Java _ (не только в текущей версии Shell), когда несколько версий JDK установлены в целях разработки на macOS El Capitan или новее (Сьерра, Хай Сьерра, Мохаве). Насколько я могу судить, ни один из текущих ответов не делает этого (*).

Как разработчик, я использую несколько JDK и хочу легко переключаться с одного на другой. Обычно у меня есть последняя стабильная версия для общего пользования и другие для тестов. Но я не хочу, чтобы система (например, когда я запускаю свою IDE) использовала последнюю версию «раннего доступа», которая у меня есть на данный момент. Я хочу контролировать систему по умолчанию, и она должна быть последней стабильной.

Следующий подход работает как минимум с Java 7–12 (ранний доступ на момент написания этой статьи), с Oracle JDK или OpenJDK (включая сборки По AdoptOpenJDK выпущен после середины октября 2018 года ).

Решение без сторонних инструментов:

  • оставьте все JDK в их расположении по умолчанию под /Library/Java/JavaVirtualMachines. Система выберет самую высокую версию по умолчанию. 
  • Чтобы исключить выбор JDK по умолчанию, переименуйте его Contents/Info.plist в Info.plist.disabled. Этот JDK все еще может быть использован, когда $Java_HOME указывает на него, или явно указан в скрипте или конфигурации. Он будет просто игнорироваться системной командой Java.

Системный лаунчер будет использовать JDK с самой высокой версией среди тех, которые имеют файл Info.plist.

При работе в командной оболочке с альтернативным JDK выберите свой метод среди существующих ответов (jenv или пользовательские псевдонимы/сценарии вокруг /usr/libexec/Java_home и т.д.).


Подробности расследования в этом Гисте .


(*) Текущие ответы либо устарели (больше не действительны для macOS El Capitan или Sierra), либо относятся только к одному JDK, либо не затрагивают общесистемный аспект. Многие объясняют, как изменить $Java_HOME, но это влияет только на текущую оболочку и то, что запускается оттуда. Это не повлияет на приложение, запущенное из панели запуска ОС (если вы не измените нужный файл и выйдите из системы/войдите в систему, что утомительно). То же самое для jenv, это круто и все такое, но, насколько я могу судить, оно просто меняет переменные окружения, поэтому оно имеет то же ограничение.

247
Hugues M.

В дополнение к ответам, приведенным выше, я добавил следующие строки в свой .bash_profile, что делает его очень удобным для переключения (включая комментарий @ elektromin для Java 9):

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"

После вставки выполните $ 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)
150
Justin Zhang

Маленькая рыбка на основе/usr/libexec/Java_home

function jhome
    set Java_HOME (/usr/libexec/Java_home $argv)
    echo "Java_HOME:" $Java_HOME
    echo "Java -version:"
    Java -version
end

Если вы не используете fish, вы можете сделать что-то подобное в bash:

#!/bin/bash

jhome () {
  export Java_HOME=`/usr/libexec/Java_home [email protected]`
  echo "Java_HOME:" $Java_HOME
  echo "Java -version:"
  Java -version
}

Затем, чтобы переключиться между Java сделать:

$> jhome           #switches to latest Java
$> jhome -v 1.7    #switches to Java 1.7
$> jhome -v 1.6    #switches to Java 1.6

ref: https://Gist.github.com/kenglxn/1843d552dff4d4233271

49
kenglxn

Использовать 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.Все все готово

команда переключения: 

jenv использует Java 1.8

установить по умолчанию: 

jenv по умолчанию Java 1.7

30
Yuantao

Это немного сложно, но попробуйте выполнить шаги, описанные в Установка 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 постоянно находилась в вашем терминале

26
Trein

установить 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)"

попробуйте команду:

javac -version

должен вывести:

javac 1.8.0_111
20
user2708060

тЛ; др

Добавьте строку: 

export Java_HOME='/Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home'

в файл

~/.bash_profile

заменить на загруженную версию.

затем source ~/.bash_profile

15
dustinevan
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 [email protected]`
    export PATH=$Java_HOME/bin:$PATH
  fi
}

поместите это в ваш ~/.profile и используйте его в своем терминале, например, setjdk 1.8, setjdk 1.7, setjdk 9 и т. д. и т. д.

Если у вас нет removeFromPath, то это: 

function removeFromPath() { export PATH=$(echo $PATH | sed -E -e "s;:$1;;" -e "s;$1:?;;") }

10
Gabriel Reiser

Используйте jenv, это как менеджер среды Java. Это супер легко использовать и чистить

Для Mac выполните следующие действия:

brew install jenv

git clone https://github.com/gcuisinier/jenv.git ~/.jenv

Установка: Если вы используете bash, выполните следующие действия:

$ echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.bash_profile

echo 'eval "$(jenv init -)"' >> ~/.bash_profile

$ exec $Shell -l

Добавьте нужные версии JVM в jenv:

jenv add /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home

jenv add /System/Library/Java/JavaVirtualMachines/1.8.0.jdk/Contents/Home

Проверьте установленные версии:

jenv versions

Установите версию Java, которую вы хотите использовать:

jenv global Oracle64-1.6.0
5
slal

С официальной страницы Apple Java_home (1) :

**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`
5
Antonio

Если вы все еще не можете установить его. используя эту команду.

экспорт Java_HOME = /usr/libexec/Java_home -v 1.8

тогда вы должны использовать это.

экспорт Java_HOME = $(/usr/libexec/Java_home -v 1.8)

это обязательно сработает.

3
RohitKumar

Сначала выясните, где вы храните переменные среды. 

  1. emacs 
  2. bash_profile 
  3. файл zshrc

Шаги для настройки переменной среды: -

  1. Загрузите JDK с Java
  2. установить его двойным щелчком
  3. Теперь настройте переменные окружения в вашем файле

    а. Для emacs.profile вы можете использовать эту ссылку OR, см. Скриншот ниже 

 enter image description here

b. Для настройки профиля ZSH -

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.

3
Vrushali Raut

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;
}

Переключиться на Java 8

$ 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)
3
Marcello de Sales

Если вы используете fish, и вы используете mac, и вы хотите переключаться между JDK, то ниже для меня работает на mac.

Ответ @ kenglxn не сработал для меня, и я понял, что bcos не установил -g, который является глобальным!

Поместите ниже в ~/.config/fish/config.fish

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

Чтобы узнать, какую версию/минорную версию вы установили, вы можете сделать:

/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
2
Gob00st

На основе ответа @markhellewell я создал несколько псевдонимов, которые сделают это за вас. Просто добавьте их в свой загрузочный файл Shell

#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; 
}

https://Gist.github.com/Noyabronok/0a90e1f3c52d1aaa941013d3caa8d0e4

1
Alex

Вот как я это делаю на моем Linux (Ubuntu/Mint mate), думаю, Mac может сделать это аналогичным образом.


Установить и настроить

Шаги:  

  • [Базовая - часть]
  • Загрузите jdk ( .tgz 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.
  • [Еще версия - часть]
  • При необходимости загрузите и установите больше версий Java, как описано выше.
    например
    /mnt/star/program/Java/jdk-11
  • [Переключатель - часть]
  • В ~/.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
  • В ~/.bashrc определите команду для переключения версии Java.
    например
    ## switch Java version,
    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"
    # default Java version,
    alias jvd="rm $Java_HOME; ln -s $_E_Java_HOME_D $Java_HOME"
    alias jv="Java -version"
  • В терминале source ~/.bashrc чтобы изменения вступили в силу.
  • Затем можно переключиться с помощью определенных команд. 

Команды - сверху конфиг

Команды:  

  • jv11
    Переключиться на Java 11
  • jv8
    Переключиться на Java 8
  • jvd
    Переключиться на версию Java по умолчанию, которая обозначена _E_Java_HOME_D, определенной выше.
  • jv
    Показать версию Java.

Пример вывода:  

[email protected]:~$ 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)

[email protected]:~$ jv11
[email protected]:~$ 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)

[email protected]:~$ jvd
[email protected]:~$ 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)

[email protected]:~$ 

Механизм

  • Он переключается путем изменения программной ссылки, которая используется как 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).

1
Eric Wang

добавить следующую команду в файл ~/.zshenv

export Java_HOME=`/usr/libexec/Java_home -v 1.8` 
1
xsilen T

Если у вас есть несколько версий, и вы хотите что-то запустить с использованием определенной версии, используйте этот пример:

/usr/libexec/Java_home -v 1.7.0_75 --exec Java -jar you-file.jar
0
MonstroDev

Простой способ включить отдельно установленный JDK в список, заданный /usr/libexec/Java_home -V, - создать символическую ссылку на каталог следующим образом:

Sudo ln -s path/to/jdk /Library/Java/JavaVirtualMachines/jdk-[some-identifier].jdk

Например, чтобы зарегистрировать JDK, включенный в Android Studio (1.8.0_152 на момент написания), используйте:

Sudo ln -s /Applications/Android\ Studio.app/Contents/jre/jdk /Library/Java/JavaVirtualMachines/jdk-Android-studio.jdk

Теперь Java_home выведет JDK в список Matching Java Virtual Machines, и вы можете выбрать его, как описано выше.

0
friederbluemle

Этот инструмент сделает работу за вас: 

http://www.guigarage.com/2013/02/change-Java-version-on-mac-os/

Это простой JavaOne, который можно использовать для определения текущей версии Java. Версия может использоваться в командной консоли, которая открывается после выбора версии в инструменте.

0
Hendrik Ebbers