¿Cómo instalo Java en Mac OSX permitiendo el cambio de versión?

313

Quiero instalar OpenJDK Java en Mac OSX y hacer que funcione junto con otros JDK ya que es una versión más nueva. Actualmente, descargué el tar.gz y lo coloqué en mi camino, pero eso es difícil de mantener.

La única otra instalación que encontré que hace más cosas automáticamente es la instalación a través de Homebrew cask. Parece solo la versión actual también:

brew cask info java

Muestra:

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

Entonces puedo instalarlo desde allí, pero ¿entonces qué? ¿Estoy atascado solo con la nueva versión?

Jayson Minard
fuente
Solo preguntando, ¿podemos mantener las etiquetas de preguntas restringidas a una sola versión? Dado que de todos modos no existe tal guión / pasos de instalación específicos de la versión. Esta es una pregunta general (no específica de la versión) y puede bastar con que se la etiquete solo con java-11 , ya que supongo que es el lugar donde la gente comenzaría a buscar lo que sugiere la pregunta y la respuesta.
Naman
Las secuencias de comandos en las respuestas incluyen versiones específicas, aunque es fácil interpretarlas para otras versiones. Pero, también es parte de lo que buscan los miembros de la comunidad, por lo que es bueno ayudarlos a encontrar las respuestas correctas rápidamente al ayudar a atraer la atención a las respuestas actualizadas y modernas y a diferenciarse de los viejos temas obsoletos de la versión 6 y la versión 8. Tener la última versión estable y la última versión nueva creo que son etiquetas razonables para mantener.
Jayson Minard el
Probablemente recomendaría usar jenv para administrar múltiples versiones de Java.
paranza

Respuestas:

718

nota: Estas soluciones funcionan para varias versiones de Java, incluido Java 8 y el nuevo Java 13, y para cualquier otra versión anterior de Java cubierta por los administradores de versiones enumerados. Esto incluye JDK alternativos de OpenJDK, Oracle, IBM, Azul, Amazon Correto, Graal y más. ¡Trabaja fácilmente con Java 7, Java 8, Java 9, Java 10, Java 11, Java 12 y Java 13!

Tiene algunas opciones sobre cómo hacer la instalación y administrar la conmutación JDK. La instalación puede ser realizada por Homebrew, SDKMAN , Jabba o una instalación manual. El cambio se puede hacer mediante JEnv , SDKMAN , Jabba o manualmente mediante la configuración JAVA_HOME. Todos estos se describen a continuación.


Instalación

Primero, instale Java utilizando el método que prefiera, incluidos Homebrew, SDKMAN o una instalación manual del archivo tar.gz. Las ventajas de una instalación manual es que la ubicación del JDK se puede colocar en una ubicación estandarizada para Mac OSX.

Instalar con SDKMAN

Este es un modelo simple, ya que maneja la instalación y el cambio de versión, con la advertencia de que instala el JDK en un directorio no estándar.

< vea más abajo "Instalación y cambio de versiones con SDKMAN" >

Instalar usando Jabba

Este también es un modelo simple, ya que tanto la instalación como el cambio de versión son manejados por la misma herramienta. Las instalaciones se realizan en un directorio no estándar.

< vea más abajo "Instalación y cambio de versiones con Jabba" >

Instalar manualmente desde la página de descarga de OpenJDK:

  1. Descargue OpenJDK para Mac OSX desde http://jdk.java.net/ (por ejemplo, Java 13 )

  2. Desarchive el tar de OpenJDK y coloque la carpeta resultante (es decir jdk-13.jdk) en su /Library/Java/JavaVirtualMachines/carpeta ya que esta es la ubicación estándar y esperada de las instalaciones de JDK. También puede instalar en cualquier lugar que desee en realidad.

Instalar con Homebrew

La versión de Java disponible en Homebrew Cask antes del 3 de octubre de 2018 era, de hecho, la JVM de Oracle. Ahora, sin embargo, ahora se ha actualizado a OpenJDK. Asegúrese de actualizar Homebrew y luego verá la última versión disponible para instalar.

  1. instale Homebrew si aún no lo ha hecho. Asegúrese de que esté actualizado:

    brew update
  2. Agregue el toque de barriles, si aún no lo ha hecho (o si ya no ve versiones anteriores de Java con el paso 3):

    brew tap homebrew/cask-versions

    y para las versiones de AdoptOpenJDK , agregue ese toque:

    brew tap adoptopenjdk/openjdk

    Estos barriles cambian sus versiones de Java a menudo, y puede haber otros toques con versiones adicionales de Java.

  3. Busque versiones instalables:

    brew search java   

    o para las versiones de AdoptOpenJDK:

    brew search jdk     
  4. Verifique los detalles de la versión que se instalará:

    brew cask info java

    o para la versión AdoptOpenJDK:

    brew cask info adoptopenjdk
  5. Instalar una versión específica del JDK como java11, adoptopenjdk8, o simplemente javao adoptopenjdkpara la corriente. Por ejemplo:

    brew cask install java

    También puede usar la ruta de acceso completa a versiones anteriores:

    brew cask install homebrew/cask-versions/java11

Y se instalarán en /Library/Java/JavaVirtualMachines/la ubicación tradicional esperada en Mac OSX.

Otras opciones de instalación:

Algunos otros sabores de openJDK son:

Las versiones certificadas de Azul Systems Java Zulu de OpenJDK se pueden instalar siguiendo las instrucciones de su sitio .

Zulu® es una compilación certificada de OpenJDK que cumple totalmente con el estándar Java SE. Zulu es 100% de código abierto y se puede descargar libremente. Ahora los desarrolladores de Java, los administradores de sistemas y los usuarios finales pueden disfrutar de todos los beneficios del código abierto de Java con flexibilidad de implementación y control sobre el tiempo de actualización.

Las compilaciones de Amazon Correto OpenJDK tienen un paquete de instalación fácil de usar para la versión 8 o la versión 11 (están llegando otras versiones), y se instalan en el/Library/Java/JavaVirtualMachines/directorioestándaren Mac OSX.

Amazon Corretto es una distribución sin costo, multiplataforma y lista para producción del Open Java Development Kit (OpenJDK). Corretto viene con soporte a largo plazo que incluirá mejoras de rendimiento y correcciones de seguridad. Amazon ejecuta Corretto internamente en miles de servicios de producción y Corretto está certificado como compatible con el estándar Java SE. Con Corretto, puede desarrollar y ejecutar aplicaciones Java en sistemas operativos populares, incluidos Linux, Windows y macOS.


¿Dónde está mi JDK?!?!

Para buscar ubicaciones de Java JDK instalados previamente instalados en las ubicaciones predeterminadas del sistema, use:

/usr/libexec/java_home -V

Máquinas virtuales Java coincidentes (6):
13, x86_64: "OpenJDK 13" /Library/Java/JavaVirtualMachines/openjdk-13.jdk/Contents/Home 12, x86_64: "OpenJDK 12" / Library / 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" / 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" / Library /Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home

También puede informar solo la ubicación de una versión específica de Java utilizando -v. Por ejemplo para Java 13:

/usr/libexec/java_home -v 13

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

Conocer la ubicación de los JDK instalados también es útil cuando se utilizan herramientas como JEnv, o al agregar una instalación local a SDKMAN, o al vincular un sistema JDK en Jabba, y necesita saber dónde encontrarlos.

Si necesita encontrar JDK's instalados por otras herramientas, verifique estas ubicaciones:

  • SDKMAN se instala en ~/.sdkman/candidates/java/
  • Jabba se instala en ~/.jabba/jdk

Cambio de versiones manualmente

El ejecutable de Java es un contenedor que usará cualquier JDK configurado JAVA_HOME, por lo que puede cambiar eso para cambiar también qué JDK está en uso.

Por ejemplo, si instaló o descomprimió JDK 13 /Library/Java/JavaVirtualMachines/jdk-13.jdksi es el número de versión más alto, ya debería ser el predeterminado, de lo contrario, simplemente puede configurar:

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

Y ahora cualquier ejecutable de Java que esté en la ruta verá esto y usará el JDK correcto.

El uso de la /usr/libexec/java_homeutilidad como se describió anteriormente le ayuda a crear alias o ejecutar comandos para cambiar las versiones de Java al identificar las ubicaciones de las diferentes instalaciones de JDK. Por ejemplo, creando alias de shell en su .profileo .bash_profilepara cambiar JAVA_HOMEpor usted:

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

Luego, para cambiar las versiones, solo use el alias.

java8
java -version

versión de Java "1.8.0_144"

¡Por supuesto, la configuración JAVA_HOMEmanual también funciona!


Cambio de versiones con JEnv

JEnv espera que los JDK de Java ya existan en la máquina y puedan estar en cualquier ubicación. Por lo general, encontrará Java JDK instalados/Library/Java/JavaVirtualMachines/. JEnv permite configurar la versión global de Java, una para el shell actual, y una versión local por directorio que es útil cuando algunos proyectos requieren versiones diferentes que otros.

  1. Instale JEnv si aún no lo ha hecho, instrucciones en el sitio http://www.jenv.be/ para la instalación manual o el uso de Homebrew.

  2. Agregue cualquier versión de Java a JEnv ( ajuste el directorio si colocó esto en otro lugar ):

    jenv add /Library/Java/JavaVirtualMachines/jdk-13.jdk/Contents/Home
  3. Establezca su versión global con este comando:

    jenv global 13

También puede agregar otras versiones existentes utilizando jenv addde manera similar y enumerar las que están disponibles. Por ejemplo Java 8:

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

Vea los documentos de JEnv para más comandos. Ahora puede cambiar entre cualquier versión de Java (Oracle, OpenJDK, otra) en cualquier momento, ya sea para todo el sistema, para shells o para el directorio local.

Para ayudar a administrar JAVA_HOMEmientras usa JEnv, puede agregar el complemento de exportación para que lo haga por usted.

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

Es posible que el complemento de exportación no se ajuste JAVA_HOMEsi ya está configurado, por lo que es posible que deba borrar esta variable en su perfil para que JEnv pueda administrarla.

También puede usar jenv exec <command> <parms...>para ejecutar comandos individuales con JAVA_HOMEy PATHestablecer correctamente para ese comando, lo que podría incluir abrir otro shell.


Instalación y cambio de versiones con SDKMAN

SDKMAN es un poco diferente y maneja tanto la instalación como el cambio. SDKMAN también coloca los JDK instalados en su propio árbol de directorios, que normalmente es~/.sdkman/candidates/java. SDKMAN permite configurar una versión predeterminada global y una versión específica para el shell actual.

  1. Instale SDKMAN desde https://sdkman.io/install

  2. Enumere las versiones de Java disponibles para asegurarse de conocer el ID de la versión

    sdk list java
  3. Instale una de esas versiones, por ejemplo, Java 13:

    sdk install java 13.0.0-open 
  4. Haga 13 la versión predeterminada:

    sdk default java 13.0.0-open

    O cambie a 13 para la sesión:

    sdk use java 13.0.0-open

Cuando enumere las versiones disponibles para la instalación utilizando el comando de lista, verá una amplia variedad de distribuciones de Java:

sdk list java

E instale versiones adicionales, como JDK 8:

sdk install java 8.0.181-oracle

SDKMAN puede trabajar con versiones existentes previamente instaladas. Simplemente haga una instalación local con su propia etiqueta de versión y la ubicación del JDK:

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

Y úsalo libremente:

sdk use java my-local-13

Hay más información disponible en la Guía de uso de SDKMAN junto con otros SDK que puede instalar y administrar.

SDKMAN administrará automáticamente su PATHy JAVA_HOMEpara usted a medida que cambie las versiones.


Instalación y cambio de versiones con Jabba

Jabba también maneja tanto la instalación como la conmutación. Jabba también coloca los JDK instalados en su propio árbol de directorios, que normalmente es~/.jabba/jdk.

  1. Instale Jabba siguiendo las instrucciones en la página de inicio .

  2. Lista de JDK disponibles

    jabba ls-remote
  3. Instalar Java JDK 12

    jabba install [email protected]
  4. Úselo:

    jabba use [email protected]

También puede alias de nombres de versiones, enlaces a JDK existentes ya instalados y encontrar una combinación de JDK interesantes como GraalVM, Adopt JDK, IBM JDK y más. La guía de uso completa también está disponible en la página de inicio.

Jabba gestionará automáticamente tu PATHy JAVA_HOMEpara ti a medida que cambies las versiones.

Jayson Minard
fuente
2
Para la instalación manual, creo que debe configurar JAVA_HOMEpara seleccionar una versión específica, algo así como export JAVA_HOME=$(/usr/libexec/java_home -v <version>)en su.bash_profile
Peter Hull
@PeterHull a algunos de los administradores de versiones de Java no les gusta haberlo JAVA_HOMEconfigurado manualmente y lo administran ellos mismos. JEnv seguramente no lo ajustará si se configuró previamente, no estoy seguro acerca de Jabba y SDKMAN, pero normalmente administrarán esa configuración. Solo una instalación manual sin cambio de versión debería establecer este valor directamente.
Jayson Minard
bastante de acuerdo, sería bueno si pudieras notar que en tu respuesta ya que la pregunta original pedía el cambio de versión y la configuración de JAVA_HOME es la (¿única?) forma de hacerlo para el método de instalación manual.
Peter Hull
2
Java en brew cask cambió a OpenJDK 11 ayer, 3 de octubre de 2018.
Xingang Huang
16
Posiblemente, la respuesta más extensa y útil para ejecutar diferentes JDK en MacOS cubriendo muchos enfoques diferentes, algunos que nunca antes había encontrado.
Kevin Hooke
7

Así es como lo hice.

Paso 1: Instalar Java 11

Puede descargar Java 11 dmg para mac desde aquí: https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.html

Paso 2: Después de la instalación de Java 11. Confirme la instalación de todas las versiones. Escriba el siguiente comando en su terminal.

/usr/libexec/java_home -V

Paso 3: Editar .bash_profile

sudo nano ~/.bash_profile

Paso 4: Agregue 11.0.1 como predeterminado. (Agregue la siguiente línea al archivo bash_profile).

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

para cambiar a cualquier versión

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

Ahora presione CTRL + X para salir del bash. Presione 'Y' para guardar los cambios.

Paso 5: recarga bash_profile

source ~/.bash_profile

Paso 6: Confirme la versión actual de Java

java -version
VK321
fuente
Buena solución Pero, ¿qué pasa si todavía tengo java -version apuntando a 8 mientras exporté JAVA_HOME 11?
AlexGera
1
La pregunta es acerca de Open JDK, pero en su lugar se vinculó a Oracle JDK. El Open JDK no parece tener un instalador o instrucciones de instalación.
Splaktar
1
En respuesta a @AlexGera - agregue esta línea: export $ PATH = $ JAVA_HOME / bin: $ PATH
Fuad Efendi
6

Cambio manual de la versión predeterminada del sistema sin herramientas de terceros:

Como se detalla en esta respuesta anterior , en macOS /usr/bin/javaes una herramienta de envoltura que usará la versión de Java señalada por JAVA_HOMEo si esa variable no está configurada, buscará las instalaciones de Java /Library/Java/JavaVirtualMachines/y usará la que tenga la versión más alta. Determina las versiones mirando Contents/Info.plistdebajo de cada paquete.

Armado con este conocimiento puedes:

  • controle qué versión usará el sistema cambiando el nombre Info.plistde las versiones que no desea usar como predeterminadas (ese archivo no es utilizado por el tiempo de ejecución de Java en sí).
  • controle qué versión usar para tareas específicas estableciendo $JAVA_HOME

Acabo de verificar que esto sigue siendo cierto con OpenJDK y Mojave.

En un sistema nuevo, no hay instalada una versión de Java:

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

Cancele esto, descargue OpenJDK 11 y 12ea en https://jdk.java.net ; instalar OpenJDK11:

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

System java es ahora 11:

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

Instale OpenJDK12 (acceso anticipado en este momento):

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

El sistema java ahora es 12:

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

Ahora "ocultemos" OpenJDK 12 del sistema java wrapper:

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

System java vuelve a 11:

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

Y aún puede usar la versión 12 puntualmente 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.
fuente
1
y también debería ser cierto ahora con las versiones de AdoptOpenJDK
Hugues M.
6

Si tiene varias versiones instaladas en su máquina, agregue lo siguiente en bash profile:

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)

Y agregue los siguientes alias:

alias java7 = 'export JAVA_HOME = $ JAVA_HOME_7'

alias java8 = 'export JAVA_HOME = $ JAVA_HOME_8'

alias java9 = 'export JAVA_HOME = $ JAVA_HOME_9'

Y puede cambiar a la versión requerida utilizando el alias:

En terminal:

~ >> java7 export JAVA_HOME=$JAVA_7_HOME

Lyncean Patel
fuente
Sí, esto fue cubierto en otra respuesta aquí.
Jayson Minard el
3

¡Otra alternativa es usar SDKMAN ! Ver https://wimdeblauwe.wordpress.com/2018/09/26/switching-between-jdk-8-and-11-using-sdkman/

Primero instale SDKMAN: https://sdkman.io/install y luego ...

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

Para cambiar:

  • Cambie a JDK 8 con sdk use java 8.0.181-oracle
  • Cambie a JDK 11 con sdk use java 11.0.0-open

Para establecer un valor predeterminado:

  • Predeterminado a JDK 8 con sdk default java 8.0.181-oracle
  • Predeterminado a JDK 11 con sdk default java 11.0.0-open
Wim Deblauwe
fuente
3

Con Homebrew y Jenv:

Supuesto: máquina Mac y ya has instalado homebrew.

Instalar barril:

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

Para instalar la última versión de Java:

$ brew cask install java

Para instalar Java 8:

$ brew cask install java8

Para instalar Java 9:

$ brew cask install java9

Si desea instalar / administrar varias versiones, puede usar 'jenv':

Instalar y configurar jenv:

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

Agregue el java instalado a 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 todos los java instalados:

$ jenv versions

El comando anterior le dará la 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 la versión de Java que desea usar:

$ jenv global oracle64-1.6.0.39
Lyncean Patel
fuente
1
Error: caskroom/cask was moved. Tap homebrew/cask-cask instead, entoncesfatal: repository 'https://github.com/Homebrew/homebrew-cask-cask/' not found
ChumiestBucket
lo que @ChumiestBucket dijo: esta solución tiene múltiples problemas
javadba
1

En mi humilde opinión, no es necesario instalar todas las aplicaciones / paquetes adicionales.

Verifique las versiones disponibles con el 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

Ahora, si desea elegir Azul JDK 8 en la lista anterior, y NO Java SE 8 de Oracle, invoque el comando de la siguiente manera:

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

Para elegir Java SE 8 de Oracle, invocaría el comando:

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

Como puede ver, el número de versión proporcionado será el conjunto único de cadenas: 1.8.0_181 vs 1.8.0_151

Ranganath Samudrala
fuente
¿No debería el primer ejemplo tener una cadena de versión 1.8.0_181-zulu-8.31.0.1? o es una coincidencia parcial?
Jayson Minard
En realidad, esto no cambia nada para usar la versión de Java, solo informa la ubicación del JAVA_HOME. El cambio manual usando estos comandos está cubierto en mi otra respuesta.
Jayson Minard