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


313

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

Единственная другая установка, которую я обнаружил, которая делает больше вещей автоматически, - это установка через бочку Homebrew. Похоже, только текущая версия:

brew cask info java

шоу:

Java: 13,33: 5b8a42f3905b406298b72d750b6919f6
https://openjdk.java.net/

Так что я могу установить его оттуда, но что тогда? Я застрял только с новой версией?


Просто спрашиваю, можем ли мы ограничить использование тегов вопросов одной версией? Так как в любом случае такого сценария / шагов установки не существует. Это общий (не зависящий от версии) вопрос, и его может быть достаточно, чтобы пометить только java-11 , поскольку я предполагаю, что именно здесь люди начнут искать то, что предлагает вопрос и ответ.
Наман

Сценарии в ответах включают конкретные версии, хотя их легко интерпретировать для других версий. Но это также является частью того, что ищут члены сообщества, поэтому полезно помочь им быстро найти правильные ответы, помогая привлечь внимание к обновленным и современным ответам и отличить их от старых устаревших тем версий 6 и 8. Наличие последней стабильной версии и последней новой версии, я думаю, является разумным тегом для сохранения.
Джейсон Минард

Я, вероятно, рекомендую использовать jenv для управления несколькими версиями Java.
Паранза

Ответы:


719

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

У вас есть несколько вариантов, как выполнить установку, а также управлять переключением 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 для Mac OSX с http://jdk.java.net/ (например, Java 13 )

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

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

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

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

    brew update
  2. Добавьте каску бочек, если вы еще этого не сделали (или вы больше не видите старые версии Java на шаге 3):

    brew tap homebrew/cask-versions

    и для версий AdoptOpenJDK добавьте этот кран:

    brew tap adoptopenjdk/openjdk

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

  3. Ищите устанавливаемые версии:

    brew search java   

    или для версий AdoptOpenJDK:

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

    brew cask info java

    или для версии AdoptOpenJDK:

    brew cask info adoptopenjdk
  5. Установить конкретную версию JDK , таких как java11, adoptopenjdk8или просто javaили adoptopenjdkдля тока. Например:

    brew cask install java

    Вы также можете использовать полный путь к старым версиям:

    brew cask install homebrew/cask-versions/java11

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

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

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

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

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

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

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


Где мой JDK?!?!

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

/usr/libexec/java_home -V

Соответствие виртуальных машин Java (6):
13, x86_64: «OpenJDK 13» /Library/Java/JavaVirtualMachines/openjdk-13.jdk/Contents/Home 12, x86_64: «OpenJDK 12» / Библиотека / Java / JavaVirtualMachines / jdk-12 .jdk / Contents / Home
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» / Библиотека /Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home

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

/usr/libexec/java_home -v 13

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

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

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

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

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

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

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

export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-13.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)
export JAVA_12_HOME=$(/usr/libexec/java_home -v12)
export JAVA_13_HOME=$(/usr/libexec/java_home -v13)

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'
alias java12='export JAVA_HOME=$JAVA_12_HOME'
alias java13='export JAVA_HOME=$JAVA_13_HOME'

# default to Java 13
java13

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

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-13.jdk/Contents/Home
  3. Установите глобальную версию с помощью этой команды:

    jenv global 13

Вы также можете добавить другие существующие версии, используя 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, чтобы убедиться, что вы знаете идентификатор версии

    sdk list java
  3. Установите одну из этих версий, например, Java 13:

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

    sdk default java 13.0.0-open

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

    sdk use java 13.0.0-open

Когда вы перечислите доступные версии для установки с помощью команды list, вы увидите большое разнообразие дистрибутивов Java:

sdk list java

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

sdk install java 8.0.181-oracle

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

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

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

sdk use java my-local-13

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

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


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

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

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

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

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

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

    jabba use openjdk@1.12.0

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

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


2
Для ручной установки, я думаю, вам нужно установить JAVA_HOMEдля того, чтобы выбрать конкретную версию, что-то вроде export JAVA_HOME=$(/usr/libexec/java_home -v <version>)в вашем.bash_profile
Питер Халл

@PeterHull Некоторые из менеджеров версий Java не любят JAVA_HOMEустанавливать вручную и сами управляют им. JEnv наверняка не отрегулирует его, если он был установлен ранее, не уверен насчет Jabba и SDKMAN, но они обычно будут управлять этим параметром. Только ручная установка без переключения версий никогда не должна устанавливать это значение напрямую.
Джейсон Минард

Совершенно согласен, было бы хорошо, если бы вы могли заметить, что в вашем ответе в качестве исходного вопроса, задаваемого для переключения версий и настройки JAVA_HOME, (единственный?) способ сделать это для метода ручной установки.
Питер Халл

2
Вчера, 3 октября 2018 года, Java в пивоваренной бочке изменилась на OpenJDK 11
Xingang Huang

17
Возможно, самый исчерпывающий и полезный ответ на запуск различных JDK в MacOS, охватывающий множество различных подходов, с которыми я никогда не сталкивался раньше.
Кевин Хук

7

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

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

Вы можете скачать Java 11 DMG для Mac здесь: https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.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

Хорошее решение. Но что, если в java -version по-прежнему указано 8, а я экспортировал JAVA_HOME 11?
AlexGera

1
Вопрос касается Open JDK, но вы вместо этого связались с Oracle JDK. Open JDK не содержит установщика или инструкций по установке.
Сплактар

1
В ответ на @AlexGera - добавьте эту строку: export $ PATH = $ JAVA_HOME / bin: $ PATH
Fuad Efendi

6

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

Как подробно описано в этом более раннем ответе , в 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
[...]

1
и это также должно быть верно теперь со сборками AdoptOpenJDK
Hugues M.

6

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

export JAVA_HOME_7 = $ (/ usr / libexec / java_home -v1.7)

export JAVA_HOME_8 = $ (/ usr / libexec / java_home -v1.8)

export 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


да, это было покрыто в другом ответе здесь.
Джейсон Минард

3

Другая альтернатива - использование 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

3

С Homebrew и Jenv:

Предположение: Mac машина и вы уже установили доморощенный.

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

$ 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

1
Error: caskroom/cask was moved. Tap homebrew/cask-cask insteadтогдаfatal: repository 'https://github.com/Homebrew/homebrew-cask-cask/' not found
ChumiestBucket

что @ChumiestBucket сказал - у этого решения есть много проблем
javadba

1

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

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

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


Разве в первом примере не должно быть строки версии 1.8.0_181-zulu-8.31.0.1? или это частичное совпадение?
Джейсон Минард

На самом деле это ничего не меняет для использования версии Java, оно просто сообщает о местонахождении JAVA_HOME. Ручное переключение с помощью этих команд описано в моем другом ответе.
Джейсон Минард
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.