¿Cómo cambio entre Java 7 y Java 6 en OS X 10.8.2?


84

Estoy usando Java SE 7 para programar juegos simples para Windows y Mac, pero tengo que cambiar a Java 6 para ejecutar juegos como Minecraft en mi computadora. Esto solía funcionar bien antes de actualizar a Mac OS X 10.8.2 Build 12C60.

Antes de esta actualización, solía poder abrir las Preferencias de Java y marcar Java 6 o Java 7. Pero ahora parece que no puedo encontrar las Preferencias de Java.

Estoy ejecutando OS X 10.8.2 (última versión).


3
Tienes razón, las preferencias de Java ahora se eliminan con la última actualización. Algunos métodos de shell que he probado no están funcionando, pero debe haber algún mecanismo para facilitar esto cuando ejecutas los 7 más recientes también.
iluminar

Respuestas:


41

No creo que sea posible cambiar JRE (entornos de tiempo de ejecución) ver aquí:

http://docs.oracle.com/javase/7/docs/webnotes/install/mac/mac-jre.html

Que estados:

Solo se puede instalar un JRE. La instalación de un JRE elimina el JRE instalado previamente. La versión JRE utilizada por el sistema se puede determinar de una de dos maneras:

Solución alternativa:

Tuve un problema similar al que tienes con Minecraft con Wuala. Donde necesitaba ejecutar Wuala usando Java 1.6 mientras necesitaba desarrollar con JDK 1.7 y lo logré abriendo el paquete Wuala.app y cambiando su script de inicio en:

/Applications/Wuala.app/Contents/MacOS/wuala

de:

exec java ${VMARGS} -cp "${JAR_DIR}/loader3.jar":/System/Library/Java/ com.wuala.loader3.Loader3 -alternateprogrampath "${JAR_DIR}" -installed $*

a:

/usr/libexec/java_home -v 1.6.0 --exec java ${VMARGS} -cp "${JAR_DIR}/loader3.jar":/System/Library/Java/ com.wuala.loader3.Loader3 -alternateprogrampath "${JAR_DIR}" -installed $*

Es decir, simplemente reemplazando: execcon:/usr/libexec/java_home -v 1.6.0 --exec

Por supuesto, esto es bastante complicado y se romperá cada vez que wuala se actualice automáticamente, pero de lo contrario funciona.

Para usar otro JDK ver aquí:

http://docs.oracle.com/javase/7/docs/webnotes/install/mac/mac-jdk.html

Que estados:

Para ejecutar una versión diferente de Java, especifique la ruta completa o use la herramienta java_home: /usr/libexec/java_home -v 1.7.0_06 --exec javac -version

Aquí hay una ilustración y ejemplos de mi configuración:

Instalaciones de Oracle JDK:

odin:~ geff$ ls -al /Library/Java/JavaVirtualMachines 
total 0
21058660 0 drwxr-xr-x  3 root  wheel  - 102 24 Oct 18:04:33 2012 jdk1.7.0_09.jdk/
21061692 0 drwxr-xr-x  3 root  wheel  - 102 24 Oct 18:06:08 2012 jdk1.7.0_07.jdk/
21042328 0 drwxrwxr-x  3 root  wheel  - 102 20 Apr 06:58:53 2012 1.7.0.jdk/
21031664 0 drwxrwxr-x  7 root  admin  - 238 24 Oct 18:04:16 2012 ../
21042327 0 drwxr-xr-x  5 root  wheel  - 170 24 Oct 18:06:13 2012 ./

Apple suministró JDK:

odin:~ geff$ ls -al /System/Library/Java/JavaVirtualMachines 
total 0
21026468 0 drwxr-xr-x  3 root  wheel  - 102  1 Nov 17:49:02 2011 1.6.0.jdk/
21026436 0 drwxr-xr-x  6 root  wheel  - 204 24 Mar 23:04:06 2012 ../
21026467 0 drwxr-xr-x  3 root  wheel  - 102  1 Nov 17:49:02 2011 ./

Esto funciona para mí también para usar el 1.6 JDK suministrado por Apple

odin:~ geff$ /usr/libexec/java_home -v 1.6.0_37 --exec java -version
java version "1.6.0_37"
Java(TM) SE Runtime Environment (build 1.6.0_37-b06-434-11M3909)
Java HotSpot(TM) 64-Bit Server VM (build 20.12-b01-434, mixed mode)

Elija entre las versiones 1.7 de Oracle:

Selección del primer Oracle JDK 1.7.0_04

odin:~ geff$ /usr/libexec/java_home -v 1.7.0_04 --exec java -version
java version "1.7.0_04"
Java(TM) SE Runtime Environment (build 1.7.0_04-b21)
Java HotSpot(TM) 64-Bit Server VM (build 23.0-b21, mixed mode)

Seleccionar JDK 1.7.0_07

odin:~ geff$ /usr/libexec/java_home -v 1.7.0_07 --exec java -version
java version "1.7.0_07"
Java(TM) SE Runtime Environment (build 1.7.0_07-b10)
Java HotSpot(TM) 64-Bit Server VM (build 23.3-b01, mixed mode)

El JDK predeterminado es el más alto:

odin:~ geff$ java -version
java version "1.7.0_09"
Java(TM) SE Runtime Environment (build 1.7.0_09-b05)
Java HotSpot(TM) 64-Bit Server VM (build 23.5-b02, mixed mode)

El valor predeterminado es el nivel de parche más alto cuando se usa solo un número de versión menor

odin:~ geff$ /usr/libexec/java_home -v 1.7.0 --exec java -version
java version "1.7.0_09"
Java(TM) SE Runtime Environment (build 1.7.0_09-b05)
Java HotSpot(TM) 64-Bit Server VM (build 23.5-b02, mixed mode)

99

Uno puede usar el java_homemecanismo más convenientemente.

Digamos que tiene Java 7 como predeterminado:

$ java -version
java version "1.7.0_15" 
…

Ahora activemos Java 6:

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

Y ahí está:

$ java -version
java version "1.6.0_41"
…

Agregué estos a mi .bashrcpara hacer las cosas aún más convenientes:

alias java_ls='/usr/libexec/java_home -V 2>&1 | grep -E "\d.\d.\d[,_]" | cut -d , -f 1 | colrm 1 4 | grep -v Home'

function java_use() {
    export JAVA_HOME=$(/usr/libexec/java_home -v $1)
    export PATH=$JAVA_HOME/bin:$PATH
    java -version
}

java_lsreduce la salida de java_home -Vsolo los números de versión. Y java_usees solo un atajo para lo que hicimos arriba. Por ejemplo java_use 1.6, cambiará a Java 6.


3
en java_use debes eliminar java anterior de $ PATH.
Eir Nym

@EirNym, ¿cómo se puede hacer eso?
Malcolm

algo que encontré útil para eliminar java anterior de $ PATH stackoverflow.com/a/370192/1503859
Nitin Mahesh

actualizar java_use que funcionó para mí: function java_use () {export JAVA_HOME = $ (/ usr / libexec / java_home -v $ 1) export PATH = echo $PATH | awk -v RS=: -v ORS=: '/Library\/Java\/JavaVirtualMachines/ {next} {print}'| sed 's/:$//' export PATH = $ JAVA_HOME / bin: $ PATH java -version}
Nitin Mahesh

35

Una solución para cambiar fácilmente el JDK (no estoy seguro acerca de JRE) ( fuente ):

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 $@`  
   export PATH=$JAVA_HOME/bin:$PATH  
  fi  
  echo JAVA_HOME set to $JAVA_HOME  
  java -version  
 }  
 function removeFromPath() {  
  export PATH=$(echo $PATH | sed -E -e "s;:$1;;" -e "s;$1:?;;")  
 }

(agregue la función anterior a su .bash_profile)

Uso:

$ setjdk 1.7

7

Una solución rápida es crear un enlace simbólico al antiguo binario Java 6:

sudo ln -s /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Commands/java /usr/local/bin/java6

Luego ejecute las aplicaciones con: java6 -jar myapp.jar


3

La aplicación de preferencias de Java ya no parece enumerar Java 1.6. Sin embargo, cuando verifico la versión de Java en la línea de comando me sale:

java -version                                            
java version "1.6.0_37"
Java(TM) SE Runtime Environment (build 1.6.0_37-b06-434-11M3909)
Java HotSpot(TM) 64-Bit Server VM (build 20.12-b01-434, mixed mode)

3

Es bastante simple cambiar las versiones de Java instantáneamente en OS X sin necesidad de cambiar la variable $ JAVA_HOME.

Estoy ejecutando 10.8.2, y mi variable $ JAVA_HOME apunta a / Library / Java / Home

echo $JAVA_HOME

Esta ruta es un enlace simbólico, como se puede ver ejecutando el comando ls -l

ls -la /Library/Java

El enlace simbólico predeterminado apunta a

Inicio -> /Library/Java/JavaVirtualMachines/1.6.0_33-b03-424.jdk/Contents/Home/

Para redirigir Java a mi instalación 1.7, simplemente reemplazo el antiguo enlace simbólico de Inicio con un nuevo enlace simbólico que apunta al directorio de inicio de mi instalación de Java 1.7.

cd /Library/Java
mv Home Home-1.6
ln -s /Library/Java/JavaVirtualMachines/jdk1.7.0_21.jdk/Contents/Home/ Home

¡Y voilá! java -version muestra que ahora estoy ejecutando java 1.7. Simplemente cambie qué enlace simbólico se llama actualmente 'Inicio' para cambiar instantáneamente el JRE de Java predeterminado.


3

Aquí hay una manera fácil de cambiar java 6 y java 7 en mac osx.

Paso 1: descargue jdk 7 del sitio web oficial de Oracle http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html e instálelo paso a paso, siga los consejos.

Paso 2: establece $ JAVA_HOME en .bash_profile

$ vim .bash_profile 

export JAVA_HOME=$(/usr/libexec/java_home)

$ source .bash_profile

$ echo $JAVA_HOME
/Library/Java/JavaVirtualMachines/1.7.0.jdk/Contents/Home

paso 3: si quieres usar jdk 6, solo una alternativa $ JAVA_HOME a la ruta de inicio jdk 6

$ vim .bash_profile 

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

$ source .bash_profile

$ echo $JAVA_HOME
/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home


2

Basado en lo anterior y un poco de otra investigación, he ideado un script que puede "fuente" (o "punto") en su perfil. Le indicará un menú de JAVA_HOMEs disponibles en su Mac, aunque también puede especificar el inicio predeterminado o preseleccionar una opción de menú.

En mi .bash_profile:

export PREJAVA_PATH="$PATH:~/bin"
export PATH="${PREJAVA_PATH}"
. gojava -d

Tenga en cuenta que requiere una variable PREJAVA_PATH. También puede llamarlo desde la línea de comando:

$ . gojava

O para preseleccionar la segunda opción:

$ . gojava -c 2

El archivo gojavaes:

#!/bin/bash

_exe=/usr/libexec/java_home
_defaultHome=$($_exe)

usage() {
cat <<EOF
$0 [-d] [-c menu_choice]

Sets JAVA_HOME and PATH variables based on a user choice from a menu of available JDKs.

Parameters:

  -d : use system default ($_defaultHome)
  -c : specify a menu choice in advance, without being prompted

Note that environment variable PREJAVA_PATH must be set, and should include the PATH that 
you want with everything but JAVA_HOME/bin.

EOF
exit 1
}

setHomePath() {
  export JAVA_HOME="$1"
  export PATH="${JAVA_HOME}/bin":"${PREPATH}"
}

# TODO: [enhancement] figure out a better way to determine a PATH that excludes the JAVA_HOME
if [ -z "${PREJAVA_PATH}" ]; then
  usage  
else
  PREPATH=${PREJAVA_PATH}
fi

_default=0
_choice=0
OPTIND=1
while getopts "dc:" name; do
 case $name in
      d) _default=1 ;;
      c) _choice="$OPTARG" ;;
      *) echo "unknown parameter $name"
         usage
         ;;
 esac
done

if [ $_default -eq 1 ]; then
  setHomePath "$_defaultHome"
else
  i=1
  while read -r line; do
    choiceList[$i]="$line"
    homeList[$i]=$(echo $line | sed 's/[^\/]*\(\/.*\)/\1/')
    i=$(($i+1))
  done < <($_exe -V 2>&1 | egrep -v '^$|^\/|^Matching')

  if [ $_choice -gt 0 -a $_choice -lt $i ]; then
    setHomePath "${homeList[$_choice]}"
  else
    printf "\nList of available Java versions:\n"
    select choice in "${choiceList[@]}"; do
      if [ $REPLY -gt 0 -a $REPLY -lt $i ]; then
        setHomePath "${homeList[$REPLY]}"
        break
      fi
    done
  fi
fi

0

La versión de shell de Fish de @alex answer (agregar a ~/config/fish/config.fish):

alias java_ls '/usr/libexec/java_home -V 2>&1 | grep -E "\d.\d.\d[,_]" | cut -d , -f 1 | colrm 1 4 | grep -v Home'

function java_use
    set JAVA_HOME (/usr/libexec/java_home -v $argv)
    set PATH $JAVA_HOME/bin $PATH
    java -version
end
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.