Wie wechsle ich unter OS X 10.8.2 zwischen Java 7 und Java 6?


84

Ich verwende Java SE 7, um einfache Spiele für Windows und Mac zu programmieren, aber ich muss zu Java 6 wechseln, um Spiele wie Minecraft auf meinem Computer auszuführen. Früher hat das einwandfrei funktioniert, bevor ich auf Mac OS X 10.8.2 Build 12C60 aktualisiert habe.

Vor diesem Update konnte ich Java Preferences öffnen und Java 6 oder Java 7 abhaken. Jetzt kann ich Java Preferences anscheinend nicht finden.

Ich verwende OS X 10.8.2 (neueste Version).


3
Sie sind richtig, die Java-Einstellungen werden jetzt mit dem letzten Update entfernt. Einige der verschiedenen Shell-Methoden, die ich ausprobiert habe, funktionieren nicht, aber es muss einen Mechanismus geben, der dies erleichtert, wenn Sie auch die neuesten 7 ausführen.
ylluminate

Antworten:


41

Ich glaube nicht, dass es möglich ist, JRE (Laufzeitumgebungen) zu wechseln, siehe hier:

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

welche Staaten:

Es kann nur eine JRE installiert werden. Durch das Installieren einer JRE wird die zuvor installierte JRE entfernt. Die vom System verwendete JRE-Version kann auf zwei Arten ermittelt werden:

Problemumgehung:

Ich hatte ein ähnliches Problem wie du mit Minecraft mit Wuala. Wo ich Wuala mit Java 1.6 ausführen musste, während ich mit JDK 1.7 entwickeln musste, und dies gelang mir, indem ich das Wuala.app-Paket öffnete und sein Startskript änderte in:

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

von:

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

zu:

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

Dh einfach ersetzen execdurch:/usr/libexec/java_home -v 1.6.0 --exec

Das ist natürlich ziemlich kompliziert und wird jedes Mal kaputt gehen, wenn wuala autoupdates, aber sonst funktioniert es.

Um ein anderes JDK zu verwenden, siehe hier:

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

welche Staaten:

Um eine andere Java-Version auszuführen, geben Sie entweder den vollständigen Pfad an oder verwenden Sie das Tool java_home: /usr/libexec/java_home -v 1.7.0_06 --exec javac -version

Hier ist eine Illustration und Beispiele aus meinem Setup:

Oracle JDK installiert:

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

Das funktioniert bei mir auch mit dem von Apple mitgelieferten 1.6 JDK

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)

Wählen Sie zwischen den 1.7 Oracle Versionen:

Auswahl des ersten 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)

Auswahl von 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)

Das Standard-JDK ist das höchste:

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)

Standardmäßig wird die höchste Patch-Stufe verwendet, wenn nur eine Nebenversionsnummer verwendet wird:

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

Man kann den java_homeMechanismus bequemer verwenden.

Angenommen, Sie haben Java 7 als Standard:

$ java -version
java version "1.7.0_15" 
…

Jetzt aktivieren wir Java 6:

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

Und da ist es:

$ java -version
java version "1.6.0_41"
…

Ich habe diese hinzugefügt, .bashrcum die Dinge noch komfortabler zu machen:

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_lsreduziert die Ausgabe java_home -Vauf nur die Versionsnummern. Und java_useist nur eine Abkürzung für das, was wir oben gemacht haben. ZB java_use 1.6wird auf Java 6 umgestellt.


3
in java_use solltest du vorheriges java aus $ PATH entfernen.
Eir Nym

@EirNym wie würde man das machen?
Malcolm,

Etwas, das ich nützlich fand, um vorherigen Java von $ PATH zu entfernen stackoverflow.com/a/370192/1503859
Nitin Mahesh

update java_use das hat bei mir funktioniert: function java_use () {exportiere JAVA_HOME = $ (/ usr / libexec / java_home -v $ 1) exportiere PATH = echo $PATH | awk -v RS=: -v ORS=: '/Library\/Java\/JavaVirtualMachines/ {next} {print}'| sed 's/:$//' exportiere PATH = $ JAVA_HOME / bin: $ PATH java -version}
Nitin Mahesh

35

Eine Lösung zum einfachen Wechseln des JDK (nicht sicher, was JRE betrifft) ( Quelle ):

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:?;;")  
 }

(obige Funktion zu Ihrer hinzufügen .bash_profile)

Verwendungszweck:

$ setjdk 1.7

7

Eine schnelle Problemumgehung besteht darin, einen Symlink zur alten Java 6-Binärdatei zu erstellen:

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

Dann starte die Apps mit: java6 -jar myapp.jar


3

Die Java Preferences App scheint Java 1.6 nicht mehr aufzulisten. Wenn ich jedoch die Java-Version in der Befehlszeile überprüfe, erhalte ich:

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 ist ziemlich einfach, Java-Versionen sofort unter OS X zu wechseln, ohne die Variable $ JAVA_HOME ändern zu müssen.

Ich führe 10.8.2 aus und meine Variable $ JAVA_HOME zeigt auf / Library / Java / Home

echo $JAVA_HOME

Dieser Pfad ist eine symbolische Verknüpfung, wie Sie durch Ausführen des Befehls ls -l sehen können

ls -la /Library/Java

Der standardmäßige symbolische Link zeigt auf

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

Um Java auf meine 1.7-Installation umzuleiten, ersetze ich lediglich den alten Home-Symlink durch einen neuen Symlink, der auf das Home-Verzeichnis meiner Java 1.7-Installation verweist.

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

Und voila! Java-Version zeigt, dass ich jetzt Java 1.7 ausführen. Wechseln Sie einfach, welcher Symlink aktuell "Home" heißt, um die Standard-Java-JRE sofort zu ändern.


3

Hier ist eine einfache Möglichkeit, Java 6 und Java 7 unter Mac OSX zu wechseln.

Schritt 1: Laden Sie JDK 7 von der offiziellen Oracle-Website http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html herunter und installieren Sie es Schritt für Schritt. Befolgen Sie die Tipps.

Schritt 2: Setze $ JAVA_HOME in .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

Schritt 3: Wenn Sie JDK 6 verwenden möchten, können Sie einfach $ JAVA_HOME als Alternative zu JDK 6 als Ausgangspfad verwenden

$ 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

Auf der Grundlage der obigen und einiger anderer Untersuchungen habe ich ein Skript entwickelt, das Sie in Ihr Profil "einfügen" (oder "punktieren") können. Sie werden aufgefordert, ein Menü mit verfügbaren JAVA_HOMEs auf Ihrem Mac anzuzeigen. Sie können jedoch auch die Standardstartseite angeben oder eine Menüoption vorab auswählen.

In meinem .bash_profile:

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

Beachten Sie, dass eine Variable erforderlich ist PREJAVA_PATH. Sie können es auch über die Befehlszeile aufrufen:

$ . gojava

Oder wählen Sie die zweite Option aus:

$ . gojava -c 2

Datei gojavaist:

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

Die Fish Shell-Version von @alex antwortet (add to ~/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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.