Làm cách nào để chuyển đổi giữa Java 7 và Java 6 trên OS X 10.8.2?


84

Tôi đang sử dụng Java SE 7 để lập trình các trò chơi đơn giản cho windows và mac, nhưng tôi phải chuyển sang java 6 để chạy các trò chơi như Minecraft trên máy tính của mình. Điều này được sử dụng để hoạt động tốt trước khi tôi cập nhật lên Mac OS X 10.8.2 Build 12C60.

Trước bản cập nhật này, tôi đã từng có thể mở Tùy chọn Java và kiểm tra Java 6 hoặc Java 7. Nhưng bây giờ tôi dường như không thể tìm thấy Tùy chọn Java.

Tôi đang chạy OS X 10.8.2 (phiên bản mới nhất).


3
Bạn đã đúng, các Tùy chọn Java hiện đã bị xóa với bản cập nhật cuối cùng. Một số phương pháp shell khác nhau mà tôi đã thử không hoạt động, nhưng phải có một số cơ chế để tạo điều kiện thuận lợi cho điều này khi bạn cũng đang chạy 7 cái gần đây nhất.
ylluminate

Câu trả lời:


41

Tôi không nghĩ có thể chuyển JRE (môi trường thời gian chạy) xem tại đây:

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

tiểu bang nào:

Chỉ có một JRE có thể được cài đặt. Cài đặt JRE sẽ loại bỏ JRE được cài đặt trước đó. Phiên bản JRE được sử dụng bởi hệ thống có thể được xác định theo một trong hai cách:

Cách giải quyết:

Tôi gặp vấn đề tương tự như bạn gặp phải với Minecraft với W mộng. Nơi tôi cần chạy W mộng bằng Java 1.6 trong khi tôi cần phát triển với JDK 1.7 và tôi đã quản lý điều này bằng cách mở gói W mộng.app và thay đổi tập lệnh khởi động của nó trong:

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

từ:

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

đến:

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

Tức là chỉ cần thay thế: execbằng:/usr/libexec/java_home -v 1.6.0 --exec

Điều này tất nhiên là có liên quan và sẽ bị phá vỡ mỗi khi wours autoupdates nhưng nếu không nó hoạt động.

Để sử dụng một JDK khác xem tại đây:

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

tiểu bang nào:

Để chạy một phiên bản Java khác, chỉ định đường dẫn đầy đủ hoặc sử dụng công cụ java_home: /usr/libexec/java_home -v 1.7.0_06 --exec javac -version

Đây là một minh họa và ví dụ từ thiết lập của tôi:

Cài đặt JDK của Oracle:

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 cung cấp 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 ./

Điều này cũng hiệu quả với tôi khi sử dụng 1.6 JDK do Apple cung cấp

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)

Chọn giữa 1.7 phiên bản Oracle:

Chọn Oracle JDK 1.7.0_04 đầu tiên

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)

Chọn 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 mặc định là mức cao nhất:

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)

Mặc định ở mức "bản vá" cao nhất khi chỉ sử dụng số phiên bản nhỏ:

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

Người ta có thể sử dụng java_homecơ chế thuận tiện hơn.

Giả sử bạn có Java 7 làm mặc định:

$ java -version
java version "1.7.0_15" 
…

Bây giờ hãy kích hoạt Java 6:

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

Và đó là:

$ java -version
java version "1.6.0_41"
…

Tôi đã thêm những .bashrcthứ này vào để làm cho mọi thứ trở nên thuận tiện hơn:

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_lsgiảm đầu ra của java_home -Vchỉ các số phiên bản. Và java_usechỉ là một lối tắt cho những gì chúng tôi đã làm ở trên. Ví dụ: java_use 1.6sẽ chuyển sang Java 6.


3
trong java_use, bạn nên xóa java trước đó khỏi $ PATH.
Eir Nym

@EirNym làm thế nào một người sẽ làm điều đó?
Malcolm

một cái gì đó tôi thấy hữu ích để xóa java trước đó khỏi $ PATH stackoverflow.com/a/370192/1503859
Nitin Mahesh

cập nhật java_use mà làm việc cho tôi: chức năng java_use () {xuất khẩu JAVA_HOME = $ (/ usr / libexec / JAVA_HOME -v $ 1) export PATH = echo $PATH | awk -v RS=: -v ORS=: '/Library\/Java\/JavaVirtualMachines/ {next} {print}'| sed 's/:$//' export PATH = $ JAVA_HOME / bin: $ PATH java -version}
Nitin Mahesh

35

Một giải pháp để dễ dàng chuyển đổi JDK (không chắc chắn về JRE) ( nguồn ):

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

(thêm chức năng trên vào của bạn .bash_profile)

Sử dụng:

$ setjdk 1.7

7

Cách giải quyết nhanh là tạo liên kết tượng trưng cho tệp nhị phân Java 6 cũ:

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

Sau đó chạy các ứng dụng với: java6 -jar myapp.jar


3

Ứng dụng tùy chọn Java dường như không liệt kê Java 1.6 nữa. Tuy nhiên khi tôi kiểm tra phiên bản java trong dòng lệnh tôi nhận được:

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

Thật đơn giản để chuyển đổi các phiên bản Java ngay lập tức trên OS X mà không cần thay đổi biến $ JAVA_HOME.

Tôi đang chạy 10.8.2 và biến $ JAVA_HOME của tôi trỏ tới / Library / Java / Home

echo $JAVA_HOME

Đường dẫn này là một liên kết tượng trưng, ​​có thể được nhìn thấy bằng cách chạy lệnh ls -l

ls -la /Library/Java

Liên kết tượng trưng mặc định trỏ đến

Trang chủ -> / Thư viện / Java / JavaVirtualMachines/1.6.0_33-b03-424.jdk/Contents/Home/

Để chuyển hướng java đến bản cài đặt 1.7 của tôi, tôi chỉ thay thế liên kết tượng trưng Home cũ bằng một liên kết tượng trưng mới trỏ đến thư mục chính của bản cài đặt Java 1.7.

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

Và Voila! java -version cho thấy tôi hiện đang chạy java 1.7. Chỉ cần chuyển đổi symlink nào hiện được đặt tên là 'Home' để thay đổi ngay lập tức JRE java mặc định.


3

Đây là một cách dễ dàng để chuyển đổi java 6 và java 7 trên mac osx.

Bước 1: tải xuống jdk 7 từ trang web chính thức của oracle http://www.oracle.com/technetwork/java/javase/doads/jdk7-doads-1880260.html và cài đặt từng bước theo các mẹo.

bước 2: đặt $ JAVA_HOME trong .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

Bước 3: nếu bạn muốn sử dụng jdk 6, chỉ cần thay thế $ JAVA_HOME cho đường dẫn về nhà 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

Dựa trên những điều trên và một chút nghiên cứu khác, tôi đã nghĩ ra một kịch bản mà bạn có thể "nguồn" (hoặc "chấm") vào hồ sơ của mình. Nó sẽ nhắc bạn với một menu gồm các JAVA_HOME có sẵn trên máy Mac của bạn, mặc dù bạn cũng có thể chỉ định nhà mặc định hoặc chọn trước một lựa chọn menu.

Trong tôi .bash_profile:

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

Lưu ý rằng nó đòi hỏi một biến PREJAVA_PATH. Bạn cũng có thể gọi nó từ dòng lệnh:

$ . gojava

Hoặc để chọn trước tùy chọn thứ hai:

$ . gojava -c 2

Tập tin gojavalà:

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

Phiên bản vỏ cá của câu trả lời @alex (thêm vào ~/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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.