Как установить Java 11 на Mac OSX, позволяющую переключать версии?

Я хочу установить OpenJDK Java 11 на Mac OSX и заставить его работать вместе с другими JDK, так как это более новая версия. В настоящее время я скачал tar.gz и поместил его в мой путь, но это сложно поддерживать.

Единственные другие установки, которые я обнаружил, которые делают больше вещей автоматически, - это установка Oracle через бочонок Homebrew, но это коммерческий JDK, и мне нужен открытый код!

brew cask info java

Показывает:

Java: 11,28: 55eed80b163941c8885ad9298e6d786a https://www.oracle.com/technetwork/java/javase/overview/index.html

Какой это Oracle JDK, а не OpenJDK, см.: https://discourse.brew.sh/t/how-to-install-openjdk-with-brew/712

Следующие указания из старого вопроса ( Mac OS X и несколько версий Java) устарели и дают мне неправильную версию - Oracle, а не OpenJDK.

Обновление: по состоянию на 3 октября 2018 года бочка Homebrew теперь указывает на OpenJDK 11

11 ответов

Решение

примечание: эти решения работают для вашего конкретного случая Java 11 OpenJDK, но также работают для любой другой предыдущей версии Java, охватываемой перечисленными менеджерами версий. Это включает в себя альтернативные JDK от OpenJDK, Oracle, IBM, Azul, Amazon Correto, Graal и других. Легко работайте с Java 7, Java 8, Java 9, Java 10, Java 11 и даже с ранним доступом к Java 12!

У вас есть несколько вариантов, как выполнить установку, а также управлять переключением JDK. Установка может быть сделана Homebrew, SDKMAN, Jabba или ручной установкой. Переключение может быть выполнено с помощью JEnv, SDKMAN, Jabba или вручную, установив JAVA_HOME, Все это описано ниже.


Монтаж

Во-первых, установите Java любым удобным для вас способом, включая Homebrew, SDKMAN или ручную установку файла tar.gz. Преимущества ручной установки заключаются в том, что расположение JDK можно разместить в стандартизированном месте для Mac OSX.

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

Это простая модель в том смысле, что она обрабатывает как установку, так и переключение версий, с оговоркой, что она устанавливает JDK в нестандартный каталог.

< см. ниже "Установка и переключение версий с помощью SDKMAN" >

Установить с помощью Jabba

Это также простая модель, в которой установка и переключение версий выполняются одним и тем же инструментом. Установки сделаны в нестандартный каталог.

< см. ниже "Установка и переключение версий с помощью Jabba" >

Установите вручную со страницы загрузки OpenJDK:

  1. Загрузите OpenJDK 11 для Mac OSX с http://jdk.java.net/11/ (или с ранним доступом к JDK 12 с http://jdk.java.net/12/).

  2. Разархивируйте архив OpenJDK и поместите полученный jdk-11.jdk папка в вашем /Library/Java/JavaVirtualMachines/ папка, так как это стандартное и ожидаемое место установки JDK. Вы также можете установить в любом месте в реальности.

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

Версия Java, доступная в Homebrew Cask до 3 октября 2018 года, действительно была Oracle JVM. Однако теперь он был обновлен до OpenJDK. Обязательно обновите Homebrew, и тогда вы увидите последнюю версию, доступную для установки.

  1. установите Homebrew, если вы еще этого не сделали. Убедитесь, что оно обновлено:

    brew update
    
  2. Добавьте кран для бочек, если вы еще этого не сделали:

    brew tap homebrew/cask-versions
    
  3. Ищите устанавливаемые версии:

    brew search java
    
  4. Проверьте информацию о версии, которая будет установлена:

    brew cask info java
    

    Примечание: до 3 октября 2018 года текущим выпуском является коммерческая версия Oracle 11 для Oracle, а после 3 октября - OpenJDK 11.

  5. Установите конкретную версию JDK, такую ​​как java8, java10 или же java для текущего:

    brew cask install java
    

    Версия AdoptOpenJDK теперь доступна и из Homebrew Cask:

    brew cask install adoptopenjdk
    

И они будут установлены в /Library/Java/JavaVirtualMachines/ это традиционное расположение, ожидаемое на Mac OSX.

Другие варианты установки:

Некоторые другие разновидности openJDK:

Azul Systems Java Zulu сертифицированные сборки OpenJDK можно установить, следуя инструкциям на их сайте.

Zulu® - это сертифицированная сборка OpenJDK, полностью соответствующая стандарту Java SE. Zulu на 100% с открытым исходным кодом и свободно загружается. Теперь разработчики Java, системные администраторы и конечные пользователи могут пользоваться всеми преимуществами Java с открытым исходным кодом, гибкостью развертывания и контролем времени обновления.

Сборки Amazon Correto OpenJDK имеют простой в использовании установочный пакет для версии 8 (будут выпущены другие версии) и устанавливаются в соответствии со стандартом. /Library/Java/JavaVirtualMachines/ каталог на Mac OSX.

Amazon Corretto - это бесплатный, многоплатформенный, готовый к работе дистрибутив Open Java Development Kit (OpenJDK). Corretto поставляется с долгосрочной поддержкой, которая будет включать улучшения производительности и исправления безопасности. Amazon запускает Corretto внутри компании на тысячах производственных сервисов, и Corretto сертифицирована как совместимая со стандартом Java SE. С Corretto вы можете разрабатывать и запускать приложения Java на популярных операционных системах, включая Amazon Linux 2, Windows и macOS.


Где мой JDK?!?!

Чтобы найти местоположения ранее установленных Java JDK, установленных в расположениях системы по умолчанию, используйте:

/usr/libexec/java_home -V

Соответствие виртуальных машин Java (8): 11, x86_64: "Java SE 11" /Library/Java/JavaVirtualMachines/jdk-11.jdk/Contents/Home 10.0.2, x86_64: "Java SE 10.0.2" / Библиотека /Java/JavaVirtualMachines/jdk-10.0.2.jdk/Contents/Home 9, x86_64: "Java SE 9" /Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home 1.8.0_144, x86_64: "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home

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

/usr/libexec/java_home -v 11

/Library/Java/JavaVirtualMachines/jdk-11.jdk/Contents/Home

Знание расположения установленных JDK также полезно при использовании таких инструментов, как JEnv, или при добавлении локальной установки в SDKMAN, или при связывании системного JDK в Jabba - и вам нужно знать, где их найти.

Если вам нужно найти JDK с другими инструментами, проверьте эти места:

  • SDKMAN устанавливается на ~/.sdkman/candidates/java/
  • Джабба устанавливает в ~/.jabba/jdk

Переключение версий вручную

Исполняемый файл Java - это оболочка, которая будет использовать все, что настроено в JDK. JAVA_HOME, так что вы можете изменить это, чтобы также изменить, какой JDK используется.

Например, если вы установили или не использовали JDK 11 для /Library/Java/JavaVirtualMachines/jdk-11.jdk если это наибольший номер версии, он уже должен быть по умолчанию, если нет, вы можете просто установить:

export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-11.jdk/Contents/Home

И теперь, где бы ни находился исполняемый файл Java, он увидит это и будет использовать правильный JDK.

С использованием /usr/libexec/java_home Утилита, как описано выше, помогает вам создавать псевдонимы или запускать команды для изменения версий Java, определяя расположение различных установок JDK. Например, создание псевдонимов оболочки в вашем .profile или же .bash_profile изменить JAVA_HOME для тебя:

export JAVA_8_HOME=$(/usr/libexec/java_home -v1.8)
export JAVA_9_HOME=$(/usr/libexec/java_home -v9)
export JAVA_10_HOME=$(/usr/libexec/java_home -v10)
export JAVA_11_HOME=$(/usr/libexec/java_home -v11)

alias java8='export JAVA_HOME=$JAVA_8_HOME'
alias java9='export JAVA_HOME=$JAVA_9_HOME'
alias java10='export JAVA_HOME=$JAVA_10_HOME'
alias java11='export JAVA_HOME=$JAVA_11_HOME'

# default to Java 11
java11

Затем, чтобы изменить версию, просто используйте псевдоним.

java8
java -version

Java-версия "1.8.0_144"

Конечно постановка JAVA_HOME тоже работает вручную!


Переключение версий с JEnv

JEnv ожидает, что Java JDK уже существует на компьютере и может находиться в любом месте. Обычно вы найдете установленные Java JDK в /Library/Java/JavaVirtualMachines/, JEnv позволяет установить глобальную версию Java, одну для текущей оболочки и локальную версию для каждого каталога, что удобно, когда некоторые проекты требуют версий, отличных от других.

  1. Установите JEnv, если вы этого еще не сделали, инструкции на сайте http://www.jenv.be/ для ручной установки или использования Homebrew.

  2. Добавьте любую версию Java в JEnv (настройте каталог, если вы разместили это в другом месте):

    jenv add /Library/Java/JavaVirtualMachines/jdk-11.jdk/Contents/Home
    
  3. Установите глобальную версию с помощью этой команды:

    jenv global 11
    

Вы также можете добавить другие существующие версии, используя jenv add аналогичным образом, и перечислите те, которые доступны. Например Java 8:

jenv add /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home 
jenv versions

Посмотрите документы JEnv для большего количества команд. Теперь вы можете переключаться между любыми версиями Java (Oracle, OpenJDK и т. Д.) В любое время для всей системы, для оболочек или для локального каталога.

Чтобы помочь управлять JAVA_HOME при использовании JEnv вы можете добавить плагин экспорта, чтобы сделать это для вас.

$ jenv enable-plugin export
  You may restart your session to activate jenv export plugin echo export plugin activated

Плагин экспорта может не корректироваться JAVA_HOME если она уже установлена, вам может потребоваться очистить эту переменную в своем профиле, чтобы ею можно было управлять с помощью JEnv.

Вы также можете использовать jenv exec <command> <parms...> запускать отдельные команды с JAVA_HOME а также PATH правильно установить для этой команды, которая может включать в себя открытие другой оболочки.


Установка и переключение версий с помощью SDKMAN

SDKMAN немного отличается и обрабатывает как установку, так и переключение. SDKMAN также помещает установленные JDK в свое собственное дерево каталогов, которое обычно ~/.sdkman/candidates/java, SDKMAN позволяет установить глобальную версию по умолчанию и версию, специфичную для текущей оболочки.

  1. Установите SDKMAN по https://sdkman.io/install

  2. Установите Java 11 с помощью SDKMAN:

    sdk install java 11.0.0-open 
    
  3. Сделайте 11 версией по умолчанию:

    sdk default java 11.0.0-open
    

    Или переключитесь на 11 для сеанса:

    sdk use java 11.0.0-open
    

Вы можете просмотреть список доступных версий для установки с помощью команды list:

sdk list java

И установите дополнительные версии, такие как JDK 8:

sdk install java 8.0.181-oracle

SDKMAN может работать с ранее установленными существующими версиями. Просто выполните локальную установку с указанием собственной метки версии и расположения JDK:

sdk install java my-local-11 /Library/Java/JavaVirtualMachines/jdk-11.jdk/Contents/Home

И используйте это свободно:

sdk use java my-local-11

Дополнительная информация доступна в Руководстве по использованию SDKMAN вместе с другими SDK, которые можно установить и управлять ими.

SDKMAN будет автоматически управлять вашим PATH а также JAVA_HOME для вас, как вы меняете версии.


Установка и переключение версий с Jabba

Jabba также выполняет как установку, так и переключение. Jabba также помещает установленные JDK в свое собственное дерево каталогов, которое обычно ~/.jabba/jdk,

  1. Установите Jabba, следуя инструкциям на домашней странице.

  2. Список доступных JDK

    jabba ls-remote
    
  3. Установите Java JDK 11

    jabba install openjdk@1.11.0
    
  4. Используй это:

    jabba use openjdk@1.11.0
    

Вы также можете использовать псевдонимы версий, связываться с уже установленными JDK и найти смесь интересных JDK, таких как GraalVM, Adopt JDK, IBM JDK и других. Полное руководство по использованию также доступно на домашней странице.

Jabba будет автоматически управлять вашим PATH а также JAVA_HOME для вас, как вы меняете версии.

Вот как я это сделал.

Шаг 1: Установите Java 11

Вы можете скачать Java 11 DMG для Mac здесь: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

Шаг 2: После установки Java 11. Подтвердите установку всех версий. Введите следующую команду в своем терминале.

/usr/libexec/java_home -V

Шаг 3: Редактировать.bash_profile

sudo nano ~/.bash_profile

Шаг 4: Добавьте 11.0.1 по умолчанию. (Добавьте строку ниже в файл bash_profile).

export JAVA_HOME=$(/usr/libexec/java_home -v 11.0.1)

переключиться на любую версию

export JAVA_HOME=$(/usr/libexec/java_home -v X.X.X)

Теперь нажмите CTRL+X, чтобы выйти из bash. Нажмите "Y", чтобы сохранить изменения.

Шаг 5: Перезагрузите bash_profile

source ~/.bash_profile

Шаг 6: Подтвердите текущую версию Java

java -version

С Homebrew и jenv:

Предположение: компьютер Mac, и вы уже установили homebrew.

Установить бочку:

$ brew tap caskroom/cask
$ brew tap caskroom/versions

Чтобы установить последнюю версию Java:

$ brew cask install java

Чтобы установить java 8:

$ brew cask install java8

Чтобы установить java 9:

$ brew cask install java9

Если вы хотите установить / управлять несколькими версиями, вы можете использовать jenv:

Установите и настройте jenv:

$ brew install jenv
$ echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(jenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile

Добавьте установленную java в jenv:

$ jenv add /Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home
$ jenv add /Library/Java/JavaVirtualMachines/jdk1.11.0_2.jdk/Contents/Home

Чтобы увидеть всю установленную java:

$ jenv versions

Команда выше предоставит список установленной Java:

* system (set by /Users/lyncean/.jenv/version)
1.8
1.8.0.202-ea
oracle64-1.8.0.202-ea

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

$ jenv global oracle64-1.6.0.39

Ручное переключение версии системы по умолчанию без сторонних инструментов:

Как подробно описано в этом старом ответе, на macOS /usr/bin/java это инструмент-обертка, который будет использовать версию Java, указанную JAVA_HOME или, если эта переменная не установлена, будет искать установки Java под /Library/Java/JavaVirtualMachines/ и будет использовать тот с самой высокой версией. Он определяет версии, глядя на Contents/Info.plist под каждую упаковку.

Вооружившись этими знаниями, вы можете:

  • контролировать, какую версию система будет использовать, переименовывая Info.plist в версиях, которые вы не хотите использовать по умолчанию (этот файл не используется самой средой выполнения Java).
  • контролировать, какую версию использовать для конкретных задач, установив $JAVA_HOME

Я только что подтвердил, что это все еще верно с OpenJDK & Mojave.

На новой системе не установлена ​​версия Java:

$ java -version
No Java runtime present, requesting install.

Отмените это, загрузите OpenJDK 11 & 12ea на https://jdk.java.net/; установить OpenJDK11:

$ cd /Library/Java/JavaVirtualMachines/
$ sudo tar xzf ~/Downloads/openjdk-11.0.1_osx-x64_bin.tar.gz

Система Java теперь 11:

$ java -version
openjdk version "11.0.1" 2018-10-16
[...]

Установите OpenJDK12 (ранний доступ в данный момент):

$ sudo tar xzf ~/Downloads/openjdk-12-ea+17_osx-x64_bin.tar.gz 

Система Java теперь 12:

$ java -version
openjdk version "12-ea" 2019-03-19
[...]

Теперь давайте "спрячем" OpenJDK 12 от системной оболочки Java:

$ cd jdk-12.jdk/Contents/
$ sudo mv Info.plist Info.plist.disabled

Система Java вернулась к 11:

$ java -version
openjdk version "11.0.1" 2018-10-16
[...]

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

$ export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-12.jdk/Contents/Home
$ java -version
openjdk version "12-ea" 2019-03-19
[...]

Если на вашем компьютере установлено несколько версий, добавьте в профиль bash следующее:

экспорт JAVA_HOME_7=$(/usr/libexec/java_home -v1.7)

экспорт JAVA_HOME_8=$(/usr/libexec/java_home -v1.8)

экспорт JAVA_HOME_9=$(/usr/libexec/java_home -v9)

И добавьте следующие псевдонимы:

псевдоним java7='экспорт JAVA_HOME=$JAVA_HOME_7'

псевдоним java8='экспорт JAVA_HOME=$JAVA_HOME_8'

псевдоним java9='экспорт JAVA_HOME=$JAVA_HOME_9'

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

В терминале:

~ >> java7 export JAVA_HOME=$JAVA_7_HOME

Другая альтернатива - использование SDKMAN! Смотрите https://wimdeblauwe.wordpress.com/2018/09/26/switching-between-jdk-8-and-11-using-sdkman/

Сначала установите SDKMAN: https://sdkman.io/install а затем...

  1. Установите Oracle JDK 8 с: sdk install java 8.0.181-oracle
  2. Установите OpenJDK 11 с: sdk install java 11.0.0-open

Переключать:

  • Переключитесь на JDK 8 с sdk use java 8.0.181-oracle
  • Переключитесь на JDK 11 с sdk use java 11.0.0-open

Чтобы установить значение по умолчанию:

  • По умолчанию JDK 8 с sdk default java 8.0.181-oracle
  • По умолчанию JDK 11 с sdk default java 11.0.0-open

Вы можете использовать asdf для установки и переключения между несколькими версиями java. Также есть плагины для других языков. Вы можете установить asdf с помощью Homebrew

brew install asdf

Когда asdf настроен, установите плагин java

asdf plugin-add java

Выберите версию для установки

asdf list-all java

Например, чтобы установить и настроить accepttopenjdk8

asdf install java adoptopenjdk-8.0.272+10
asdf global java adoptopenjdk-8.0.272+10

И, наконец, при необходимости настройте JAVA_HOME для своей оболочки. Просто добавьте в свою оболочку сценарий инициализации, например ~/.zshrc в случае zsh:

. ~/.asdf/plugins/java/set-java-home.zsh

Этот ответ расширяет отличный ответ Джейсона с более самоуверенным руководством по лучшему подходу для вашего варианта использования:

  • SDKMAN - лучшее решение для большинства пользователей. Он прост в использовании, не имеет странной конфигурации и упрощает управление несколькими версиями для множества других проектов экосистемы Java.
  • Загрузка версий Java через Homebrew и переключение версий через jenv - хороший вариант, но требует дополнительной работы. Например, команды Homebrew в этом ответе, получившем большое количество голосов, больше не работают. jenv немного сложнее настроить, плагины плохо документированы, а README говорит, что проект ищет нового сопровождающего. jenv по-прежнему отличный проект, он решает эту задачу, и сообщество должно быть благодарно за замечательный вклад. SDKMAN - лучший вариант, потому что он такой классный.
  • Написано Jabba - это многоплатформенное решение, обеспечивающее одинаковый интерфейс на Mac, Windows и ПК (оно написано на Go, и это позволяет ему быть мультиплатформенным). Если вас волнует мультиплатформенное решение, это огромный аргумент. Если вас интересует только запуск нескольких версий на вашем Mac, вам не нужно многоплатформенное решение. Поддержка SDKMAN десятков популярных SDK - это то, чего вы упускаете, если используете Jabba.

Управление версиями вручную, наверное, худший вариант. Если вы решили переключить версии вручную, вы можете использовать этот код Bash вместо подробного кода Джейсона (фрагмент кода из README homebrew-openjdk:

       jdk() {
        version=$1
        export JAVA_HOME=$(/usr/libexec/java_home -v"$version");
        java -version
 }

Ответ Джейсона предоставляет основные команды для SDKMAN и jenv. Вот дополнительная информация о SDKMAN и дополнительная информация о jenv, если вы хотите получить больше информации об этих инструментах.

ИМХО, нет необходимости устанавливать все дополнительные приложения / пакеты.

Проверьте доступные версии с помощью команды:

> /usr/libexec/java_home -V
Matching Java Virtual Machines (8):
    11, x86_64: "Java SE 11-ea" /Library/Java/JavaVirtualMachines/jdk-11.jdk/Contents/Home
    10.0.2, x86_64: "Java SE 10.0.2"    /Library/Java/JavaVirtualMachines/jdk-10.0.2.jdk/Contents/Home
    9.0.1, x86_64:  "Java SE 9.0.1" /Library/Java/JavaVirtualMachines/jdk-9.0.1.jdk/Contents/Home
    1.8.0_181-zulu-8.31.0.1, x86_64:    "Zulu 8"    /Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home
    1.8.0_151, x86_64:  "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_151.jdk/Contents/Home
    1.7.0_80, x86_64:   "Java SE 7" /Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home
    1.6.0_65-b14-468, x86_64:   "Java SE 6" /Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
    1.6.0_65-b14-468, i386: "Java SE 6" /Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home

Теперь, если вы хотите выбрать Azul JDK 8 в приведенном выше списке, а не Oracle Java SE 8, выполните команду, как показано ниже:

> /usr/libexec/java_home -v 1.8.0_181
/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home

Чтобы выбрать Oracle SE SE 8, вы должны вызвать команду:

> /usr/libexec/java_home -v 1.8.0_151
/Library/Java/JavaVirtualMachines/jdk1.8.0_151.jdk/Contents/Home

Как видите, номер версии должен быть уникальным набором строк: 1.8.0_181 против 1.8.0_151

Вы можете установить версию JDK любым способом.

  • Домашнее пиво
  • SDK человек
  • Вручную

Затем я рекомендую использовать JENV для переключения между различными версиями и использования JDK, который вам нужен глобально или локально.

Вы можете найти более подробную информацию о том, как установить и использовать JENV здесь ->https://blog.adamgamboa.dev/2021/06/17/using-jenv-to-switch-jkd-versions/

Чтобы оставаться с конкретным основным выпуском, активируйте кран AdoptOpenJDK с краном для варки, а затем установите желаемую версию с помощью установки brew cask install:

$ brew tap AdoptOpenJDK/openjdk
$ brew cask install <version>

Чтобы установить AdoptOpenJDK 14 с HotSpot, запустите:

$ brew tap AdoptOpenJDK/openjdk
$ brew cask install adoptopenjdk14
Другие вопросы по тегам