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

Come posso passare da Java 7 a Java 6 su OS X 10.8.2?

Sto usando Java SE 7 per programmare semplici giochi per windows e mac, ma devo passare a java 6 per eseguire giochi come Minecraft sul mio computer. Questo funzionava bene prima che aggiornassi a Mac OS X 10.8.2 Build 12C60.

Prima di questo aggiornamento ero in grado di aprire le preferenze di Java e selezionare Java 6 o Java 7. Ma ora non mi sembra di essere in grado di trovare le Preferenze Java.

Sto usando OS X 10.8.2 (ultima versione).

Risposte (10)

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

Si può usare il meccanismo java_home in modo più conveniente.

Diciamo che avete Java 7 come default:

$ java -version
java version "1.7.0_15" 
…

Ora attiviamo Java 6:

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

Ed ecco fatto:

$ java -version
java version "1.6.0_41"
…

Ho aggiunto questi al mio .bashrc per rendere le cose ancora più comode:

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 riduce l'output di java_home -V ai soli numeri di versione. E java_use è solo una scorciatoia per quello che abbiamo fatto sopra. Per esempio java_use 1.6 passerà a Java 6.

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

Non credo sia possibile cambiare JRE (ambienti di runtime) vedi qui:

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

che afferma:

Può essere installato solo un JRE. L'installazione di un JRE rimuove il JRE precedentemente installato. La versione JRE usata dal sistema può essere determinata in uno dei due modi:

Workaround:

Ho avuto un problema simile al tuo con Minecraft con Wuala. Dove avevo bisogno di eseguire Wuala usando Java 1.6 mentre dovevo sviluppare con JDK 1.7 e ci sono riuscito aprendo il pacchetto Wuala.app e cambiando il suo script di avvio in:

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

da:

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 $*

Cioè semplicemente sostituendo: exec con: /usr/libexec/java_home -v 1.6.0 --exec

Questo è ovviamente piuttosto complicato e sarà rotto ogni volta che wuala si autoaggiorna, ma altrimenti funziona.

Per usare un altro JDK vedere qui:

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

che afferma:

Per eseguire una versione diversa di Java, specificare il percorso completo, o usare lo strumento java\home: /usr/libexec/java_home -v 1.7.0_06 --exec javac -version

Ecco un'illustrazione ed esempi dalla mia configurazione:

Oracle JDK installa:

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

Questo funziona per me anche per usare il JDK 1.6 fornito da 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)

Scegliere tra le versioni 1.7 Oracle:

Selezionare il primo JDK 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)

Selezionare il 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)

Il JDK di default è quello più 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)

Il default è il più alto “livello di patch quando si usa solo il numero di versione minore:

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 soluzione per cambiare facilmente il JDK (non sono sicuro di JRE), funziona con qualsiasi versione JDK, non solo 6 e 7 fonte ):

Bash shell , aggiungi questa funzione al tuo .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 , salva questa funzione come ~/.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 soluzione rapida è quella di creare un link simbolico al vecchio binario di Java 6:

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

Poi eseguire le applicazioni con: java6 -jar myapp.jar

3
3
3
2013-11-12 10:15:22 +0000

Ecco un modo semplice per passare java 6 e java 7 su mac osx.

passo 1 : scarica jdk 7 dal sito ufficiale di oracle http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html e installalo passo dopo passo seguendo i consigli.

passo 2: imposta $JAVA\HOME in .bash\file

$ 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

passo 3: se vuoi usare jdk 6, alterna $JAVA\HOME al percorso home di 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

È abbastanza semplice cambiare istantaneamente le versioni di Java su OS X senza dover cambiare la variabile $JAVA_HOME.

Sto usando la versione 10.8.2, e la mia variabile $JAVA\HOME punta a /Library/Java/Home

echo $JAVA_HOME

Questo percorso è un link simbolico, come si può vedere eseguendo il comando ls -l

ls -la /Library/Java

Il link simbolico predefinito punta a

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

Per reindirizzare java alla mia installazione 1.7, sostituisco semplicemente il vecchio link simbolico Home con un nuovo link simbolico che punta alla directory home della mia installazione Java 1.7.

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

E voilà! java -version mostra che ora sto usando java 1.7. Basta cambiare quale symlink è attualmente chiamato ‘Home’ per cambiare istantaneamente il JRE java di default.

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

Gestisci il tuo ambiente Java (su Mac e Linux): http://www.jenv.be/

Simile a RVM per Ruby e N per Node ma per Java.

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

L'applicazione delle preferenze Java sembra non elencare più Java 1.6. Tuttavia quando controllo la versione di java nella riga di comando ottengo:

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

Sulla base di quanto detto sopra e di un po’ di altre ricerche, ho ideato uno script che puoi “source” (o “dot”) nel tuo profilo. Ti chiederà un menu di JAVA\HOME disponibili sul tuo Mac, sebbene tu possa anche specificare la home di default, o preselezionare una scelta di menu.

Nella mia .bash_profile:

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

Nota che richiede una variabile PREJAVA_PATH. Puoi anche chiamarlo dalla linea di comando:

$ . gojava

O per pre-selezionare la seconda opzione:

$ . gojava -c 2

Il file gojava è:

#!/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 versione Fish shell della risposta di @alex (aggiungere 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