84

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

1
  • 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, 2012 at 20:50

10 Answers 10

41

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

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

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:

Workaround:

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:

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

from:

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

to:

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

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

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)
0
99

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.

4
  • 3
    in java_use you should remove previous java from $PATH.
    – Eir Nym
    Feb 20, 2014 at 13:42
  • @EirNym how would one do that?
    – Malcolm
    May 11, 2015 at 21:44
  • something i found useful for removing previous java from $PATH stackoverflow.com/a/370192/1503859 Jul 27, 2015 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 } Jul 27, 2015 at 7:10
35

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  
   fi
   unset JAVA_HOME # We need this on Big Sur, see https://developer.apple.com/forums/thread/666681
   export JAVA_HOME=`/usr/libexec/java_home -v $@`  
   export PATH=$JAVA_HOME/bin:$PATH  
   echo JAVA_HOME set to $JAVA_HOME  
   java -version  
  fi
 }  
 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 -g -x PATH (string match -v /System/Library/Frameworks/JavaVM.framework/Home/bin $PATH)
    if [ -n "$JAVA_HOME" ]
      set -g -x PATH (string match -v $JAVA_HOME $PATH)
    end
    set -e JAVA_HOME # We need this on Big Sur, see https://developer.apple.com/forums/thread/666681
    set -g -x JAVA_HOME (/usr/libexec/java_home -v $argv)
    set -g -x PATH $JAVA_HOME/bin $PATH
    echo JAVA_HOME set to $JAVA_HOME
    java -version
  end
end

Usage:

$ setjdk 1.7
7

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

3

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

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

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

3

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
/Library/Java/JavaVirtualMachines/1.7.0.jdk/Contents/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
/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
3

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

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

2

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"
export PATH="${PREJAVA_PATH}"
. 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:

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

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
end

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .