This article shows how to set the $JAVA_HOME environment variable on older Mac OS X and the latest macOS 11.
Topics
Solution
Steps to set the $JAVA_HOME environment variable on macOS.
$JAVA_HOME at ~/.zshenv or ~/.zshrc.$JAVA_HOME at ~/.bash_profile or ~/.bashrc.echo $JAVA_HOME.1.1 Review the macOS release history, source Wikipedia – macOS.
1.2 bash or zsh?
On macOS 10.15 Catalina and later, the default Terminal shell switch from the bash (Bourne-again shell) to zsh (Z shell).
~/.bash_profile or ~/.bashrc.~/.zshenv or ~/.zshrc.We can print the $SHELL environment variable to determine the current shell you are using.
Terminal
% echo $SHELL
/bin/zsh
Further Reading
2.1 On Mac OS X 10.5 or later, we can use /usr/libexec/java_home to return the location of the default JDK.
Terminal
% /usr/libexec/java_home
/Library/Java/JavaVirtualMachines/jdk-16.jdk/Contents/Home
2.2 Also, find all installed JDKs.
Terminal
% /usr/libexec/java_home -V
Matching Java Virtual Machines (4):
16 (x86_64) "Oracle Corporation" - "OpenJDK 16-ea" /Library/Java/JavaVirtualMachines/jdk-16.jdk/Contents/Home
15.0.1 (x86_64) "UNDEFINED" - "OpenJDK 15.0.1" /usr/local/Cellar/openjdk/15.0.1/libexec/openjdk.jdk/Contents/Home
14.0.2 (x86_64) "AdoptOpenJDK" - "AdoptOpenJDK 14" /Library/Java/JavaVirtualMachines/adoptopenjdk-14.jdk/Contents/Home
1.8.0_275 (x86_64) "UNDEFINED" - "OpenJDK 8" /usr/local/Cellar/openjdk@8/1.8.0+275/libexec/openjdk.jdk/Contents/Home
/Library/Java/JavaVirtualMachines/jdk-16.jdk/Contents/Home
2.3 Also, run a specified JDK command.
Terminal
% /usr/libexec/java_home -v1.8
/usr/local/Cellar/openjdk@8/1.8.0+275/libexec/openjdk.jdk/Contents/Home
On macOS 10.15 Catalina and later, the zsh is the default Terminal shell, and we can set the $JAVA_HOME environment variable in either ~/.zshenv or ~/.zshrc.
3.1 Open the ~/.zshenv
Terminal
% nano ~/.zshenv
3.2 Add the following content
~/.zshenv
export JAVA_HOME=$(/usr/libexec/java_home)
3.3 Source the file and print the $JAVA_HOME, done.
Terminal
% source ~/.zshenv
% echo $JAVA_HOME
/Library/Java/JavaVirtualMachines/jdk-16.jdk/Contents/Home
For older Mac OS X, the bash is the default Terminal shell, and we can set the $JAVA_HOME environment variable in either ~/.bash_profile or ~/.bashrc.
4.1 Open the ~/.bash_profile
Terminal
% nano ~/.bash_profile
4.2 Add the following content
~/.bash_profile
export JAVA_HOME=$(/usr/libexec/java_home)
4.3 Source the file and print the $JAVA_HOME
Terminal
% source ~/.bash_profile
% echo $JAVA_HOME
/Library/Java/JavaVirtualMachines/jdk-16.jdk/Contents/Home
On older Mac OS X, the tool /usr/libexec/java_home doesn’t exists, and we need to set the $JAVA_HOME to the real path.
5.1 Open the ~/.bash_profile
Terminal
% nano ~/.bash_profile
5.2 Add the following content
~/.bash_profile
export JAVA_HOME=/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
5.3 Source the file and print the $JAVA_HOME
Terminal
% source ~/.bash_profile
% echo $JAVA_HOME
/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
For example, this macOS contains four JDK: 1.8, 14, 15, and 16, and the default JDK is 16.
Terminal
% /usr/libexec/java_home -V
Matching Java Virtual Machines (4):
16 (x86_64) "Oracle Corporation" - "OpenJDK 16-ea" /Library/Java/JavaVirtualMachines/jdk-16.jdk/Contents/Home
15.0.1 (x86_64) "UNDEFINED" - "OpenJDK 15.0.1" /usr/local/Cellar/openjdk/15.0.1/libexec/openjdk.jdk/Contents/Home
14.0.2 (x86_64) "AdoptOpenJDK" - "AdoptOpenJDK 14" /Library/Java/JavaVirtualMachines/adoptopenjdk-14.jdk/Contents/Home
1.8.0_275 (x86_64) "UNDEFINED" - "OpenJDK 8" /usr/local/Cellar/openjdk@8/1.8.0+275/libexec/openjdk.jdk/Contents/Home
/Library/Java/JavaVirtualMachines/jdk-16.jdk/Contents/Home
6.1 For zsh shell, edit the ~/.zshenv
Terminal
% nano ~/.zshenv
6.2 /usr/libexec/java_home -v"{$Version}" to activate a specified JDK version.
Add the following content to activate the JDK 1.8
~/.zshenv
export JAVA_HOME=$(/usr/libexec/java_home -v1.8)
If we want JDK 14.
~/.zshenv
export JAVA_HOME=$(/usr/libexec/java_home -v14)
If we want JDK 15.
~/.zshenv
export JAVA_HOME=$(/usr/libexec/java_home -v15)
6.3 Source the file and print the $JAVA_HOME, done.
Terminal
% source ~/.zshenv
% echo $JAVA_HOME
/usr/local/Cellar/openjdk@8/1.8.0+275/libexec/openjdk.jdk/Contents/Home