ฉันจะสลับระหว่าง 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

ฉันใช้ OS X 10.8.2 (เวอร์ชั่นล่าสุด)


3
คุณถูกต้องการตั้งค่า Java จะถูกลบด้วยการอัพเดทล่าสุด วิธีการเชลล์ที่หลากหลายที่ฉันได้ลองใช้นั้นไม่ได้ผล แต่ต้องมีกลไกบางอย่างที่จะช่วยให้สิ่งนี้ง่ายขึ้นเมื่อคุณใช้ 7 เวอร์ชันล่าสุดเช่นกัน
ylluminate

คำตอบ:


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

นี่เป็นหลักสูตรที่ค่อนข้างจะมีส่วนเกี่ยวข้องและจะถูกทำลายทุกครั้งที่มีการอัปเดตอัตโนมัติ

วิธีใช้ 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

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
Eir Nym

@EirNym จะทำเช่นนั้นได้อย่างไร
Malcolm

สิ่งที่ฉันพบมีประโยชน์สำหรับการลบจาวาก่อนหน้าจาก $ PATH stackoverflow.com/a/370192/1503859
Nitin Mahesh

อัปเดต java_use ที่ใช้งานได้กับฉัน: ฟังก์ชั่น java_use () {export JAVA_HOME = $ (/ usr / libexec / java_home -v $ 1) ส่งออก PATH = echo $PATH | awk -v RS=: -v ORS=: '/Library\/Java\/JavaVirtualMachines/ {next} {print}'| sed 's/:$//' PATH PATH = $ JAVA_HOME / bin: $ PATH java -version}
Nitin Mahesh

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

วิธีแก้ปัญหาอย่างรวดเร็วคือการสร้าง symlink ไปยังไบนารี 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 -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 ของฉันชี้ไปที่ / Library / Java / Home

echo $JAVA_HOME

พา ธ นี้เป็นลิงก์สัญลักษณ์ที่สามารถเห็นได้โดยการรันคำสั่ง ls -l

ls -la /Library/Java

ลิงก์สัญลักษณ์เริ่มต้นชี้ไปที่

หน้าแรก -> / ห้องสมุด / Java/JavaVirtualMachines/1.6.0_33-b03-424.jdk/Contents/Home/

ในการเปลี่ยนเส้นทาง java ไปยังการติดตั้ง 1.7 ของฉันฉันเพียงแทนที่ symlink ในบ้านเก่าด้วย symlink ใหม่ที่ชี้ไปยังไดเรกทอรีหลักของการติดตั้ง Java 1.7 ของฉัน

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

และ voila! java -version แสดงว่าฉันกำลังรัน java 1.7 อยู่ เพียงสลับ symlink ที่ชื่อปัจจุบันเป็น 'หน้าแรก' เพื่อเปลี่ยนจาวา 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

รุ่น Fish shell ของคำตอบ @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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.