This article shows how to set the $JAVA_HOME
environment variable on older Mac OS X and the latest macOS 11.
Solution
Steps to set the $JAVA_HOME
environment variable on macOS.
- Find out your macOS version.
- Find out which shell you are using, bash or zsh?
- For zsh shell, export
$JAVA_HOME
at~/.zshenv
or~/.zshrc
. - For bash shell, export
$JAVA_HOME
at~/.bash_profile
or~/.bashrc
. - Test with
echo $JAVA_HOME
. - Done.
Related
Read this – How to install Java JDK on macOS
1. macOS release history, bash or zsh?
1.1 Review the macOS release history, source Wikipedia – macOS.
- Mac OS X Public Beta
- Mac OS X 10.0 (Cheetah)
- Mac OS X 10.1 (Puma)
- Mac OS X 10.2 Jaguar
- Mac OS X 10.3 Panther
- Mac OS X 10.4 Tiger
- Mac OS X 10.5 Leopard
- Mac OS X 10.6 Snow Leopard
- Mac OS X 10.7 Lion
- OS X 10.8 Mountain Lion
- OS X 10.9 Mavericks
- OS X 10.10 Yosemite
- OS X 10.11 El Capitan
- macOS 10.12 Sierra
- macOS 10.13 High Sierra
- macOS 10.14 Mojave
- macOS 10.15 Catalina (zsh)
- macOS 11 Big Sur (zsh)
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).
- For bash shell, we can put the environment variables at
~/.bash_profile
or~/.bashrc
. - For zsh shell, we can put the environment variables at
~/.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. What is /usr/libexec/java_home
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
3. $JAVA_HOME and macOS 11 Big Sur
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
4. $JAVA_HOME and Mac OS X 10.5 Leopard
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
5. $JAVA_HOME and older Mac OS X
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
6. Switch between different JDK versions
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