How do I install Java on Mac OSX allowing version switching?

I want to install OpenJDK Java on Mac OSX and have it work alongside other JDK's since it is a newer release. Currently, I downloaded the tar.gz and placed it in my path but that is hard to maintain. The only other install I found that do more things automatically is the install via Homebrew cask. It looks like only the current version too:

brew cask info java 
java: 13,33:5b8a42f3905b406298b72d750b6919f6
https://openjdk.java.net/
So I can install it from there, but then what? Am I stuck only with the new version? Jayson Minard asked Sep 26, 2018 at 18:32 Jayson Minard Jayson Minard 85.6k 38 38 gold badges 191 191 silver badges 231 231 bronze badges

Just asking, can we keep the question tags restricted to a single version? Since there is no such version-specific installation script/steps anyway. This is a general(non-version specific) question and can suffice to be tagged with only java-11, since I assume that is the place where people would start looking out for what the question and answer suggests.

Commented Nov 15, 2018 at 15:20

Scripts in the answers do include specific versions even though it is easy to interpret them for other versions. But, it is also part of what community members search for, so it is good to help them find the correct answers quickly by helping to bring attention to updated and modern answers and differentiate from old outdated version 6 and version 8 topics. Having the latest stable version and latest new version I think are reasonable tags to keep.

Commented Mar 20, 2019 at 13:11 I would probably recommend to use jenv to manage multiple Java versions. Commented Apr 26, 2020 at 21:40

11 Answers 11

Note: These solutions work for various versions of Java including Java 8 through Java 21 (the LTS version). This includes alternative JDK's from OpenJDK, Oracle, IBM, Azul, Amazon Correto, Graal and more.

You have a few options for how to do the installation as well as manage JDK switching. Installation can be done by Homebrew, SDKMAN, asdf, or a manual install. Switching can be done by SDKMAN, asdf, or manually by setting JAVA_HOME . All of these are described below.

TL;DR - Preferred Methods of Installation

You can install Java using whatever method you prefer including SDKMAN, asdf, Homebrew, or a manual install of the tar.gz file. The advantage of a manual install is that the location of the JDK can be placed in a standardized location for Mac OSX.

However, there are easier options such as SDKMAN and asdf that also will install other important and common tools for the JVM. These two primary options are described here.

Installing and Switching versions with SDKMAN

SDKMAN is a bit different and handles both the install and the switching. SDKMAN also places the installed JDK's into its own directory tree, which is typically ~/.sdkman/candidates/java . SDKMAN allows setting a global default version, and a version specific to the current shell.

  1. Install SDKMAN from https://sdkman.io/install
  2. List the Java versions available to make sure you know the version ID

sdk list java 
sdk install java 21-open 
Or java 19:
sdk install java 19.0.2-open 
sdk default java 17-open 
Or switch to 17 for the current terminal session:
sdk use java 17-open 

When you list available versions for installation using the list command, you will see a wide variety of distributions of Java:

sdk list java 

And install additional versions, such as JDK 11 from Amazon:

sdk install java 11.0.14.10.1-amzn 

SDKMAN can work with previously installed existing versions. Just do a local install giving your own version label and the location of the JDK:

sdk install java my-local-13 /Library/Java/JavaVirtualMachines/jdk-13.jdk/Contents/Home 

And use it freely:

sdk use java my-local-13 

SDKMAN will automatically manage your PATH and JAVA_HOME for you as you change versions. And as a note, it installs Java versions to ~/.sdkman/candidates/java/ .

More information is available in the SDKMAN Usage Guide along with other SDK's it can install and manage such as Gradle, Maven, Kotlin, Quarkus, Spring Boot, and many others.

Installing and Switching versions with "asdf"

asdf is a version manager that supports installing and managing most languages, frameworks, and developer/devops tools. It has language specific plugins including one for Java.

    First, install asdf via https://asdf-vm.com/guide/getting-started.html (read there to setup your shell correctly), or more simply:

brew reinstall asdf 

and read the doc for setting up your shell correctly, but if you are using asdf from Homebrew with ZSH you can execute this command to finish setup:

echo -e "\n. $(brew --prefix asdf)/libexec/asdf.sh" >> $/.zshrc 
asdf plugin add java 

and read the doc for setting up your shell correctly before continuing. Basically it says to add the following to your ~/.zshrc file (assuming you are not using another shell):

. ~/.asdf/plugins/java/set-java-home.zsh 
asdf list-all java 
asdf install java openjdk-21 
or install the latest:
asdf install java latest 

Other important commands are.

asdf list java 
asdf global java openjdk-21 
asdf local java openjdk-19 

It's that easy! asdf will automatically manage your PATH and JAVA_HOME for you as you change versions. As a note, asdf installs Java versions to ~/.asdf/installs/java .

There are other languages and plugins for asdf here from the repository page: https://github.com/asdf-vm/asdf-plugins

Other Methods of Installation

Install with Homebrew

The version of Java available in Homebrew Cask previous to October 3, 2018 was indeed the Oracle JVM. Now, however, it has now been updated to OpenJDK. Be sure to update Homebrew and then you will see the lastest version available for install.

    install Homebrew if you haven't already. Make sure it is updated:

 brew update 
 brew tap homebrew/cask-versions 
 brew search java 
or for Eclipse Temurin versions:
 brew search temurin 
 brew info java 
or for the Temurin version:
 brew info temurin 
 brew install java brew install --cask temurin 

And these will be installed into /Library/Java/JavaVirtualMachines/ which is the traditional location expected on Mac OSX. There might be additional steps to make the JDK active reported at the end of the install process.

Install manually from OpenJDK download page:

If you need any and every version of Java, this is a good place to look.

  1. Download OpenJDK for Mac OSX from http://jdk.java.net/ (for example Java 17 and Java 21)
  2. Unarchive the OpenJDK tar, and place the resulting folder (i.e. jdk-19.jdk ) into your /Library/Java/JavaVirtualMachines/ folder since this is the standard and expected location of JDK installs. You can also install anywhere you want in reality.
  3. Set JAVA_HOME environment variable to point at direction where you unarchived the JDK.

For further information see the answer specific to manual installation. Also see the section below "Switching versions manually" for more information on how to manage multiple manual installations.

Other installation options:

Some other flavours of OpenJDK are:

Azul Systems Java Zulu certified builds of OpenJDK can be installed by following the instructions on their site.

Zulu® is a certified build of OpenJDK that is fully compliant with the Java SE standard. Zulu is 100% open source and freely downloadable. Now Java developers, system administrators, and end-users can enjoy the full benefits of open source Java with deployment flexibility and control over upgrade timing.

Amazon Correto OpenJDK builds have an easy to use an installation package for Java 8, 11, 17, and Java 21. It installs to the standard /Library/Java/JavaVirtualMachines/ directory on Mac OSX.

Amazon Corretto is a no-cost, multiplatform, production-ready distribution of the Open Java Development Kit (OpenJDK). Corretto comes with long-term support that will include performance enhancements and security fixes. Amazon runs Corretto internally on thousands of production services and Corretto is certified as compatible with the Java SE standard. With Corretto, you can develop and run Java applications on popular operating systems, including Linux, Windows, and macOS.

Microsoft Java JDK - certified builds of OpenJDK from Microsoft.

Where is my JDK.

To find locations of previously installed Java JDK's installed at the default system locations, use:

/usr/libexec/java_home -V 

Matching Java Virtual Machines (4):
19 (x86_64) "Homebrew" - "OpenJDK 19" /usr/local/Cellar/openjdk/19/libexec/openjdk.jdk/Contents/Home
18.0.1.1 (x86_64) "Homebrew" - "OpenJDK 18.0.1.1" /usr/local/Cellar/openjdk/18.0.1.1/libexec/openjdk.jdk/Contents/Home
17 (x86_64) "Homebrew" - "OpenJDK 17" /usr/local/Cellar/openjdk/17/libexec/openjdk.jdk/Contents/Home
11, x86_64: "Java SE 11" /Library/Java/JavaVirtualMachines/jdk-11.jdk/Contents/Home
1.8.301.09 (x86_64) "Oracle Corporation" - "Java" /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home /usr/local/Cellar/openjdk/17/libexec/openjdk.jdk/Contents/Home

You can also report just the location of a specific Java version using -v . For example for Java 17:

/usr/libexec/java_home -v 17 

Knowing the location of the installed JDK's is also useful when using tools like JEnv, or adding a local install manually to SDKMAN -- and you need to know where to find them.

If you need to find JDK's installed by other tools, check these locations:

Version Switching

If you are using SDKMAN or asdf you are already covered and can stop reading! Otherwise, here are some options to switch existing VM installations.

Switching versions manually

The Java executable is a wrapper that will use whatever JDK is configured in JAVA_HOME , so you can change that to also change which JDK is in use.

For example, if you installed or untar'd JDK 16 to /Library/Java/JavaVirtualMachines/jdk-16.jdk if it is the highest version number it should already be the default, if not you could simply set:

export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-16.jdk/Contents/Home 

And now whatever Java executable is in the path will see this and use the correct JDK.

A simple way to change JDKs is to create a function in your ~/.bashrc or ~/.zshrc file:

And then change JDKs simply by:

jdk 1.8 jdk 9 jdk 11 jdk 13