2012-10-20 21:36:09 +0000 2012-10-20 21:36:09 +0000
84
84

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

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

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

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

Respuestas (10)

99
99
99
2013-02-22 12:26:51 +0000

Se puede utilizar el mecanismo java_home de forma más cómoda.

Digamos que tienes Java 7 por defecto:

$ 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"
…

He añadido esto a mi .bashrc para 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_ls reduce la salida de java_home -V a sólo los números de versión. Y java_use es sólo un atajo para lo que hicimos anteriormente. Por ejemplo, java_use 1.6 cambiará a Java 6.

41
41
41
2012-10-24 17:40:09 +0000

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

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

que dice:

Sólo se puede instalar un JRE. La instalación de un JRE elimina el JRE previamente instalado. La versión de JRE utilizada por el sistema puede determinarse de dos maneras:

Solución:

Tuve un problema similar al que tienes con Minecraft con Wuala. Donde necesitaba ejecutar Wuala usando Java 1.6 mientras que necesitaba desarrollar con JDK 1.7 y lo conseguí 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 sustituyendo: exec por: /usr/libexec/java_home -v 1.6.0 --exec

Esto es, por supuesto, bastante complicado y se romperá cada vez que wuala se actualice automáticamente, pero por lo demás funciona.

Para usar otro JDK vea aquí:

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

que dice:

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

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

Oracle JDK instala:

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

JDK suministrado por Apple:

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 me funciona también para utilizar el JDK 1.6 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)

Elegir entre las versiones 1.7 de Oracle:

Seleccionar el primer JDK de Oracle 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 el 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 por defecto 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)

Por defecto es el más alto “nivel de parche cuando se utiliza sólo el 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)
35
35
35
2013-03-18 22:53:29 +0000

Una solución para cambiar fácilmente el JDK (no estoy seguro de JRE), funciona con cualquier versión del JDK, no sólo con la 6 y la 7 fuente ):

Bash shell , añada esta función a su .bash_profile:

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

Fish shell , guarde esta función como ~/.config/fish/functions/setjdk.fish:

function setjdk
  if [(count $argv) -ne 0]
    set -x PATH (string match -v /System/Library/Frameworks/JavaVM.framework/Home/bin $PATH)
    if [-n "$JAVA_HOME"]
      set -x PATH (string match -v $JAVA_HOME $PATH)
    end
    set -x JAVA_HOME (/usr/libexec/java_home -v $argv)
    set -x PATH $JAVA_HOME/bin $PATH
    echo JAVA_HOME set to $JAVA_HOME
    java -version
  end
end

Uso:

$ setjdk 1.7
7
7
7
2012-10-23 09:02:28 +0000

Una solución rápida es crear un enlace simbólico al antiguo binario de 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
3
3
2013-11-12 10:15:22 +0000

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

paso 1 : descargar jdk 7 desde la web oficial de oracle http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html e instalarlo paso a paso siguiendo los consejos.

paso 2: poner $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 quiere usar jdk 6, simplemente alterne $JAVA_HOME a la ruta de inicio de 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
3
3
3
2013-05-16 22:11:30 +0000

Es bastante sencillo cambiar de versión de Java al instante 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 por defecto apunta a

Home -> /Library/Java/JavaVirtualMachines/1. 6.0_33-b03-424.jdk/Contents/Home/

Para redirigir java a mi instalación 1.7, simplemente sustituyo el antiguo enlace simbólico Home por un nuevo enlace simbólico que apunta al directorio home 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. Basta con cambiar el enlace simbólico que se llama actualmente ‘Home’ para cambiar instantáneamente el JRE de java por defecto.

3
3
3
2014-06-10 17:02:51 +0000

Gestiona tu entorno Java (en Mac y Linux): http://www.jenv.be/

Similar a RVM para Ruby y N para Node pero para Java.

3
3
3
2012-10-21 14:58:46 +0000

La aplicación de preferencias de Java parece que ya no muestra Java 1.6. Sin embargo, cuando compruebo la versión de Java en la línea de comandos obtengo

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)
2
2
2
2014-02-21 14:32:13 +0000

Basado en lo anterior y un poco de otra investigación, he ideado un script que puede “fuente” (o “punto”) en su perfil. Le pedirá un menú de JAVA_HOMES disponibles en su Mac, aunque también puede especificar el hogar por defecto, o pre-seleccionar 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 comandos:

$ . gojava

O para preelegir la segunda opción:

$ . gojava -c 2

El archivo gojava es:

#!/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/[^\/]*\(\/.*\)//')
    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
0
0
2016-03-12 13:10:22 +0000

La versión de Fish shell de la respuesta de @alex (añadir 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