9

I have 2 JAVA version on my Macbook. I want to change version from 14 to 11. I found 2 solutions on the internet but both are not working.

My java -version result is

openjdk version "14.0.1" 2020-04-14
OpenJDK Runtime Environment (build 14.0.1+14)
OpenJDK 64-Bit Server VM (build 14.0.1+14, mixed mode, sharing)

1st Solution (How to set or change the default Java (JDK) version on OS X?), I run /usr/libexec/java_home -V then I got a result below,

Matching Java Virtual Machines (2):
14.0.1, x86_64: "OpenJDK 14.0.1"    /Library/Java/JavaVirtualMachines/openjdk.jdk/Contents/Home
11.0.8, x86_64: "Java SE 11.0.8"    /Library/Java/JavaVirtualMachines/jdk-11.0.8.jdk/Contents/Home

Then I did

export JAVA_HOME=`/usr/libexec/java_home -v 11.0.8`

After checking from java -version, The result is still 14.0.1

2nd solution (How to set JAVA_HOME in Mac permanently?), I edit ~/.bash_profile file as below,

export JAVA_HOME=`/usr/libexec/java_home -v 11.0.8`

And I run command

source ~/.bash_profile
echo $JAVA_HOME

It shows the result,

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

But when I check the result with java -version, It's still 14.0.1 as well

Hikaru Shindo
  • 2,611
  • 8
  • 34
  • 59
  • 3
    That is just the JAVA_HOME variable. You need to add $JAVA_HOME/bin to your $PATH. Please check your $PATH variable – Ghokun Oct 13 '20 at 13:25
  • Try this one, I believe the others are for the current session and terminal: https://stackoverflow.com/a/44169445/6950859 – cela Oct 13 '20 at 13:27

4 Answers4

8

Install sdkman which takes care of the rather tedious command line voodoo you have to employ to try to make this happen. The problem is, JAVA_HOME is just an environment variable, it changes nothing - only tools that explicitly look for it (generally, maven and ant for example) will be affected by messing with it. When you type java on a mac, it runs /usr/bin/java, which is not a file you can change even as root. This java will then invoke the real java, and does not look at JAVA_HOME to get the job done: It is a softlink to /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java, and because it is in /System you can't change that either, not even as root.

That's why this is so hard, and why you want a nice tool (sdkman) to do it for you.

rzwitserloot
  • 85,357
  • 5
  • 51
  • 72
  • Anybody who comes here after hours of debugging, just do what he says, works like a charm. – Parth Kapadia Dec 20 '22 at 07:43
  • I just wish this answer included more than "use someone's software because it's too hard to explain how to get around these problems." If sdkman can fix it then it should be something we fix without sdkman. – David Rector Aug 30 '23 at 22:53
5

The removal of quotes around the JAVA_HOME and then setting the path variable variable worked for me (Mac OS Catalina):

export JAVA_HOME=/Library/Java/JavaVirtualMachines/openjdk.jdk/Contents/Home
export PATH=$JAVA_HOME/bin:$PATH
Pelonomi Moiloa
  • 516
  • 5
  • 12
3

If you need to switch between versions and already have the JDKs installed, you can adjust your bash profile with aliases that reset JAVA_HOME and reinitialize your PATH each time:

export JAVA_11_HOME=$(/usr/libexec/java_home -v11)
export JAVA_14_HOME=$(/usr/libexec/java_home -v14)

alias java11='export JAVA_HOME=$JAVA_11_HOME; export PATH=$JAVA_HOME/bin:$PATH'
alias java14='export JAVA_HOME=$JAVA_14_HOME; export PATH=$JAVA_HOME/bin:$PATH'

Then, after restarting your terminal session, you can switch back and forth:

$ java11
$ java -version

and

$ java14
$ java -version
Joe - GMapsBook.com
  • 15,787
  • 4
  • 23
  • 68
0

Try export JAVA_HOME='/usr/libexec/java_home -v 11' (without the minor version), it outputs the right java -version for me on Mac.

Jihed Amine
  • 2,198
  • 19
  • 32