Як перемикатися між Java 7 та Java 6 на OS X 10.8.2?


84

Я використовую Java SE 7 для програмування простих ігор для Windows і Mac, але мені потрібно перейти на java 6 для запуску таких ігор, як Minecraft на моєму комп’ютері. Це працювало чудово, перш ніж я оновлювався до Mac OS X 10.8.2 Build 12C60.

До цього оновлення я раніше міг відкривати налаштування Java та перевіряти Java 6 або Java 7. Але тепер я, здається, не зможу знайти налаштування Java.

У мене працює ОС X 10.8.2 (остання версія).


3
Ви маєте рацію, налаштування Java зараз видалено з останнім оновленням. Деякі різні методи оболонки, які я спробував, не працюють, але повинен бути механізм, який полегшить це, коли ви також працюєте з останніми 7.
іллюмінат

Відповіді:


41

Я не думаю, що можливо переключити JRE (середовища виконання) дивіться тут:

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

де зазначено:

Можна встановити лише один JRE. Встановлення JRE видаляє раніше встановлений JRE. Версія JRE, що використовується системою, може бути визначена одним із двох способів:

Обхід:

У мене була подібна проблема, як у вас з Minecraft з Wuala. Де мені потрібно було запустити Wuala за допомогою Java 1.6, тоді як мені потрібно було розробити JDK 1.7, і мені це вдалося, відкривши пакет Wuala.app та змінивши його сценарій запуску у:

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

від:

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

до:

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

Тобто проста заміна: execна:/usr/libexec/java_home -v 1.6.0 --exec

Це, звичайно, досить пов'язане, і воно буде порушене щоразу, коли автоавтомати Wuala, але в іншому випадку це працює.

Для використання іншого JDK дивіться тут:

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

де зазначено:

Щоб запустити іншу версію Java, або вкажіть повний шлях, або скористайтеся інструментом java_home: /usr/libexec/java_home -v 1.7.0_06 --exec javac -version

Ось ілюстрація та приклади з моєї настройки:

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 постачає 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 ./

Для мене це також допомагає використовувати Apple, поставлений 1.6 JDK, поставлений 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)

Виберіть між версіями 1.7 Oracle:

Вибір першого 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)

Вибір 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)

JDK за замовчуванням є найвищим:

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)

За замовчуванням до найвищого "рівня виправлення, коли використовується лише незначний номер версії:

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

Можна використовувати java_homeмеханізм зручніше.

Скажімо, у вас за замовчуванням у вас Java 7:

$ java -version
java version "1.7.0_15" 
…

Тепер активуємо Java 6:

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

І ось це:

$ java -version
java version "1.6.0_41"
…

Я додав їх до свого .bashrc, щоб зробити речі ще зручнішими:

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зменшує вихід java_home -Vдо лише номерів версій. І java_useце лише ярлик для того, що ми зробили вище. Наприклад java_use 1.6, перейде на Java 6.


3
у java_use слід видалити попередню java з $ PATH.
Ейр Нім

@EirNym як би це зробити?
Малькольм

щось, що мені здалося корисним для видалення попередньої Java з $ PATH stackoverflow.com/a/370192/1503859
Нітін Махеш,

оновлення java_use, яке працювало на мене: функція java_use () {експортування JAVA_HOME = $ (/ usr / libexec / java_home -v $ 1) експорт PATH = echo $PATH | awk -v RS=: -v ORS=: '/Library\/Java\/JavaVirtualMachines/ {next} {print}'| sed 's/:$//' експорт PATH = $ JAVA_HOME / bin: $ PATH java -version}
Нітін Махеш,

35

Рішення для легкої комутації JDK (не впевнений у JRE) ( джерело ):

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

(додайте вище функцію до свого .bash_profile)

Використання:

$ setjdk 1.7

7

Швидкий спосіб вирішити - створити посилання на старий двійковий код Java 6:

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

Потім запустіть програми за допомогою: java6 -jar myapp.jar


3

Здається, додаток Java налаштування вже не перераховує Java 1.6. Однак, коли я перевіряю версію Java в командному рядку, я отримую:

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

Досить просто миттєво перемикати версії Java на OS X, не змінюючи змінну $ JAVA_HOME.

У мене працює 10.8.2, і моя змінна $ JAVA_HOME вказує на / Бібліотека / Java / Головна

echo $JAVA_HOME

Цей шлях є символічним посиланням, як видно за допомогою команди ls -l

ls -la /Library/Java

Символічне посилання за замовчуванням вказує на

Головна -> /Library/Java/JavaVirtualMachines/1.6.0_33-b03-424.jdk/Contents/Home/

Щоб перенаправити Java на мою установку 1.7, я просто замінюю стару домашню символьну посилання новою символьною посиланням, що вказує на домашній каталог моєї установки Java 1.7.

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

І вуаля! java -версія показує, що я зараз запускаю java 1.7. Просто перемкніть, яке символьне посилання в даний час називається "Головна", щоб миттєво змінити стандартну версію Java JRE.


3

Ось простий спосіб переключити java 6 і java 7 на mac osx.

крок 1: завантажте jdk 7 з офіційного веб-сайту oracle http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html та встановіть його поетапно, дотримуйтесь порад.

крок 2: встановіть $ JAVA_HOME у .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

крок 3: якщо ви хочете використовувати jdk 6, просто альтернативно $ JAVA_HOME до домашнього шляху 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

Виходячи з вищезазначеного та трохи інших досліджень, я розробив сценарій, який ви можете "джерелом" (або "крапкою") у свій профіль. Він підкаже вам меню доступних файлів JAVA_HOME на вашому Mac, хоча ви також можете вказати домашнє меню за замовчуванням або попередньо вибрати вибір меню.

У моєму .bash_profile:

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

Зверніть увагу, що для цього потрібна змінна PREJAVA_PATH. Ви також можете викликати його з командного рядка:

$ . gojava

Або попередньо вибрати другий варіант:

$ . gojava -c 2

Файл 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/[^\/]*\(\/.*\)/\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

Версія для рибної оболонки відповіді @alex (додати ~/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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.