How do I switch between Java 7 and Java 6 on OS X 10.8.2?
Solution 1
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)
Solution 2
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.
Solution 3
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
Solution 4
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
Solution 5
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.
Related videos on Youtube
Comments
-
Nikita Jerschow over 1 year
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).
-
ylluminate over 11 yearsYou 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.
-
-
Eir Nym over 10 yearsin java_use you should remove previous java from $PATH.
-
Malcolm about 9 years@EirNym how would one do that?
-
Nitin Mahesh almost 9 yearssomething i found useful for removing previous java from $PATH stackoverflow.com/a/370192/1503859
-
Nitin Mahesh almost 9 yearsupdate 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 }