Switching between multiple JDKs on a Mac

java, java 10, java 11, java 8, java 9, technology

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.
Switching JDKs at Terminal

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:

  1. 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.
  2. 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.
  3. Type in the appropriate alias and verify that the build/patch is what shows.
  4. 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/<Selected_JDK>
      • export PATH=$JAVA_HOME/bin:$PATH

That’s a wrap on Switching JDKs on a Mac. Hope this post was helpful.

4 thoughts on “Switching between multiple JDKs on a Mac

  1. I had to modify those 4 lines to make them work on my Mac. I have “Xamarin Workbooks” app in the path, and not wrapping export PATH in double quotes causes that path setting to fail.

    alias jdk8=’export JAVA_HOME=`/usr/libexec/java_home -v 1.8` && export PATH=”$PATH:$JAVA_HOME/bin”; java -version’
    alias jdk9=’export JAVA_HOME=`/usr/libexec/java_home -v 9` && export PATH=”$PATH:$JAVA_HOME/bin”; java -version’
    alias jdk10=’export JAVA_HOME=`/usr/libexec/java_home -v 10` && export PATH=”$PATH:$JAVA_HOME/bin”; java -version’
    alias jdk11=’export JAVA_HOME=`/usr/libexec/java_home -v 11` && export PATH=”$PATH:$JAVA_HOME/bin”; java -version’

    Liked by 1 person

  2. WordPress dashed my previous comment. Anyway: I use this. I don’t think you need to re-establish the path, which kind of looks the same. Agreed that it does make life super easy

    alias export_java_8=”export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)”
    alias export_java_9=”export JAVA_HOME=$(/usr/libexec/java_home -v 9)”
    alias export_java_10=”export JAVA_HOME=$(/usr/libexec/java_home -v 10)”

    Liked by 2 people

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )


Connecting to %s