Jak przełączać się między Javą 7 a Javą 6 w systemie OS X 10.8.2?


84

Używam Java SE 7 do programowania prostych gier dla systemu Windows i Mac, ale muszę przełączyć się na Javę 6, aby uruchomić na komputerze gry takie jak Minecraft. To działało dobrze, zanim zaktualizowałem system Mac OS X 10.8.2 Build 12C60.

Przed tą aktualizacją mogłem otwierać Preferencje Java i sprawdzać Java 6 lub Java 7. Ale teraz nie wydaje mi się, że mogę znaleźć Preferencje Java.

Używam OS X 10.8.2 (najnowsza wersja).


3
Masz rację, Preferencje Java są teraz usuwane przy ostatniej aktualizacji. Niektóre różne metody powłoki, które wypróbowałem, nie działają, ale musi istnieć jakiś mechanizm, który to ułatwi, gdy uruchomisz również najnowszą 7.
iluminuj

Odpowiedzi:


41

Nie sądzę, aby można było zmienić JRE (środowiska wykonawcze), patrz tutaj:

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

który stwierdza:

Można zainstalować tylko jedno środowisko JRE. Zainstalowanie środowiska JRE usuwa wcześniej zainstalowane środowisko JRE. Wersję JRE używaną przez system można ustalić na jeden z dwóch sposobów:

Obejście:

Miałem podobny problem jak ty z Minecraft z Wuala. Tam, gdzie musiałem uruchomić Wuala przy użyciu Java 1.6, podczas gdy musiałem rozwijać się z JDK 1.7 i udało mi się to, otwierając pakiet Wuala.app i zmieniając jego skrypt startowy w:

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

od:

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

do:

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

To znaczy po prostu zastępując exec:/usr/libexec/java_home -v 1.6.0 --exec

Jest to oczywiście dość zaangażowane i zostanie zerwane za każdym razem, gdy wuala autoupdates, ale w przeciwnym razie działa.

Aby użyć innego JDK, zobacz tutaj:

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

który stwierdza:

Aby uruchomić inną wersję Java, podaj pełną ścieżkę lub użyj narzędzia java_home: /usr/libexec/java_home -v 1.7.0_06 --exec javac -version

Oto ilustracja i przykłady z mojej konfiguracji:

Oracle JDK instaluje:

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

Firma Apple dostarczyła 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 ./

Działa to również w przypadku korzystania z dostarczonego przez Apple 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)

Wybierz spośród wersji Oracle 1.7:

Wybór pierwszego 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)

Wybór 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)

Domyślny JDK jest najwyższy:

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)

Domyślnie ustawiony jest najwyższy „poziom łaty, gdy używany jest tylko niewielki numer wersji:

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

Z java_homemechanizmu można wygodniej korzystać.

Załóżmy, że masz Java 7 jako domyślną:

$ java -version
java version "1.7.0_15" 
…

Teraz aktywujmy Javę 6:

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

I oto jest:

$ java -version
java version "1.6.0_41"
…

Dodałem je do mojego .bashrc, aby wszystko było jeszcze wygodniejsze:

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_lszmniejsza wydajność java_home -Vdo tylko numerów wersji. I java_useto tylko skrót do tego, co zrobiliśmy powyżej. Np. java_use 1.6Przejdzie na Javę 6.


3
w java_use powinieneś usunąć poprzednią java z $ PATH.
Eir Nym

@ EirNym jak by to zrobić?
Malcolm

coś, co uważam za przydatne do usunięcia poprzedniej Java z $ PATH stackoverflow.com/a/370192/1503859
Nitin Mahesh

aktualizacja java_use, która zadziałała dla mnie: funkcja java_use () {eksport JAVA_HOME = $ (/ usr / libexec / java_home -v $ 1) eksport ŚCIEŻKA = echo $PATH | awk -v RS=: -v ORS=: '/Library\/Java\/JavaVirtualMachines/ {next} {print}'| sed 's/:$//' eksport ŚCIEŻKA = $ JAVA_HOME / bin: $ PATH java -version}
Nitin Mahesh

35

Rozwiązanie do łatwego przełączania JDK (nie jestem pewien JRE) ( źródło ):

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

(dodaj powyższą funkcję do swojego .bash_profile)

Stosowanie:

$ setjdk 1.7

7

Szybkim obejściem jest utworzenie dowiązania symbolicznego do starego pliku binarnego Java 6:

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

Następnie uruchom aplikacje za pomocą: java6 -jar myapp.jar


3

Wydaje się, że aplikacja preferencji Java nie wyświetla już listy Java 1.6. Jednak gdy sprawdzę wersję Java w wierszu polecenia, otrzymuję:

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

Przełączanie wersji Java na OS X jest bardzo proste bez potrzeby zmiany zmiennej $ JAVA_HOME.

Korzystam z wersji 10.8.2, a moja zmienna $ JAVA_HOME wskazuje na / Library / Java / Home

echo $JAVA_HOME

Ta ścieżka jest dowiązaniem symbolicznym, co można zobaczyć po uruchomieniu polecenia ls -l

ls -la /Library/Java

Domyślne łącze symboliczne wskazuje na

Strona główna -> /Biblioteka/Java/JavaVirtualMachines/1.6.0_33-b03-424.jdk/Contents/Home/

Aby przekierować Javę do mojej instalacji 1.7, po prostu zastępuję stary symboliczny link główny nowym linkiem symbolicznym wskazującym katalog główny mojej instalacji Java 1.7.

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

I voila! java -version pokazuje, że teraz korzystam z java 1.7. Wystarczy zmienić, który dowiązanie symboliczne nazywa się obecnie „Strona główna”, aby natychmiast zmienić domyślną wersję JRE Java.


3

Oto prosty sposób na zmianę Java 6 i Java 7 na Mac OSX.

krok 1: pobierz jdk 7 z oficjalnej strony oracle http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html i zainstaluj go krok po kroku, postępując zgodnie ze wskazówkami.

krok 2: ustaw $ JAVA_HOME w .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

krok 3: jeśli chcesz użyć jdk 6, po prostu alternatywną $ JAVA_HOME do ścieżki domowej 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

W oparciu o powyższe i trochę innych badań, opracowałem skrypt, który możesz „źródło” (lub „kropka”) do swojego profilu. Pojawi się monit z menu dostępnych JAVA_HOME na komputerze Mac, choć możesz także określić domyślny katalog główny lub wstępnie wybrać opcję menu.

W moim .bash_profile:

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

Uwaga: wymaga zmiennej PREJAVA_PATH. Możesz także wywołać go z wiersza poleceń:

$ . gojava

Lub, aby wstępnie wybrać drugą opcję:

$ . gojava -c 2

Plik gojavajest:

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

Wersja @alex odpowiedzi powłoki ryby (dodaj do ~/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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.