Dakkar
Dakkar

Reputation: 5982

Mac OS X and multiple Java versions

How can I install an additional java on MacOS? I installed jdk8 and that works fine. But now I need a jdk7 installation for development purposes. When trying to install the old version via DMG file, i get a warning, that there is already a newer version of java installed and the installer quits.

    /usr/libexec/java_home -verbose
    Matching Java Virtual Machines (1):
        1.8.0_20, x86_64:   "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_20.jdk/Contents/Home

       /Library/Java/JavaVirtualMachines/jdk1.8.0_20.jdk/Contents/Home

How to install jdk7 in addition to this one?

Upvotes: 501

Views: 518352

Answers (22)

Adriano
Adriano

Reputation: 20041

The cleanest way to manage multiple java versions on Mac is to use Homebrew.

And within Homebrew, use:

  • homebrew-cask to install the versions of java
  • jenv to manage the installed versions of java

As seen on http://hanxue-it.blogspot.ch/2014/05/installing-java-8-managing-multiple.html , these are the steps to follow.

  1. install homebrew
  2. install homebrew jenv
  3. install homebrew-cask
  4. install a specific java version using cask (see "homebrew-cask versions" paragraph below)
  5. add this version for jenv to manage it
  6. check the version is correctly managed by jenv
  7. repeat steps 4 to 6 for each version of java you need

homebrew-cask versions

Add the homebrew/cask-versions tap to homebrew using:

brew tap homebrew/cask-versions

Then you can look at all the versions available by searching for Eclipse temurin, more details here

brew search temurin

Then you can install the version(s) you like, though version 7 no longer shows up in homebrew via these casks:

brew install --cask temurin8
brew install --cask temurin9

And add them to be managed by jenv as usual.

jenv add <javaVersionPathHere>

I think this is the cleanest & simplest way to go about it.


Another important thing to note, as mentioned in Mac OS X 10.6.7 Java Path Current JDK confusing :

For different types of JDKs or installations, you will have different paths

You can check the paths of the versions installed using /usr/libexec/java_home -V, see How do I check if the Java JDK is installed on Mac?

On Mac OS X Mavericks, I found as following:

  1. Built-in JRE default: /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin/Contents/Home

  2. JDKs downloaded from Apple: /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/

  3. JDKs downloaded from Oracle: /Library/Java/JavaVirtualMachines/jdk1.8.0_11.jdk/Contents/Home


Resources

Upvotes: 644

user20190704
user20190704

Reputation: 1

For mac os user

  • First list the existing all java with this command

    ~ % /usr/libexec/java_home -V

  • For this you will see this list of existing version

    Matching Java Virtual Machines (3): 20.0.2 (x86_64) "Amazon.com Inc." - "Amazon Corretto 20" /Users/userName/Library/Java/JavaVirtualMachines/corretto- 20.0.2.1/Contents/Home 17.0.10 (x86_64) "Oracle Corporation" - "Java SE 17.0.10" /Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home 17.0.9 (x86_64) "Amazon.com Inc." - "Amazon Corretto 17" /Users/userName/Library/Java/JavaVirtualMachines/corretto- 17.0.9/Contents/Home /Users/userName/Library/Java/JavaVirtualMachines/corretto- 20.0.2.1/Contents/Home

  • Then Convert using this command

    ~ % export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk- 17.jdk/Contents/Home

  • Check java version

    java --version

Upvotes: 0

bob
bob

Reputation: 8005

For macOS Sierra 420

This guide was cobbled together from various sources (replies above as well as other posts), and works perfect.

0. If you haven't already, install homebrew.

See https://brew.sh/

1. Install jenv

brew install jenv

2. Add jenv to the bash profile

if which jenv > /dev/null; then eval "$(jenv init -)"; fi

3. Add jenv to your path

export PATH="$HOME/.jenv/shims:$PATH"

4. Tap "homebrew/cask-versions"

FYI: "Tap" extends brew's list of available repos it can install, above and beyond brew's default list of available repos.

brew tap homebrew/cask-versions

5. Install the latest version of java

brew install java --cask

6. Install java 6 (or 7 or 8 whatever you need)

brew install java6 --cask
#brew install java7 --cask
#brew install java8 --cask

? Maybe close and restart Terminal so it sees any new ENV vars that got setup.

7. Review Installations

Most Java version get installed here: /Library/Java/JavaVirtualMachines lets take a look.

ls -la /Library/Java/JavaVirtualMachines

NOTE: Sometimes java ends up here: /usr/local/opt/openjdk/bin/java, so you can peek into the "opt" dir and look for "openjdk" in the list with:

ls -la /usr/local/opt/

8. Add each path to jenv one-at-a-time.

We need to add "/Contents/Home" to the version folder. WARNING: Use the actual paths on your machine... these are just EXAMPLE's

jenv add /Library/Java/JavaVirtualMachines/1.6.0___EXAMPLE___/Contents/Home
jenv add /Library/Java/JavaVirtualMachines/jdk-9.0.1.jdk___EXAMPLE___/Contents/Home

TIP: If you think you already have java, but not sure where it is, try using "which" -- if you have java installed, "which" should print out the path to java:

which java

9. Check if jenv registered OK

jenv versions

10. Set java version to use (globably)

Where XX matches one of the items in the versions list above.

jenv global XX

Check java version

java -version

NOTE: If not seeing version, enable plugin export (see comments below from cakraww):

jenv enable-plugin export

Check jenv versions

Should also indicate the current version being used with an asterisk.

jenv versions

DONE


Quick future reference

To change java versions

... See the list of available java versions

jenv versions

... then, where XX matches an item in the list above

jenv global XX

... also check which java the system recognizes (see TIP in #8 above)

which java

Upvotes: 178

Michael Easter
Michael Easter

Reputation: 24498

SDKMAN! is a great tool for using multiple versions of Java, Gradle, Groovy, Kotlin, and other JVM tools on Mac OS. Installation and usage doc are easily found on the main site.

(I have no affiliation, just a happy user).

As an example usage, if I type the following in a Terminal window, there is a list of available Java SDK versions (edited for brevity):

$ sdk list java
Available Java Versions
   + 17.0.9-oracle                                                                        
 > + 11.0.21-zulu                                                                         
     21.0.1-tem                     

Here + denotes that the version is installed. > denotes which version is currently in use. To install a version:

$ sdk install java 21.0.1-tem

To use a version in this Terminal window:

$ sdk use java 21.0.1-tem

Upvotes: 98

 Martin
Martin

Reputation: 488

When you want to maintain multiple JDK version (already installed) in Mac M1 then to switch easily between them add following lines in your ~/.zshrc file

alias jdk11="export JAVA_HOME=`/usr/libexec/java_home -v 11`; java -version"
alias jdk8="export JAVA_HOME=`/usr/libexec/java_home -v 1.8`; java -version"

Now, these can be easily switched like following

% ~
: jdk8
openjdk version "1.8.0_382"
OpenJDK Runtime Environment (Zulu 8.72.0.17-CA-macos-aarch64) (build 1.8.0_382-b05)
OpenJDK 64-Bit Server VM (Zulu 8.72.0.17-CA-macos-aarch64) (build 25.382-b05, mixed mode)
% ~
: java -version
openjdk version "1.8.0_382"
OpenJDK Runtime Environment (Zulu 8.72.0.17-CA-macos-aarch64) (build 1.8.0_382-b05)
OpenJDK 64-Bit Server VM (Zulu 8.72.0.17-CA-macos-aarch64) (build 25.382-b05, mixed mode)
% ~
:
% ~
: jdk11
openjdk version "11.0.15" 2022-04-19 LTS
OpenJDK Runtime Environment Corretto-11.0.15.9.1 (build 11.0.15+9-LTS)
OpenJDK 64-Bit Server VM Corretto-11.0.15.9.1 (build 11.0.15+9-LTS, mixed mode)
% ~
: java -version
openjdk version "11.0.15" 2022-04-19 LTS

Upvotes: 1

Vegard
Vegard

Reputation: 5082

Uninstall jdk8, install jdk7, then reinstall jdk8.

My approach to switching between them (in .profile) :

export JAVA_7_HOME=$(/usr/libexec/java_home -v1.7)
export JAVA_8_HOME=$(/usr/libexec/java_home -v1.8)
export JAVA_9_HOME=$(/usr/libexec/java_home -v9)
export JAVA_20_HOME=$(/usr/libexec/java_home -v20)

alias java7='export JAVA_HOME=$JAVA_7_HOME'
alias java8='export JAVA_HOME=$JAVA_8_HOME'
alias java9='export JAVA_HOME=$JAVA_9_HOME'
alias java20='export JAVA_HOME=$JAVA_20_HOME'

#default java8
export JAVA_HOME=$JAVA_8_HOME

Then you can simply type java7 or java8 in a terminal to switch versions.

(edit: updated to add Dylans improvement for Java 9)

Upvotes: 443

Ayush Pattnaik
Ayush Pattnaik

Reputation: 1

I solved this error on my mac m1 air just by adding the path of new jdk version in ~/.zshrc file.

export PATH="SPATH:/Users/ayushpattnaik/Documents/Deyeloper/flutter/bin"
export JAVA_HOME=nibrary/Jaya/JayaVirtualMachines/openjdk-11.jdk/Contents/Home
[ayushpattnaik@Ayushs—MacBook—Air ~ % java —version
openjdk version "11.0.18" 2023-01-17 
OpenJDK Runtime Environment Homebrew (build 11.0.18+0) 
OpenJDK 64—Bit Server VM Homebrew (build 11.0.18+0, mixed mode)

I have multiple jdks in my /Library/Java/JavaVirtualMachines path. So I can choose any version I wish to set as my default java path.

Upvotes: 1

Daniel Danielecki
Daniel Danielecki

Reputation: 10590

As of 2023, brew install --cask zulu8 didn't work for me on Apple chip. brew install openjdk@8 also didn't not. The only one solution worked for me was brew install --cask adoptopenjdk8 and then of course vim ~/.zshrc and inside:

export JAVAC_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home/
export JAVA_11_HOME=$(/usr/libexec/java_home -v11)
export JAVA_8_HOME=$(/usr/libexec/java_home -v1.8)
alias javac8='export JAVA_HOME=$JAVAC_HOME'
alias java11='export JAVA_HOME=$JAVA_11_HOME'
alias java8='export JAVA_HOME=$JAVA_8_HOME'

switch from terminal using javac8 to a freshly installed (different) version. Note: you can have different Java versions than me, so it's just an example.

Edit: for some reason it takes some time once it's activate. It seems to me a restart of a laptop is needed.

Upvotes: 5

Gayan Weerakutti
Gayan Weerakutti

Reputation: 13831

To find the available Java versions:

brew search java

To install the latest stable version (19 as of today):

brew info java
brew install java

For the system Java wrappers (eg: IDEs) to find the latest JDK, symlink it with:

sudo ln -sfn /opt/homebrew/opt/openjdk/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk.jdk

To install a specific version (11):

brew install java11

For the system, Java wrappers to find JDK 11:

sudo ln -sfn /opt/homebrew/opt/openjdk@11/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk-11.jdk

You can have one of the OpenJDK versions in your PATH. Add one of the following lines to your ~/.bash_profile

export PATH="/opt/homebrew/opt/openjdk/bin:$PATH
export PATH="/opt/homebrew/opt/openjdk@11/bin:$PATH

Then,

source ~/.bash_profile

Upvotes: 2

N&#237;colas Schirmer
N&#237;colas Schirmer

Reputation: 1444

I know that this question already have a lot of answers, but I want to share my solution only using Temurin and bash.

AdoptOpenJdk is deprecated and that is why I'm using Temurin.


1. Download Temurin using the mirrors or a package manager

$ brew install --cask temurin

And for other versions (like Java 8):

$ brew tap homebrew/cask-versions

$ brew install --cask temurin8


2. Add a bash script into your bash profile

Open your ~/.zshrc or ~/.bash_profile (depending on what you're using it)

And add this code:

set-jdk() {
    jdkversion=$1
    export JAVA_HOME=/Library/Java/JavaVirtualMachines/temurin-"$jdkversion".jdk/Contents/Home;
    export PATH=$PATH:$JAVA_HOME/bin;
    java -version
}

3. Restart your terminal and change your Java version

$ set-jdk N N being the Java version that you want and it's already installed

e.g. $ set-jdk 8 To change to Java 8 / 1.8


Few considerations:

  • It will only keep the Java version on the terminal session that you used the set-jdk command
  • It won't set the Java version as global
  • When you want to add the JAVA_HOME into another script/application, you can set /Library/Java/JavaVirtualMachines/temurin-<version>.jdk/Contents/Home (change the for the desired Java version. Like this JD-GUI example)

Enjoy

Upvotes: 5

Mayur
Mayur

Reputation: 386

Manage multiple java version in MAC using jenv

  1. Install homebrew using following command

    /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
    
  2. install jenv and activate jenv

    brew install jenv
    
    echo 'eval "$(jenv init -)"' >> ~/.bash_profile
    
  3. tap cask-versions

    brew tap homebrew/cask-versions
    
  4. search available java version that can be installed

    brew search java
    
  5. E.g. to install java6 use following command

    brew install cask java6
    
  6. Add multiple versions of java in jenv

    jenv add /Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home
    
    jenv add /Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
    

Note:- if you get error like ln: /Users/<username>/.jenv/versions/oracle64-1.8.0.231: No such file or directory, then run following:-

   mkdir -p /Users/<username>/.jenv/versions/oracle64-1.8.0.231
  1. Rehash jenv after adding jdk’s

    jenv rehash
    
  2. List known versions of java to jenv

    jenv versions
    
  3. Set default version

    jenv global oracle64-1.8.0.231
    
  4. Change java version for a project

    jenv local oracle64-1.6.0.65
    
  5. set JAVA_HOME with the same version as jenv

    jenv exec bash
    
    echo $JAVA_HOME
    

Upvotes: 7

Thiago
Thiago

Reputation: 13302

Here is a great tutorial https://medium.com/@chamikakasun/how-to-manage-multiple-java-version-in-macos-e5421345f6d0 by using jEnv installed by brew

or you can check out homebrew-openjdk https://github.com/AdoptOpenJDK/homebrew-openjdk managing version using brew Tap

Upvotes: 0

Powers
Powers

Reputation: 19348

New commands for installing Java via Homebrew:

  • brew cask install adoptopenjdk/openjdk/adoptopenjdk8
  • brew cask install adoptopenjdk/openjdk/adoptopenjdk11

See the homebrew-openjdk repo for the latest commands.

Installing Java

You can install Java via Homebrew, Jabba, SDKMAN or manually. See this answer for details on all the commands.

Switching Java versions*

You can switch Java versions with jenv Jabba, SDKMAN or manually. See details on all the switching commands here.

Best solutions

  • Jabba is designed to work on multiple platforms, so it's a good option if you want a solution that'll also work on Windows
  • Using Homebrew to download Java versions and jenv to switch versions provides a nice workflow. jenv makes it easy to work with Java versions stored in any directory on your machine, so it's a good alternative if you're interested in storing Java in non-default directories.
  • Using SDKMAN to download Javas and switch versions is another great alternative
  • Manually switching should be avoided because it's an unnecessary headache.

Function to manually switch Java versions

Here's the Bash / ZSH function for manually switching Java versions (by OpenJDK):

jdk() {
        version=$1
        export JAVA_HOME=$(/usr/libexec/java_home -v"$version");
        java -version
 }

There are great tools for switching Java versions, so I highly recommend against doing it manually.

Upvotes: 1

bdzzaid
bdzzaid

Reputation: 908

I answer lately and I really recommand you to use SDKMAN instead of Homebrew.

With SDKMAN you can install easily different version of JAVA in your mac and switch from on version to another.

Java in your mac

You can also use SDKMAN for ANT, GRADLE, KOTLIN, MAVEN, SCALA, etc...

To install a version in your mac you can run the command sdk install java 15.0.0.j9-adpt cmd

Upvotes: 5

Sanchi Girotra
Sanchi Girotra

Reputation: 1370

I followed steps in below link - https://medium.com/@euedofia/fix-default-java-version-on-maven-on-mac-os-x-156cf5930078 and it worked for me.

cd /usr/local/Cellar/maven/3.5.4/bin/
nano mvn
--Update JAVA_HOME -> "${JAVA_HOME:-$(/usr/libexec/java_home)}"
mvn -version

Upvotes: 0

Matthias Bohlen
Matthias Bohlen

Reputation: 668

To install more recent versions of OpenJDK, I use this. Example for OpenJDK 14:

brew info adoptopenjdk
brew tap adoptopenjdk/openjdk
brew cask install adoptopenjdk14

See https://github.com/AdoptOpenJDK/homebrew-openjdk for current info.

Upvotes: 0

hulius
hulius

Reputation: 359

In the same spirit than @Vegard (lightweight):

  • Install the wanted JDKs with Homebrew
  • Put this jdk bash function and a default in your .profile

    jdk() {
        version=$1
        export JAVA_HOME=$(/usr/libexec/java_home -v"$version");
        java -version
     }
    
    export JAVA_HOME=$(/usr/libexec/java_home -v11); # Your default version
    
  • and then, to switch your jdk, you can do

     jdk 9
     jdk 11
     jdk 13
    

Based on https://github.com/AdoptOpenJDK/homebrew-openjdk.

Upvotes: 10

Dinesh Arora
Dinesh Arora

Reputation: 2255

As found on this website So Let’s begin by installing jEnv

  1. Run this in the terminal

    brew install https://raw.github.com/gcuisinier/jenv/homebrew/jenv.rb
    
  2. Add jEnv to the bash profile

    if which jenv > /dev/null; then eval "$(jenv init -)"; fi
    
  3. When you first install jEnv will not have any JDK associated with it.

    For example, I just installed JDK 8 but jEnv does not know about it. To check Java versions on jEnv

    At the moment it only found Java version(jre) on the system. The * shows the version currently selected. Unlike rvm and rbenv, jEnv cannot install JDK for you. You need to install JDK manually from Oracle website.

  4. Install JDK 6 from Apple website. This will install Java in /System/Library/Java/JavaVirtualMachines/. The reason we are installing Java 6 from Apple website is that SUN did not come up with JDK 6 for MAC, so Apple created/modified its own deployment version.

  5. Similarly install JDK7 and JDK8.

  6. Add JDKs to jEnv.

    JDK 6:

    JDK 7: http://javahabi@javahabit.com/wp-content/uploads/2015/03/img_5518ab9bc47d4.png

    JDK 8: http://javahabi@javahabit.com/wp-content/uploads/2015/03/img_5518abb2c1217.png

  7. Check the java versions installed using jenv

    http://javahabi@javahabit.com/wp-content/uploads/2015/03/img_5518abceb0deb.png

  8. So now we have 3 versions of Java on our system. To set a default version use the command

    jenv local <jenv version>
    

    Ex – I wanted Jdk 1.6 to start IntelliJ

    jenv local oracle64-1.6.0.65
    
  9. check the java version

    java -version http://javahabi@javahabit.com/wp-content/uploads/2015/03/img_5518abe376dd0.png

That’s it. We now have multiple versions of java and we can switch between them easily. jEnv also has some other features, such as wrappers for Gradle, Ant, Maven, etc, and the ability to set JVM options globally or locally. Check out the documentation for more information.

Upvotes: 7

elad.chen
elad.chen

Reputation: 2425

Here's a more DRY version for bash (Based on Vegard's answer)

Replace 1.7 and 1.8 with whatever versions you are interested with and you'll get an alias called 'javaX'; where 'X' is the java version (7 / 8 in the snippet below) that will allow you to easily switch versions

for version in 1.7 1.8; do
    v="${version: -1}"
    h=JAVA_"$v"_HOME

    export "$h"=$(/usr/libexec/java_home -v $version)

    alias "java$v"="export JAVA_HOME=\$$h"
done

Upvotes: 0

York Yang
York Yang

Reputation: 537

I find this Java version manager called Jabba recently and the usage is very similar to version managers of other languages like rvm(ruby), nvm(node), pyenv(python), etc. Also it's cross platform so definitely it can be used on Mac.

After installation, it will create a dir in ~/.jabba to put all the Java versions you install. It "Supports installation of Oracle JDK (default) / Server JRE, Zulu OpenJDK (since 0.3.0), IBM SDK, Java Technology Edition (since 0.6.0) and from custom URLs.".

Basic usage is listed on their Github. A quick summary to start:

curl -sL https://github.com/shyiko/jabba/raw/master/install.sh | bash && . ~/.jabba/jabba.sh

# install Oracle JDK
jabba install 1.8 # "jabba use 1.8" will be called automatically  
jabba install 1.7 # "jabba use 1.7" will be called automatically 

# list all installed JDK's
jabba ls

# switch to a different version of JDK
jabba use 1.8

Upvotes: 7

CodeFarmer
CodeFarmer

Reputation: 2706

Jenv on Mac Sierra:

if not working after install, do this bug fix to add java executable to path

export PATH="$HOME/.jenv/shims:$PATH"

even though eval "$(jenv init -)" could do this job. The reason is /bin folder is not there anymore as describe in it's homepage, but shim folder is used as /bin instead.

  • Make sure ~/.jenv is there
  • which java may print /Library/...
  • jenv global 1.8
  • jenv shell 1.8

Eventually, which java gives you:

/Users/xxxx/.jenv/shims/java

Upvotes: 5

ChaitanyaBhatt
ChaitanyaBhatt

Reputation: 1226

I am using Mac OS X 10.9.5. This is how I manage multiple JDK/JRE on my machine when I need one version to run application A and use another version for application B.

I created the following script after getting some help online.

#!bin/sh
function setjdk() {
  if [ $# -ne 0 ]; then
   removeFromPath '/Library/Java/JavaVirtualMachines/'
   if [ -n "${JAVA_HOME+x}" ]; then
    removeFromPath $JAVA_HOME
   fi
   export JAVA_HOME=/Library/Java/JavaVirtualMachines/$1/Contents/Home
   export PATH=$JAVA_HOME/bin:$PATH
  fi
 }
 function removeFromPath() {
  export PATH=$(echo $PATH | sed -E -e "s;:$1;;" -e "s;$1:?;;")
 }
#setjdk jdk1.8.0_60.jdk
setjdk jdk1.7.0_15.jdk

I put the above script in .profile file. Just open terminal, type vi .profile, append the script with the above snippet and save it. Once your out type source .profile, this will run your profile script without you having to restart the terminal. Now type java -version it should show 1.7 as your current version. If you intend to change it to 1.8 then comment the line setjdk jdk1.7.0_15.jdk and uncomment the line setjdk jdk1.8.0_60.jdk. Save the script and run it again with source command. I use this mechanism to manage multiple versions of JDK/JRE when I have to compile 2 different Maven projects which need different java versions.

Upvotes: 5

Related Questions