Como instalo o Java no Mac OSX, permitindo a troca de versão?

313

Quero instalar o OpenJDK Java no Mac OSX e fazê-lo funcionar junto com outros JDKs, pois é uma versão mais recente. Atualmente, baixei o tar.gz e o coloquei no meu caminho, mas isso é difícil de manter.

A única outra instalação que encontrei que faz mais coisas automaticamente é a instalação via barril Homebrew. Parece apenas a versão atual:

brew cask info java

Shows:

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

Para que eu possa instalá-lo a partir daí, mas e daí? Estou preso apenas com a nova versão?

Jayson Minard
fonte
Basta perguntar, podemos manter as tags de pergunta restritas a uma única versão? Como não existe nenhum script / etapas de instalação específicos da versão. Esta é uma pergunta geral (não específica da versão) e pode ser suficiente para ser etiquetada apenas com java-11 , pois presumo que seja o local em que as pessoas começarão a procurar o que a pergunta e a resposta sugerem.
Naman
Os scripts nas respostas incluem versões específicas, embora seja fácil interpretá-las para outras versões. Mas também faz parte do que os membros da comunidade procuram, por isso é bom ajudá-los a encontrar as respostas corretas rapidamente, ajudando a chamar a atenção para respostas atualizadas e modernas e a diferenciar dos tópicos antigos e desatualizados das versões 6 e 8. Tendo a versão estável mais recente e a nova versão mais recente, acho que são tags razoáveis ​​para manter.
Jayson Minard
Eu provavelmente recomendaria usar o jenv para gerenciar várias versões do Java.
paranza 26/04

Respostas:

718

Nota: Essas soluções funcionam para várias versões do Java, incluindo Java 8 e o novo Java 13, e para qualquer outra versão anterior do Java coberta pelos gerenciadores de versão listados. Isso inclui JDKs alternativos do OpenJDK, Oracle, IBM, Azul, Amazon Correto, Graal e muito mais. Trabalhe facilmente com Java 7, Java 8, Java 9, Java 10, Java 11, Java 12 e Java 13!

Você tem algumas opções de como fazer a instalação, além de gerenciar a comutação JDK. A instalação pode ser feita pelo Homebrew, SDKMAN , Jabba ou uma instalação manual. A troca pode ser feita por JEnv , SDKMAN , Jabba ou manualmente, definindo JAVA_HOME. Todos estes são descritos abaixo.


Instalação

Primeiro, instale o Java usando o método que você preferir, incluindo Homebrew, SDKMAN ou uma instalação manual do arquivo tar.gz. As vantagens de uma instalação manual é que o local do JDK pode ser colocado em um local padronizado para o Mac OSX.

Instale com SDKMAN

Este é um modelo simples, pois lida com a alternância de instalação e versão, com a ressalva de que ele instala o JDK em um diretório não padrão.

< veja abaixo "Instalando e alternando versões com o SDKMAN" >

Instale usando o Jabba

Este também é um modelo simples, pois a instalação e a alternância de versões são tratadas pela mesma ferramenta. As instalações são feitas em um diretório não padrão.

< veja abaixo "Instalando e alternando versões com o Jabba" >

Instale manualmente a partir da página de download do OpenJDK:

  1. Faça o download do OpenJDK para Mac OSX em http://jdk.java.net/ (por exemplo, Java 13 )

  2. Desarquive o tar do OpenJDK e coloque a pasta resultante (ou seja jdk-13.jdk) na sua /Library/Java/JavaVirtualMachines/pasta, pois esse é o local padrão e esperado das instalações do JDK. Você também pode instalar onde quiser, na realidade.

Instale com Homebrew

A versão do Java disponível no Homebrew Cask anterior a 3 de outubro de 2018 era de fato a Oracle JVM. Agora, no entanto, ele foi atualizado para o OpenJDK. Certifique-se de atualizar o Homebrew e você verá a versão mais recente disponível para instalação.

  1. instale o Homebrew se você ainda não o fez. Verifique se está atualizado:

    brew update
  2. Adicione a torneira de barris, se você ainda não (ou não está mais vendo versões mais antigas do Java na etapa 3):

    brew tap homebrew/cask-versions

    e para as versões AdoptOpenJDK , adicione esse toque:

    brew tap adoptopenjdk/openjdk

    Esses barris alteram suas versões do Java frequentemente, e pode haver outros toques por aí com versões adicionais do Java.

  3. Procure por versões instaláveis:

    brew search java   

    ou para as versões AdoptOpenJDK:

    brew search jdk     
  4. Verifique os detalhes na versão que será instalada:

    brew cask info java

    ou para a versão AdoptOpenJDK:

    brew cask info adoptopenjdk
  5. Instalar uma versão específica do JDK, como java11, adoptopenjdk8, ou apenas javaou adoptopenjdkpara a corrente. Por exemplo:

    brew cask install java

    Você também pode usar o caminho completo para versões mais antigas:

    brew cask install homebrew/cask-versions/java11

E eles serão instalados no /Library/Java/JavaVirtualMachines/local tradicional esperado no Mac OSX.

Outras opções de instalação:

Alguns outros tipos de openJDK são:

As versões do OpenJDK certificadas pela Azul Systems Java Zulu podem ser instaladas seguindo as instruções em seu site .

O Zulu® é uma compilação certificada do OpenJDK que é totalmente compatível com o padrão Java SE. O Zulu é 100% de código aberto e pode ser baixado gratuitamente. Agora, desenvolvedores de Java, administradores de sistema e usuários finais podem aproveitar todos os benefícios do Java de código aberto com flexibilidade de implantação e controle sobre o tempo de atualização.

As versões do Amazon Correto OpenJDK oferecem um pacote de instalação fácil para a versão 8 ou 11 (outras versões estão chegando) e são instaladas no/Library/Java/JavaVirtualMachines/diretóriopadrãono Mac OSX.

O Amazon Corretto é uma distribuição sem custo, multiplataforma e pronta para produção do Open Java Development Kit (OpenJDK). O Corretto vem com suporte de longo prazo que incluirá aprimoramentos de desempenho e correções de segurança. A Amazon executa o Corretto internamente em milhares de serviços de produção e o Corretto é certificado como compatível com o padrão Java SE. Com o Corretto, você pode desenvolver e executar aplicativos Java em sistemas operacionais populares, incluindo Linux, Windows e macOS.


Onde está o meu JDK?!?!

Para encontrar locais dos Java JDKs instalados anteriormente nos locais padrão do sistema, use:

/usr/libexec/java_home -V

Correspondência de Java Virtual Machines (6):
13, x86_64: "OpenJDK 13" /Library/Java/JavaVirtualMachines/openjdk-13.jdk/Contents/Home 12, x86_64: "OpenJDK 12" / Biblioteca / Java / JavaVirtualMachines / jdk-12 .jdk / Conteúdo / Home
11, x86_64: "Java SE 11" /Biblioteca/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, x86_64: "Java SE 9" /Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home
1.8.0_144, x86_64: "Java SE 8" / Biblioteca /Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home

Você também pode relatar apenas o local de uma versão Java específica usando -v. Por exemplo para Java 13:

/usr/libexec/java_home -v 13

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

Conhecer a localização dos JDKs instalados também é útil ao usar ferramentas como JEnv, adicionar uma instalação local ao SDKMAN ou vincular um JDK do sistema no Jabba - e você precisa saber onde encontrá-los.

Se você precisar encontrar os JDKs instalados por outras ferramentas, verifique estes locais:

  • O SDKMAN instala no ~/.sdkman/candidates/java/
  • O Jabba instala para ~/.jabba/jdk

Alternando versões manualmente

O executável Java é um wrapper que usará o que o JDK estiver configurado JAVA_HOME, para que você possa alterar também o JDK em uso.

Por exemplo, se você instalou ou desmarcou o JDK 13 para /Library/Java/JavaVirtualMachines/jdk-13.jdkse esse for o número de versão mais alto, ele já deve ser o padrão; caso contrário, você pode simplesmente definir:

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

E agora, qualquer que seja o executável Java no caminho, verá isso e usará o JDK correto.

O uso do /usr/libexec/java_homeutilitário conforme descrito anteriormente ajuda a criar aliases ou a executar comandos para alterar as versões Java, identificando os locais das diferentes instalações do JDK. Por exemplo, criando aliases de shell no seu .profileou .bash_profilepara alterar JAVA_HOMEpara você:

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

Para alterar as versões, basta usar o alias.

java8
java -version

versão java "1.8.0_144"

Obviamente, a configuração JAVA_HOMEmanualmente também funciona!


Alternando versões com JEnv

O JEnv espera que os Java JDKs já existam na máquina e possam estar em qualquer local. Normalmente você encontrará Java JDKs instalados em/Library/Java/JavaVirtualMachines/. O JEnv permite definir a versão global do Java, uma para o shell atual e uma versão local por diretório, útil quando alguns projetos exigem versões diferentes das outras.

  1. Instale o JEnv, caso ainda não o tenha, instruções no site http://www.jenv.be/ para instalação manual ou usando o Homebrew.

  2. Adicione qualquer versão Java ao JEnv ( ajuste o diretório se você o tiver colocado em outro lugar ):

    jenv add /Library/Java/JavaVirtualMachines/jdk-13.jdk/Contents/Home
  3. Defina sua versão global usando este comando:

    jenv global 13

Você também pode adicionar outras versões existentes usando de jenv addmaneira semelhante e listar as que estão disponíveis. Por exemplo Java 8:

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

Veja os documentos JEnv para mais comandos. Agora você pode alternar entre versões do Java (Oracle, OpenJDK, outro) a qualquer momento, para todo o sistema, para shells ou por diretório local.

Para ajudar a gerenciar JAVA_HOMEenquanto usa o JEnv, você pode adicionar o plug - in de exportação para fazer isso por você.

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

O plug-in de exportação pode não ser ajustado JAVA_HOMEse já estiver definido, portanto, talvez seja necessário limpar essa variável em seu perfil para que possa ser gerenciada pelo JEnv.

Você também pode usar jenv exec <command> <parms...>para executar comandos únicos JAVA_HOMEe PATHdefinir corretamente esse comando, o que pode incluir a abertura de outro shell.


Instalando e alternando versões com o SDKMAN

O SDKMAN é um pouco diferente e lida com a instalação e a alternância. O SDKMAN também coloca os JDKs instalados em sua própria árvore de diretórios, que normalmente é~/.sdkman/candidates/java. O SDKMAN permite definir uma versão padrão global e uma versão específica para o shell atual.

  1. Instale o SDKMAN em https://sdkman.io/install

  2. Listar as versões Java disponíveis para garantir que você saiba o ID da versão

    sdk list java
  3. Instale uma dessas versões, por exemplo, Java 13:

    sdk install java 13.0.0-open 
  4. Faça 13 a versão padrão:

    sdk default java 13.0.0-open

    Ou mude para 13 para a sessão:

    sdk use java 13.0.0-open

Ao listar as versões disponíveis para instalação usando o comando list, você verá uma ampla variedade de distribuições de Java:

sdk list java

E instale versões adicionais, como o JDK 8:

sdk install java 8.0.181-oracle

O SDKMAN pode trabalhar com versões existentes instaladas anteriormente. Basta fazer uma instalação local fornecendo seu próprio rótulo de versão e a localização do JDK:

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

E use-o livremente:

sdk use java my-local-13

Mais informações estão disponíveis no Guia de uso do SDKMAN, juntamente com outros SDKs que podem ser instalados e gerenciados.

O SDKMAN gerenciará automaticamente o seu PATHe JAVA_HOMEpara você conforme você altera as versões.


Instalando e alternando versões com o Jabba

O Jabba também lida com a instalação e a troca. O Jabba também coloca os JDKs instalados em sua própria árvore de diretórios, que normalmente é~/.jabba/jdk.

  1. Instale o Jabba seguindo as instruções na página inicial .

  2. Lista de JDKs disponíveis

    jabba ls-remote
  3. Instale o Java JDK 12

    jabba install [email protected]
  4. Use-o:

    jabba use [email protected]

Você também pode usar nomes alternativos de versões, vincular a JDKs já instalados e encontrar uma mistura de JDKs interessantes, como GraalVM, Adopt JDK, IBM JDK e muito mais. O guia de uso completo também está disponível na página inicial.

O Jabba gerenciará automaticamente o seu PATHe JAVA_HOMEpara você conforme você altera as versões.

Jayson Minard
fonte
2
Para a instalação manual, acho que você precisa definir JAVA_HOMEpara selecionar uma versão específica, algo como export JAVA_HOME=$(/usr/libexec/java_home -v <version>)no seu.bash_profile
Peter Hull
@PeterHull Alguns gerenciadores de versão Java não gostam de ter JAVA_HOMEdefinido manualmente e gerenciam eles mesmos. O JEnv com certeza não o ajustará se definido anteriormente, não tem certeza sobre o Jabba e o SDKMAN, mas eles normalmente gerenciarão essa configuração. Somente uma instalação manual sem alternância de versão deve definir esse valor diretamente.
Jayson Minard 29/09
concordo plenamente, seria bom se você observasse que, na sua resposta, como a pergunta original solicitada para alternar a versão e definir JAVA_HOME é a (apenas?) maneira de fazer isso no método de instalação manual.
Peter Hull
2
O Java no brew barrk foi alterado para OpenJDK 11 ontem, 3 de outubro de 2018.
Xingang Huang 4/18
16
Possivelmente a resposta mais extensa e útil para executar JDKs diferentes no MacOS, cobrindo muitas abordagens diferentes, algumas que eu nunca havia encontrado antes.
Kevin Hooke
7

Foi assim que eu fiz.

Etapa 1: instalar o Java 11

Você pode baixar o Java 11 dmg para mac a partir daqui: https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.html

Etapa 2: Após a instalação do Java 11. Confirme a instalação de todas as versões. Digite o seguinte comando no seu terminal.

/usr/libexec/java_home -V

Etapa 3: Editar .bash_profile

sudo nano ~/.bash_profile

Etapa 4: adicione 11.0.1 como padrão. (Adicione a linha abaixo ao arquivo bash_profile).

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

para mudar para qualquer versão

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

Agora pressione CTRL + X para sair do bash. Pressione 'Y' para salvar as alterações.

Etapa 5: recarregar bash_profile

source ~/.bash_profile

Etapa 6: confirmar a versão atual do Java

java -version
VK321
fonte
Ótima solução. Mas e se ainda houver a versão java apontada para 8 enquanto eu exportei o JAVA_HOME 11?
AlexGera
1
A pergunta é sobre o Open JDK, mas você vinculou ao Oracle JDK. O Open JDK não parece ter um instalador ou instruções de instalação.
Splaktar 28/02/19
1
Em resposta a @AlexGera - adicione esta linha: export $ PATH = $ JAVA_HOME / bin: $ PATH
Fuad Efendi
6

Alternando manualmente a versão padrão do sistema sem ferramentas de terceiros:

Conforme detalhado nesta resposta anterior , no macOS /usr/bin/javaé uma ferramenta de empacotador que usará a versão Java apontada por JAVA_HOMEou se essa variável não estiver definida procurará instalações Java em /Library/Java/JavaVirtualMachines/e usará a versão com a mais alta. Ele determina as versões olhando Contents/Info.plistsob cada pacote.

Armado com esse conhecimento, você pode:

  • controle qual versão o sistema usará renomeando Info.plistnas versões que você não deseja usar como padrão (esse arquivo não é usado pelo próprio tempo de execução Java).
  • controlar qual versão usar para tarefas específicas, definindo $JAVA_HOME

Acabei de verificar que isso ainda é verdade no OpenJDK & Mojave.

Em um sistema totalmente novo, não há versão Java instalada:

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

Cancele isso, faça o download do OpenJDK 11 e 12ea em https://jdk.java.net ; instale o OpenJDK11:

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

O sistema java agora é 11:

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

Instale o OpenJDK12 (acesso antecipado no momento):

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

O sistema java agora tem 12 anos:

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

Agora vamos "ocultar" o OpenJDK 12 do wrapper java do sistema:

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

O java do sistema voltou ao 11:

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

E você ainda pode usar a versão 12 pontualmente configurando manualmente JAVA_HOME:

$ export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-12.jdk/Contents/Home
$ java -version
openjdk version "12-ea" 2019-03-19
[...]
Hugues M.
fonte
1
e também deve ser verdade agora com AdoptOpenJDK constrói
Hugues M.
6

Se você possui várias versões instaladas em sua máquina, adicione o seguinte no perfil do bash:

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

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

exportar JAVA_HOME_9 = $ (/ usr / libexec / java_home -v9)

E adicione os seguintes aliases:

alias java7 = 'exportar JAVA_HOME = $ JAVA_HOME_7'

alias java8 = 'exportar JAVA_HOME = $ JAVA_HOME_8'

alias java9 = 'exportar JAVA_HOME = $ JAVA_HOME_9'

E pode alternar para a versão necessária usando o alias:

No terminal:

~ >> java7 export JAVA_HOME=$JAVA_7_HOME

Lyncean Patel
fonte
Sim, isso foi abordado em outra resposta aqui.
Jayson Minard
3

Outra alternativa é usar o SDKMAN ! Veja https://wimdeblauwe.wordpress.com/2018/09/26/switching-between-jdk-8-and-11-using-sdkman/

Primeiro instale o SDKMAN: https://sdkman.io/install e depois ...

  1. Instale o Oracle JDK 8 com: sdk install java 8.0.181-oracle
  2. Instale o OpenJDK 11 com: sdk install java 11.0.0-open

Para mudar:

  • Alterne para o JDK 8 com sdk use java 8.0.181-oracle
  • Alterne para o JDK 11 com sdk use java 11.0.0-open

Para definir um padrão:

  • O padrão é o JDK 8 com sdk default java 8.0.181-oracle
  • O padrão é o JDK 11 com sdk default java 11.0.0-open
Wim Deblauwe
fonte
3

Com Homebrew e jenv:

Suposição: máquina Mac e você já instalou o homebrew.

Instale o barril:

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

Para instalar o java mais recente:

$ brew cask install java

Para instalar o java 8:

$ brew cask install java8

Para instalar o java 9:

$ brew cask install java9

Se você deseja instalar / gerenciar várias versões, use 'jenv':

Instale e configure o jenv:

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

Adicione o java instalado ao 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

Para ver todo o java instalado:

$ jenv versions

O comando acima fornecerá a lista de java instalado:

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

Configure a versão java que você deseja usar:

$ jenv global oracle64-1.6.0.39
Lyncean Patel
fonte
1
Error: caskroom/cask was moved. Tap homebrew/cask-cask instead, Entãofatal: repository 'https://github.com/Homebrew/homebrew-cask-cask/' not found
ChumiestBucket
o que @ChumiestBucket disse - esta solução tem vários problemas
javadba
1

IMHO, não há necessidade de instalar todos os aplicativos / pacotes adicionais.

Verifique as versões disponíveis usando o comando:

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

Agora, se você quiser escolher o Azul JDK 8 na lista acima, e NÃO o Java SE 8 da Oracle, chame o comando como abaixo:

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

Para escolher o Java SE 8 da Oracle, você chamaria o comando:

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

Como você pode ver, o número da versão fornecida deve ser o conjunto exclusivo de strings: 1.8.0_181 vs 1.8.0_151

Ranganath Samudrala
fonte
O primeiro exemplo não deveria ter uma string de versão 1.8.0_181-zulu-8.31.0.1? ou é correspondência parcial?
Jayson Minard
Na verdade, isso não altera nada para usar a versão do Java, apenas informa a localização do JAVA_HOME. A troca manual usando esses comandos é abordada em minha outra resposta.
Jayson Minard