How to Set $JAVA_HOME environment variable on macOS
This article shows how to set the $JAVA_HOME
environment variable on older Mac OS X and the latest macOS 11.
Topics
- macOS release history
- What is /usr/libexec/java_home
- $JAVA_HOME and macOS 11 Big Sur
- $JAVA_HOME and Mac OS X 10.5 Leopard
- $JAVA_HOME and older Mac OS X
- Switch between different JDK versions
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.
% 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.
% /usr/libexec/java_home
/Library/Java/JavaVirtualMachines/jdk-16.jdk/Contents/Home
2.2 Also, find all installed JDKs.
% /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.
% /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
% nano ~/.zshenv
3.2 Add the following content
export JAVA_HOME=$(/usr/libexec/java_home)
3.3 Source the file and print the $JAVA_HOME
, done.
% 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
% nano ~/.bash_profile
4.2 Add the following content
export JAVA_HOME=$(/usr/libexec/java_home)
4.3 Source the file and print the $JAVA_HOME
% 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
% nano ~/.bash_profile
5.2 Add the following content
export JAVA_HOME=/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
5.3 Source the file and print the $JAVA_HOME
% 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.
% /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
% 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
export JAVA_HOME=$(/usr/libexec/java_home -v1.8)
If we want JDK 14.
export JAVA_HOME=$(/usr/libexec/java_home -v14)
If we want JDK 15.
export JAVA_HOME=$(/usr/libexec/java_home -v15)
6.3 Source the file and print the $JAVA_HOME
, done.
% source ~/.zshenv
% echo $JAVA_HOME
/usr/local/Cellar/openjdk@8/1.8.0+275/libexec/openjdk.jdk/Contents/Home
Your site is one of the best out there for development. Thanks for what you provide.
Thanks, article is updated with more examples, and also the zsh shell.
Thanks a lot. Always find your site useful.
% /usr/libexec/java_home
/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home
when I type % /usr/libexec/java_home -V
Matching Java Virtual Machines (2):
1.8.202.08 (x86_64) “Oracle Corporation” – “Java” /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home
1.8.0_202 (x86_64) “Oracle Corporation” – “Java SE 8” /Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home
/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home
I tried to open my eclipse 2019-06 it says failed to create JVM
please let me know how to fix it, thank you
Doesn’t work. Well it does but it sets JAVA_HOME only for specific terminal. When I open new tab in the terminal and write mvn –version it still shows 1.6 and echo $JAVA_HOME doesn’t show anything at all.
On older Mac OS X
source ~/.bash_profile
or restart the Terminal.On macOS 10.15 Catalina and later
source ~/.zshenv
or restart the Terminal.Make sure you are saving this in your bash profile. if you just type it into your terminal, it will not persist after you close the terminal.
I have a similar problem – I typed this into my ~/.bash_profile, but using the source command doesn’t persist in another shell. When I use $cat ~/.bash_profile it prints out the correct contents.
Did you try restarting Terminal altogether? Sometimes there is some weird funniness with session persistence. I always restart Terminal after editing .bash_profile just in case.
Hi, a recommendation, use jenv (https://www.jenv.be/) and a plugin for set the automatic link between jenv a JAVA_HOME (https://stackoverflow.com/questions/28615671/set-java-home-to-reflect-jenv-java-version)
Can anybody help me?, I just followed all the step in the post, but it doesn’t work to me.
When I type: Echo $JAVA_HOME, only show me blank.
Details:
⋊> ~ cat .bash_profile 22:42:12
export JAVA_HOME=$(/usr/libexec/java_home)
export M2_HOME=/Applications/apache-maven-3.6.1
export PATH=$PATH:$M2_HOME/bin
⋊> ~ echo $JAVA_HOME 22:42:16
⋊> ~ java -version 22:42:43
java version “1.8.0_211”
Java(TM) SE Runtime Environment (build 1.8.0_211-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, mixed mode)
⋊> ~ javac -version 22:42:48
javac 1.8.0_211
⋊> ~ source .bash_profile 22:42:51
.bash_profile (line 1): $(…) is not supported. In fish, please use ‘(/usr/libexec/ja…)’.
export JAVA_HOME=$(/usr/libexec/java_home)
^
from sourcing file .bash_profile
called on standard input
source: Error while reading file ‘.bash_profile’
export
$PATH
is optional.export
$JAVA_HOME
, and the macOSjava
can find the correct JDK.Due to recent Mac catalina update, by default terminal uses zsh. Zsh does not use .bash_profile. It uses
~/.zshrc
file. Open up this file and addsource ~/.bash_profile
. Restart Terminal and it should work. Make sure your~/.bash_profile
file does not havesource ~/.bash_profile
line.I have added JAVA_HOME in ~/.zshrc file and run source ~./bash_profile
it does shows path in eco $JAVA_HOME command.
But when I run elasticsearch it still shows :
warning: usage of JAVA_HOME is deprecated, use ES_JAVA_HOME
could not find java in JAVA_HOME at /Library/Java/JavaVirtualMachines/jdk1.8.0_291.jdk/bin/java
source ~/.zshrc or restart the machine.
Is this path exists?
/Library/Java/JavaVirtualMachines/jdk1.8.0_291.jdk/bin/java
Only your solution worked for me after unsuccessfully digging around the Internet for some time.
Thanks a lot.
Works like a charm.. thanks a lot.. have been following your blog for quite sometime… kudos on your spot on and precise solutions…
I need a favorite here please
awesome source!
Thanks a lot for these clear, precise and straightforward explanations.
Thank you! Another post on your blog that has helped me a lot.
Thanks dude, it saved me too much time and effort.
Thanks a lot, you are the best man!
Hi colleagues, its enormous article about educationand entirely explained, keep it up
all the time.
what a wonderful tutorial, very thanks
Thanks man, super useful.
great help .It worked.
how to undo this? inspite of updatig the java_home. on running java -version, it still shows the modified one not the old one?
PLease help
How to get this path ? I installed java 1.8
/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
This was super helpful. thank you!
Super mkyong. This article is point
Thanks a lot man
X Unable to find bundled Java version.
Thanks mkyong
Thank you so much
How to Android Home and PATH on OS Big Sur 11.6
thank you sooo muchhh
Thank you for this article, useful to complete the Java setup required by Flutter on MacOS 11.
Thx a lot, was rly useful!