306

I just purchased a brand new MacBook Pro.

This is my first MAC ever and I'm still trying to get the hang of navigating my way around.

Anyway, I'm also new to Java and I've been practicing on my Windows PC before it permanently died.

Now that I'm on this MAC, I installed my JDK and now I need to set the JAVA_HOME environment variable.

I have no idea what to do.

I tried following some of these guides and didn't get very far.

  1. Mkyong.com : How to set JAVA_HOME variable in Mac OSX

  2. YouTube : How to set environment variables on mac, linux, solaris, rhel

  3. YouTube : How to Set Environment Variables in Mac

I was able to locate the terminal and I think I created some multiple files. I'm getting messages like this:


(1) Another program may be editing the same file. If this is the case, be careful not to end up with two different instances of the same file when making changes. Quit, or continue with caution.


(2) An edit session for this file crashed. If this is the case, use ":recover" or "vim -r /Users/Erwin/.bash_profile" to recover the changes (see ":help recovery"). If you did this already, delete the swap file "/Users/Erwin/.bash_profile.sw p" to avoid this message.

Can somebody tell how to set Java in Mac OSX environment step by step?

melwil
  • 2,547
  • 1
  • 19
  • 34
islander_zero
  • 3,342
  • 3
  • 12
  • 17
  • 2
    Duplicate of: http://superuser.com/questions/240100/setting-java-home-environment-variable – Frank V Apr 03 '14 at 15:52
  • Possible duplicate of [What should I set JAVA\_HOME to on OSX](http://stackoverflow.com/questions/1348842/what-should-i-set-java-home-to-on-osx) – Pascal Jan 27 '16 at 21:55
  • briefly explain: https://stackoverflow.com/a/59151321/5788247 – Shomu Dec 03 '19 at 06:46
  • 1
    After installing via `brew` on an M1 Mac, mine was located `/opt/homebrew/Cellar/openjdk/17.0.1_1/libexec/openjdk.jdk/Contents/Home`. Obviously change for your version but the typical methods of finding the path proved difficult so I hope this helps others. – Joshua Pinter Jan 21 '22 at 18:40
  • Don't forget to restart the terminal in mac after setting any environment variable, else you keep seeing the unset values – Harish Aravind Sep 10 '22 at 09:09

17 Answers17

551

If you're using bash, all you have to do is:

echo export "JAVA_HOME=\$(/usr/libexec/java_home)" >> ~/.bash_profile

If you're using zsh (which probably means you're running macOS Catalina or newer), then it should instead be:

echo export "JAVA_HOME=\$(/usr/libexec/java_home)" >> ~/.zshrc

In either case, restart your shell.

If you have multiple JDK versions installed and you want it to be a specific one, you can use the -v flag to java_home like so:

echo export "JAVA_HOME=\$(/usr/libexec/java_home -v 1.7)" >> ~/.bash_profile
Adrian Petrescu
  • 16,629
  • 6
  • 56
  • 82
  • 3
    When you say "shell," do you mean I close the terminal window and reopen it? Also, does this permanently add the environment variable for my jdk? – islander_zero Apr 03 '14 at 15:57
  • 1
    Yes, that's what I mean. And yes, that will add the variable for all login shells for your user (i.e, pretty much all of the circumstances in which you would want it) – Adrian Petrescu Apr 03 '14 at 16:00
  • 31
    I think instead of restarting the terminal if you do `source ~/.bash_profile` it would work, right? – Shobhit Puri Sep 11 '14 at 18:27
  • 5
    @ShobhitPuri Yup, it would, I just wanted to keep it simple for the asker. – Adrian Petrescu Sep 11 '14 at 18:36
  • 1
    Is there some sort of reference document from which this black magic can be obtained? (Answer: yes. 'man java_home'. Apparently part of Xcode. ('xcode-select -p' to determine whether you have it.)) Me: another Mac noob. – JohnL4 Oct 19 '14 at 23:27
  • 6
    `echo export "JAVA_HOME=\$(/usr/libexec/java_home -v 1.7)" >> ~/.bash_profile` If you need a specific version. 1.7 in this case. – sebastian Jun 15 '15 at 22:14
  • Will this update to the latest version with future java updates? Or do you need to re-run each time? – Rarw Sep 03 '17 at 17:01
  • 1
    @Rarw: If you put this in your `~/.bash_profile`, it'll run every time you log in. So, no need to change anything :) – Adrian Petrescu Sep 04 '17 at 23:36
  • the `export` content didnt work for my Mac. Running Catalina in 2020 another answer worked for me – cryanbhu Sep 23 '20 at 08:01
  • 1
    Before doing this, check the shell that you are using echo $SHELL.... If it is zsh, instead of bash_profile, you would have to use .zshenv or .zshrc – Kushan Aug 12 '21 at 11:22
  • 5
    on OSX 11. Instead of bash profile, we're now using `.zshrc`. So the command will be `echo export "JAVA_HOME=\$(/usr/libexec/java_home)" >> ~/.zshrc` – GusDeCooL Sep 24 '21 at 00:47
  • 1
    `~/.bash_profile` does not work on macOS Monterey version 12.0. `echo export "JAVA_HOME=\$(/usr/libexec/java_home)" >> ~/.zshrc` can work. – Instein Nov 23 '21 at 18:06
  • I received the message after run this command echo export "JAVA_HOME=\$(/usr/libexec/java_home)" >> ~/.zshrc source .zshrc .zshrc:export:118: JAVA_HOME: inconsistent type for assignment – Pavlo Chechehov Dec 23 '21 at 15:55
  • we must source the bash zsh file. – pradeexsu Mar 18 '22 at 09:31
  • In macOS Ventura, it's ~/.zprofile – Soumav Nov 03 '22 at 20:47
  • To check which Shell one is using, use echo $0 and then enter. After adding the path, to exit the vim, press the esp Key, then press : (colon) and type x & hit Enter. This will save the changes and exit. Then use source ~/.bash_profile or source ~/.zprofile depending on your shell to save all changes – dev.bojack Jan 17 '23 at 12:20
  • In MacOS **Monterrey** I'm still using `~/.bash_profile` so perhaps it's advisable to follow what @Jerry Chong says and run first `$ echo $SHELL` to know what shell you're using. If it's `/bin/bash` then follow @Adrian Petrescu – swngstack Mar 08 '23 at 13:30
  • You can use `source ~/.zshrc` instead of restarting the terminal – James Aug 24 '23 at 16:42
113

I just spent 2 hours setting this variable. The other answers did not work properly for me. I'm using macOS Catalina 10.15.4.

First, find your actual Java SDK Home directory:

/usr/libexec/java_home

Manually navigate there to make sure you don't have any mistakes due to incorrect versions, etc. For me, this was:

/Library/Java/JavaVirtualMachines/jdk-13.0.2.jdk/Contents/Home

Next, edit your terminal's profile. If you're using zsh, this will be:

vim ~/.zshrc

If you're not using zsh, this will be:

vim ~/.bash_profile

Inside, add the following new line anywhere in the file:

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

Restart your terminal app (or source ~/.bash_profile), and it should work properly.

Koray Tugay
  • 22,894
  • 45
  • 188
  • 319
Steve
  • 1,384
  • 1
  • 8
  • 7
54

I did it by putting

export JAVA_HOME=`/usr/libexec/java_home`

(backtics) in my .bashrc. See my comment on Adrian's answer.

Additionally update PATH variable as well.

PATH=$PATH:$JAVA_HOME/bin
Viktor Mellgren
  • 4,318
  • 3
  • 42
  • 75
JohnL4
  • 1,086
  • 9
  • 18
39

Set $JAVA_HOME environment variable on latest or older Mac OSX.

Download & Install install JDK

  1. First, install JDK
  2. Open terminal check java version

$ java -version

Set JAVA_HOME environment variable

  1. Open .zprofile file

$ open -t .zprofile

Or create . zprofile file

$ open -t .zprofile

  1. write in .zprofile

export JAVA_HOME=$(/usr/libexec/java_home)

Save .zprofile and close the bash file & then write in the terminal for work perfectly.

$ source .zprofile

Setup test in terminal

$ echo $JAVA_HOME  
/Library/Java/JavaVirtualMachines/jdk-13.0.1.jdk/Contents/Home
Community
  • 1
  • 1
Shomu
  • 2,734
  • 24
  • 32
  • 6
    Also I had a question what "/usr/libexec/java_home" actually is. Answer: https://medium.com/zendesk-engineering/setting-java-home-on-mac-os-acd44e3a6027 – ekar Feb 07 '20 at 18:28
  • 4
    /usr/libexec/java_home is the simplest maintainable way of setting JAVA_HOME on macOS. You can use java_home to: Find all installed JDKs. – Shomu Feb 08 '20 at 11:17
  • this works for me on a 2019 Mac running Catalina in 2020. Accepted and most upvoted answer didn't. First thing is that the bash profile is now `.zprofile`, also the `export` command content in accepted answer didn't work for me but this did. – cryanbhu Sep 23 '20 at 08:03
  • Just a note about where to get the JDK from–alternatively, you can install JDK from https://adoptopenjdk.net/. The difference is that Oracle's licence does not allow commercial builds using its JDK unless you pay for the licence. Whereas adoptopenjdk is open source. – emil.c Jan 12 '21 at 16:56
33

In Mac OSX 10.5 or later, Apple recommends to set the $JAVA_HOME variable to /usr/libexec/java_home, just export $JAVA_HOME in file ~/.bash_profile or ~/.profile.

Open the terminal and run the below command.

$ vim .bash_profile

export JAVA_HOME=$(/usr/libexec/java_home)

Save and exit from Vim editor, then run the source command on .bash_profile

$ source .bash_profile

$ echo $JAVA_HOME

/Library/Java/JavaVirtualMachines/1.7.0.jdk/Contents/Home
informatik01
  • 16,038
  • 10
  • 74
  • 104
Rajesh
  • 4,273
  • 1
  • 32
  • 33
24

It is recommended to check default terminal shell before set JAVA_HOME environment variable, via following commands:

$ echo $SHELL
/bin/bash

If your default terminal is /bin/bash (Bash), then you should use @Adrian Petrescu method.

If your default terminal is /bin/zsh (Z Shell), then you should set these environment variable in ~/.zshenv file with following contents:

export JAVA_HOME="$(/usr/libexec/java_home)"

Similarly, any other terminal type not mentioned above, you should set environment variable in its respective terminal env file.

Jerry Chong
  • 7,954
  • 4
  • 45
  • 40
7

Quick Guide for M1

  1. Add java sdk into your m1 check version

    java --version

Get all java versions installed in ur mac

/usr/libexec/java_home -V
  1. Execute for Java path from library

    /usr/libexec/java_home

(specify java version if you have multiple version, In my case -v17.0.5

/usr/libexec/java_home -v17.0.5
  1. Mac>User>'YourUserName/Home'>.zshrc

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

6

If you are using Zsh, then try to add this line in ~/.zshrc file & restart terminal.

export JAVA_HOME=$(/usr/libexec/java_home) 
Niket Shah
  • 331
  • 4
  • 4
4

I got it working by adding to ~/.profile. Somehow after updating to El Capitan beta, it didnt work even though JAVA_HOME was defined in .bash_profile.

If there are any El Capitan beta users, try adding to .profile

4

JAVA 11 via Homebrew - tested on macos Ventura 2022

.zshrc

export JAVA_HOME=/opt/homebrew/opt/openjdk@11/libexec/openjdk.jdk/Contents/Home
Anderson Laverde
  • 316
  • 1
  • 4
  • 15
3

For Mac M1

Download & Install install JDK

Open terminal check java version

java -version

Now create a file

touch .zprofile

Open the file

open -t .zprofile

Add the below line

export JAVA_HOME=$(/usr/libexec/java_home)

1

Since I'm using openjdk managed with sdkman, I added

sudo ln -sfn /path/to/my/installed/jdk/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk.jdk

Adding this to your system lets java_home recognize your installed version of Java even when its not installed via standard packages

  • What do you set JAVA_HOME to in this case, please? `export JAVA_HOME="/usr/libexec/java_home"` ? – Houman Dec 12 '20 at 10:02
  • With that line java will be discovered similarly to if it were a standard installation, we're linking the standard install location to point to the actual install location, so its treated like an officially installed package and you don't need to set JAVA_HOME – John Marcus Dec 13 '20 at 19:10
1

In the latest Mac, you have to add the Set $JAVA_HOME environment variable in .zprofile. Here, we simple way to open it. Press ⌘ + Shift + . from keyboard. Just open it and add the $JAVA_HOME environment variable as explained here:

Sunil
  • 3,211
  • 3
  • 21
  • 21
1

More simply on a mac terminal with a modern OSX

$ vim ~/.zshrc

Type "a" to being editing, and then paste (ctrl + v):

$ JAVA_HOME=/usr/libexec/java_home

then hit "escape" and type exactly ":wq" in order to write to the file and quit vim mode.

Finally, when out of vim mode and back in your terminal, type

$ source ~/.zshrc

This will refresh so that your terminal is aware of the changes.

  • IMPORTANT * If you don't "source" the file, you won't see the changes in this terminal session.

Check the changes by typing

$ echo $JAVA_HOME

and you should see /usr/libexec/java_home

Forrest
  • 2,968
  • 1
  • 27
  • 18
  • Please correct: `JAVA_HOME=/usr/libexec/java_home` should be `export JAVA_HOME=$(/usr/libexec/java_home)` – MarkHu Dec 01 '22 at 02:16
  • There was a typo @MarkHu. I fixed it. Apologies, and thanks for pointing that out. – Forrest Mar 02 '23 at 15:08
1

I'm able to solve this issue by setting JAVA_HOME in .bash_profile file

export JAVA_HOME=/usr/local/opt/openjdk@17

Note: I installed openjdk version 17 using 'brew'. I got this location from brew console. I'm using 'bash' instead of 'zsh' in my mac.

Arjun G
  • 2,194
  • 1
  • 18
  • 19
0

I resolved it on macOS Monterey by using the option provided by Google

Under Gradle JDK, choose the Embedded JDK option.

https://developer.android.com/studio/intro/studio-config#:~:text=A%20copy%20of%20the%20latest,use%20for%20your%20Android%20projects.

Rish
  • 1
0
  • Open Terminal.
  • Confirm you have JDK by typing “which java”. ...
  • Check you have the needed version of Java, by typing “java -version”.
  • Set JAVA_HOME using this command in Terminal: export JAVA_HOME=/Library/Java/Home.
  • echo $JAVA_HOME on Terminal to confirm the path.