Blog post date: 2018-May-18
Relevant versions of Java: Java 1.7, 8, 9, 10, 11
We often work with different versions of Java. There are times when we would like to test our application/program against different JDKs. Or … we just love to collect all versions of Java released just to show off.
Either of these would mean some kind of control of the JAVA_HOME and the PATH environment variables.
Many developers have successfully overcome this with innovative scripts to quickly switch Java versions. I am one such developer and below is an explanation of my setup.
Current installations of JDK on my Mac:
- JDK 1.7.0_80
- JDK 1.8.0_172
- JDK 9.0.4
- JDK 10.0.1
- JDK 11-ea+14
How does one determine the current installations of JDK?
On your Mac terminal run the command:
/usr/libexec/java_home -verbose
Sample output:
Matching Java Virtual Machines (5):
11, x86_64: "OpenJDK 11-ea" /Library/Java/JavaVirtualMachines/jdk-11.jdk/Contents/Home
10.0.1, x86_64: "OpenJDK 10.0.1" /Library/Java/JavaVirtualMachines/jdk-10.0.1.jdk/Contents/Home
9.0.4, x86_64: "OpenJDK 9.0.4" /Library/Java/JavaVirtualMachines/jdk-9.0.4.jdk/Contents/Home
1.8.0_172, x86_64: "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_172.jdk/Contents/Home
1.7.0_80, x86_64: "Java SE 7" /Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home
Simple ! Quite easy to determine the current JDKs available.
How can I switch Java versions easily?
Aliases. That’s it. If you know this, you can skip the remaining part of this blog. What is really cool is how a single JVM exec command can be used to switch JDK versions.
Sharing an excerpt from a .bash_profile:
alias jdk11="export JAVA_HOME=`/usr/libexec/java_home -v 11` && export PATH=$JAVA_HOME/bin:$PATH; java -version"
alias jdk10="export JAVA_HOME=`/usr/libexec/java_home -v 10` && export PATH=$JAVA_HOME/bin:$PATH; java -version"
alias jdk9="export JAVA_HOME=`/usr/libexec/java_home -v 9` && export PATH=$JAVA_HOME/bin:$PATH; java -version"
alias jdk8="export JAVA_HOME=`/usr/libexec/java_home -v 1.8` && export PATH=$JAVA_HOME/bin:$PATH; java -version"
alias jdk7="export JAVA_HOME=`/usr/libexec/java_home -v 1.7` && export PATH=$JAVA_HOME/bin:$PATH; java -version"
Note how the Java versioning from 9 onwards is a full digit? The same applies with the default directory names of the installed JDKs. This was a deliberate change toshake off the 1.x naming style of prior versions of Java.
JDK switching output
A picture would do this more justice.
Maintenance of JDKs
Needs Admin rights on the Mac !
Keeping the JDK versions up-to-date is in everyone’s best interest, both for the new features as well as any security patches. A few steps that can help with maintaining:
-
- Extract the latest build/patch of the JDK into the directory:
/Library/Java/JavaVirtualMachines
.- If an installer was used, most likely the directories are created.
- If a tarball was extracted from, make sure to move the extracted directory under the parent mentioned above.
- Extract the latest build/patch of the JDK into the directory:
-
- Post-installation, open a new terminal shell (current shell will not pick up the latest patch of an existing version of the JDK).
- Add the appropriate alias, if this is a new version of Java
- If existing version being patched, then no further action is needed.
- Post-installation, open a new terminal shell (current shell will not pick up the latest patch of an existing version of the JDK).
-
- Type in the appropriate alias and verify that the build/patch is what shows.
- Once verified, the options for removing the prior patch present themselves:
- delete older build/patch since it is no longer useful to reclaim space.
- retain older build/patch, for other usage. It is possible to manually switch to this build/patch:
export JAVA_HOME=/Library/Java/JavaVirtualMachines/
export PATH=$JAVA_HOME/bin:$PATH
That’s a wrap on Switching JDKs on a Mac. Hope this post was helpful.