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.

  1. Find out your macOS version.
  2. Find out which shell you are using, bash or zsh?
  3. For zsh shell, export $JAVA_HOME at ~/.zshenv or ~/.zshrc.
  4. For bash shell, export $JAVA_HOME at ~/.bash_profile or ~/.bashrc.
  5. Test with echo $JAVA_HOME.
  6. 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.

  1. Mac OS X Public Beta
  2. Mac OS X 10.0 (Cheetah)
  3. Mac OS X 10.1 (Puma)
  4. Mac OS X 10.2 Jaguar
  5. Mac OS X 10.3 Panther
  6. Mac OS X 10.4 Tiger
  7. Mac OS X 10.5 Leopard
  8. Mac OS X 10.6 Snow Leopard
  9. Mac OS X 10.7 Lion
  10. OS X 10.8 Mountain Lion
  11. OS X 10.9 Mavericks
  12. OS X 10.10 Yosemite
  13. OS X 10.11 El Capitan
  14. macOS 10.12 Sierra
  15. macOS 10.13 High Sierra
  16. macOS 10.14 Mojave
  17. macOS 10.15 Catalina (zsh)
  18. 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

References

Leave a Reply

Your email address will not be published. Required fields are marked *