I am using Java SE 7 to program simple games for windows and mac, but I have to switch to java 6 to run games such as Minecraft on my computer. This used to work just fine before I updated to Mac OS X 10.8.2 Build 12C60.

Before this update I used to be able to open Java Preferences and check off Java 6 or Java 7. But now I don't seem to be able to find Java Preferences.

I am running OS X 10.8.2 (latest version).

  • 3
    You are correct, the Java Preferences is now removed with the last update. Some various shell methods I've tried are not working out, but there must be some mechanism to facilitate this when you're running the most recent 7 as well. – ylluminate Oct 21 '12 at 20:50

10 Answers 10


I don't think it's possible to switch JRE (runtime environments) see here:


which states:

Only one JRE can be installed. Installing a JRE removes the previously installed JRE. The JRE version used by the system can be determined in one of two ways:


I had a similar problem like you have with Minecraft with Wuala. Where I needed to run Wuala using Java 1.6 whilst I needed to develop with JDK 1.7 and I managed this by opening the Wuala.app package and changing its startup script in:



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

I.e simply replacing: exec with: /usr/libexec/java_home -v 1.6.0 --exec

This is of course rather involved and will get broken every time wuala autoupdates but otherwise it works.

To use another JDK see here:


which states:

To run a different version of Java, either specify the full path, or use the java_home tool: /usr/libexec/java_home -v 1.7.0_06 --exec javac -version

Here is an illustration and examples from my setup:

Oracle JDK installs:

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

This works for me also to use the Apple supplied 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)

Choose between the 1.7 Oracle versions:

Selecting the first 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)

Selecting 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)

The default JDK is the highest one:

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)

Defaults to the highest "patch level when using only minor version number:

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)
| improve this answer | |

One can use the java_home mechanism more conveniently.

Say you have Java 7 as the default:

$ java -version
java version "1.7.0_15" 

Now let’s activate Java 6:

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

And there it is:

$ java -version
java version "1.6.0_41"

I added these to my .bashrc in order to make things even more convenient:

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 reduces the output of java_home -V to just the version numbers. And java_use is just a shortcut for what we did above. E.g. java_use 1.6 will switch to Java 6.

| improve this answer | |
  • 3
    in java_use you should remove previous java from $PATH. – Eir Nym Feb 20 '14 at 13:42
  • @EirNym how would one do that? – Malcolm May 11 '15 at 21:44
  • something i found useful for removing previous java from $PATH stackoverflow.com/a/370192/1503859 – Nitin Mahesh Jul 27 '15 at 6:52
  • update java_use that worked for me: function java_use() { export 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 Jul 27 '15 at 7:10

A solution for easily switching the JDK (not sure about JRE), works with any JDK version, not just 6 and 7 (source):

Bash shell, add this function to your .bash_profile:

function setjdk() {  
  if [ $# -ne 0 ]; then  
   removeFromPath '/System/Library/Frameworks/JavaVM.framework/Home/bin'  
   if [ -n "${JAVA_HOME+x}" ]; then  
    removeFromPath $JAVA_HOME  
   export JAVA_HOME=`/usr/libexec/java_home -v $@`  
   export PATH=$JAVA_HOME/bin:$PATH  
   echo JAVA_HOME set to $JAVA_HOME  
   java -version  
 function removeFromPath() {  
  export PATH=$(echo $PATH | sed -E -e "s;:$1;;" -e "s;$1:?;;")  

Fish shell, save this function as ~/.config/fish/functions/setjdk.fish:

function setjdk
  if [ (count $argv) -ne 0 ]
    set -x PATH (string match -v /System/Library/Frameworks/JavaVM.framework/Home/bin $PATH)
    if [ -n "$JAVA_HOME" ]
      set -x PATH (string match -v $JAVA_HOME $PATH)
    set -x JAVA_HOME (/usr/libexec/java_home -v $argv)
    set -x PATH $JAVA_HOME/bin $PATH
    echo JAVA_HOME set to $JAVA_HOME
    java -version


$ setjdk 1.7
| improve this answer | |

A quick workaround is to create a symlink to the old Java 6 binary:

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

Then run the apps with: java6 -jar myapp.jar

| improve this answer | |

The Java preferences app doesn't seem to list Java 1.6 anymore. However when I check java version in the command line I get:

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)
| improve this answer | |

It's pretty simple to switch Java versions instantly on OS X without needing to change the $JAVA_HOME variable.

I am running 10.8.2, and my $JAVA_HOME variable points to /Library/Java/Home


This path is a symbolic link, as can be seen by running ls -l command

ls -la /Library/Java

The default symbolic link points to

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

To redirect java to my 1.7 installation, I merely replace the old Home symlink with a new symlink pointing to the home directory of my Java 1.7 installation.

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

And voila! java -version shows that I am now running java 1.7. Just switch which symlink is currently named 'Home' to instantly change the default java JRE.

| improve this answer | |

Here is a easy way to switch java 6 and java 7 on mac osx.

step 1 : download jdk 7 from oracle official website http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html and install it step by step follow the tips.

step 2: set $JAVA_HOME in .bash_profile

$ vim .bash_profile 

export JAVA_HOME=$(/usr/libexec/java_home)

$ source .bash_profile

$ echo $JAVA_HOME

step 3: if you want to use jdk 6, just alternative $JAVA_HOME to jdk 6 home path

$ vim .bash_profile 

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

$ source .bash_profile

$ echo $JAVA_HOME
| improve this answer | |

Manage your Java Environment (on Mac and Linux): http://www.jenv.be/

Similar to RVM for Ruby and N for Node but for Java.

| improve this answer | |

Based on the above and a bit of other research, I've devised a script you can "source" (or "dot") into your profile. It'll prompt you with a menu of available JAVA_HOMEs on your Mac, though you can also specify the default home, or pre-select a menu choice.

In my .bash_profile:

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

Note it requires a variable PREJAVA_PATH. You can also call it from the command line:

$ . gojava

Or to pre-choose the second option:

$ . gojava -c 2

File gojava is:



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.


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

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

while getopts "dc:" name; do
 case $name in
      d) _default=1 ;;
      c) _choice="$OPTARG" ;;
      *) echo "unknown parameter $name"

if [ $_default -eq 1 ]; then
  setHomePath "$_defaultHome"
  while read -r line; do
    homeList[$i]=$(echo $line | sed 's/[^\/]*\(\/.*\)/\1/')
  done < <($_exe -V 2>&1 | egrep -v '^$|^\/|^Matching')

  if [ $_choice -gt 0 -a $_choice -lt $i ]; then
    setHomePath "${homeList[$_choice]}"
    printf "\nList of available Java versions:\n"
    select choice in "${choiceList[@]}"; do
      if [ $REPLY -gt 0 -a $REPLY -lt $i ]; then
        setHomePath "${homeList[$REPLY]}"
| improve this answer | |

The Fish shell version of @alex answer (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
| improve this answer | |

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.