Mac OS X和多个Java版本

476

我怎样在MacOS上安装另外一个Java?我已经安装了jdk8并且它可以正常运行。但是现在我需要安装jdk7来进行开发。当我尝试通过DMG文件安装旧版本时,我收到警告说已经安装了更新的Java版本,并且安装程序退出。

    /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

如何在现有JDK的基础上安装jdk7?


6
警告:顶部回答推荐的Homebrew Java安装命令已经不再适用。请参考我的回答获取最新命令,或查看 这个绝妙的回答,它包含了所有最新的命令以及不同方法的详细说明。 - Powers
这个解决方案对我很有效。 - Wahab Khan Jadon
22个回答

624

在Mac上管理多个java版本的最简单方法是使用Homebrew

而在Homebrew中,使用:

  • homebrew-cask安装java的各个版本
  • jenv管理已安装的java版本

http://hanxue-it.blogspot.ch/2014/05/installing-java-8-managing-multiple.html所述,这是需要遵循的步骤。

  1. 安装homebrew
  2. 安装homebrew jenv
  3. 安装homebrew-cask
  4. 使用cask安装特定版本的java(请参见下面的“homebrew-cask版本”段落)
  5. 将此版本添加到jenv中进行管理
  6. 检查jenv是否正确管理了该版本
  7. 为每个所需的java版本重复步骤4至6

homebrew-cask 版本

使用以下命令将 homebrew/cask-versions tap 添加到 Homebrew 中:

brew tap homebrew/cask-versions

然后你可以查看所有可用的版本:
brew search java

然后您可以安装您喜欢的版本:

brew install --cask java7
brew install --cask java6

然后像往常一样将它们添加到由jenv管理。

jenv add <javaVersionPathHere>

我认为这是最清晰简单的方法。


需要注意的另一个重要事项,就像在Mac OS X 10.6.7 Java Path Current JDK confusing中提到的:

对于不同类型的JDK或安装,你会有不同的路径。你可以使用/usr/libexec/java_home -V检查已安装版本的路径,参见如何在Mac上检查是否安装了Java JDK?。在Mac OS X Mavericks上,我发现如下路径: 1.内置JRE默认:/Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin/Contents/Home 2.从Apple下载的JDK:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/ 3.从Oracle下载的JDK:/Library/Java/JavaVirtualMachines/jdk1.8.0_11.jdk/Contents/Home

资源


22
最好提到,homebrew-cask可以通过命令brew install caskroom/cask/brew-cask安装,而不是安装Emacs插件的brew install cask命令。 - Unnawut
9
在实现这个解决方案时,我遇到了一些问题,其中之一涉及jenv返回No such file or directory.错误。这篇维基帮助我解决了这个问题。 https://github.com/gcuisinier/jenv/wiki/Trouble-Shooting - juil
13
我想补充一点,所有的Java安装都位于/Library/Java/JavaVirtualMachines/下,使用jenv add添加时,路径应该长成这样/Library/Java/JavaVirtualMachines/[具体版本]/Contents/Home/。干杯! - Nikolay Tsenkov
19
截至2017年6月23日,我运行了“brew cask search java7”,但是得到了“java7”没有Cask的结果。 - Mingliang Liu
5
@MingliangLIU,我也是。这真的很糟糕。我在Github上找到了一些解决方法,但我无法让它们起作用。因此,最终我只能通过苹果和甲骨文的“Java版本下载和安装”网页手动处理。然后使用“/usr/libexec/java_home -V”命令来双重检查这些Java版本的安装路径。 - Adriano
显示剩余22条评论

420

卸载jdk8,安装jdk7,然后重新安装jdk8。

我在.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

然后您只需在终端中键入java7java8即可切换版本。

(编辑:更新以添加Dylan对Java 9的改进)


21
到目前为止,这是对我来说最好的选择。只需输入简单的命令“java8”或“java7”,就可以轻松切换到任何版本。感谢帮助。 - M.M.H.Masud
6
太好了! :) 对于像我这样的人,您可以使用命令“ls /Library/Java/JavaVirtualMachines”来查看可用的Java版本。然后,您可以切换到不同的1.8.x版本。此外,您还需要添加“export PATH=$JAVA_HOME/bin:$PATH”。 - Nico
4
谢谢这个信息。我想提一下,我成功地通过在安装 JDK8 后安装 JDK7 来做到这一点(无需卸载JDK8)。 - Titus
8
不知道为什么我浪费了时间去使用jenv,因为这个方法可以直接运行,不会附加jenv init命令导致启动时间延长0.5秒。 - cvakiitho
3
非常好的解决方案! - TastyCode
显示剩余11条评论

169

适用于 macOS Sierra 420

本指南汇集了各种来源(包括上面的回复以及其他帖子),并且效果完美。

0. 如果您还没有安装homebrew,请先安装。

请参见https://brew.sh/

1. 安装jenv

brew install jenv

2. 将jenv添加到bash配置文件

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

3. 将jenv添加到您的路径中

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

4. 点击 "homebrew/cask-versions"

顺便提一下:"Tap" 会扩展brew可安装的可用repos列表,超出了brew默认可用的repos列表。

brew tap homebrew/cask-versions

5. 安装最新版的Java

brew install java --cask

6. 安装java 6(或7或8,根据您的需要选择)

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

也许关闭并重新启动终端,以便它看到设置的任何新的环境变量。

7. 审查安装

所有 Java 版本都安装在这里:/Library/Java/JavaVirtualMachines 让我们来看一下。

ls -la /Library/Java/JavaVirtualMachines

8. 逐一将每个路径添加到jenv中。

我们需要将"/Contents/Home" 添加到版本文件夹中。 警告:请使用您机器上的实际路径......这些只是示例

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

9. 检查jenv是否成功注册

jenv versions

10. 设置全局Java版本

其中XX匹配上述版本列表中的任意一项。

jenv global XX

检查Java版本

java -version

检查 jenv 版本

应该在当前使用的版本后面加上一个星号来表示。

jenv versions

DONE


快速未来参考

更改Java版本:

…查看可用的Java版本列表

jenv versions

...然后,其中XX匹配上面列表中的项目

jenv global XX

1
此外,在执行 brew cask install java* 后,您需要重启终端。 - terencey
2
错误:Cask 'java8' 不可用:不存在此名称的 Cask。 - Alexey Sh.
9
Java 8/9/10 现在不再作为 casks 提供。请尝试使用以下命令进行安装: "brew cask install adoptopenjdk/openjdk/adoptopenjdk8" - supi
3
brew tap caskroom/versions should be brew tap homebrew/cask-versions - Vyacheslav Cotruta
1
当运行 jenv add <> 时,如果出现以下错误:ln: ~/.jenv/versions/openjdk64-11.0.8: No such file or directory,则意味着 .jenv/versions 文件夹不存在;创建一个 (mkdir ~/.jenv/versions),然后重新运行 jenv add <> 应该可以解决问题。 - Taoufik Mohdit
显示剩余6条评论

81

SDKMAN! 是在 Mac OS 上使用多个版本的 Java、Gradle、Groovy、Kotlin 和其他 JVM 工具的绝佳工具。安装和使用文档可以轻松在主站点上找到。

(我与其无关,只是一个快乐的用户)。

作为一个使用示例,如果我在终端窗口中输入以下内容,将显示可用的 Java SDK 版本列表(为了简洁起见进行了编辑):

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

这里的+表示已安装的版本。>表示当前正在使用的版本。要安装一个版本:
$ sdk install java 21.0.1-tem

在这个终端窗口中使用一个版本:
$ sdk use java 21.0.1-tem

sdkman支持从Java 1.7开始的版本。如果您想使用Java 1.6,则此解决方案可能不适合您。 - Aykut Akıncı
Sdkman很棒,但他们不支持版本内的特定发布版。例如,Datastax Dev Center只能与1.8.0_151配合使用,但我无法在sdkman中指定它。希望他们能添加更多版本。 - Eduardo Dennis
1
如果你有本地版本,我认为你可以将其安装到SDKMan中-https://sdkman.io/usage#localversion(但我没有尝试过) - Michael Easter
3
这对我来说是完美的解决方案。谢谢你。我对jenv的工作方式(或者说在我的情况下没有工作)不满意,但是我发现sdkman可以为我完成工作,让我能够在sublime 3中运行LSP-Metal并编写scala代码。 - RobLW

19

首先,您需要确保已安装了多个JAVA版本。打开一个新的终端窗口并输入:

/usr/libexec/java_home -V

你的输出应该像这样:

Matching Java Virtual Machines (2):
11.0.1, x86_64: "Java SE 11.0.1" /Library/Java/JavaVirtualMachines/jdk-11.0.1.jdk/Contents/Home
1.8.0_201, x86_64: "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home
请注意,有两个可用的JDK版本。如果您没有注意到需要切换的Java版本,请从此处下载并安装适当的版本 https://www.oracle.com/java/technologies/downloads/(JDK 8表示为1.8)。 安装适当的JDK后,请重复此步骤。 2. 注意您想要切换到的JDK版本。例如,“11.0”和“1.8”是上面示例中可用的JDK版本。 3. 切换到所需的版本。例如,如果您希望切换到JDK 8,请输入以下行:
export JAVA_HOME=/usr/libexec/java_home -v 1.8 对于11.0,请将“1.8”替换为“11.0”
4. 通过在终端中输入以下命令来检查您的JDK版本:
java -version

如果您已经正确地按照所有步骤进行操作,那么JDK版本应该与您在最后一步中指定的版本相对应。 5. (可选)若要将此设置为默认的JDK版本,请在终端中输入以下内容:

open ~/.bash_profile

接下来,将第三步中的终端输入添加到此文件中:

切换到Java版本8

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

保存并关闭文件。


你是不是想在“从这里下载并安装适当的链接”中包含一个链接? - jskattt797
不,这个链接是帮助从Oracle网站下载JDK的。 - TanvirChowdhury

9

在与 @Vegard(轻量级)相同的精神下:

  • 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
    

基于https://github.com/AdoptOpenJDK/homebrew-openjdk


7

在这个网站上找到,接下来我们需要安装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

就是这样,现在我们有多个版本的Java,并且可以轻松地在它们之间切换。 jEnv还具有其他功能,例如Gradle、Ant、Maven等的包装器,以及全局或本地设置JVM选项的能力。更多信息请查看文档。


6
不要放置你的命令图像,这会使复制/粘贴变得困难。为了突出显示命令,对于单个单词或短命令,请使用反引号 "`",或在其自己的行上缩进4个空格(或列表中的4的倍数)。 - Seki
1
谢谢Seki。我一直在努力发布图片,花了很长时间尝试格式化,但无法正确地完成。感谢您分享反引号信息。 - Dinesh Arora
4
你可能使用了同一张图片四次。 - Ellen Spertus

7

使用jenv在MAC上管理多个Java版本

  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
    

注意:如果您遇到以下错误:ln: /Users/<username>/.jenv/versions/oracle64-1.8.0.231: No such file or directory,请运行以下命令:

   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
    

6

我最近发现了一个叫做Jabba的Java版本管理器,使用方法与其他语言的版本管理器(如rvm(ruby), nvm(node), pyenv(python)等)非常相似。而且它是跨平台的,所以肯定可以在Mac上使用。

安装后,它会在~/.jabba中创建一个目录,用于存放你安装的所有Java版本。它“支持安装Oracle JDK(默认)/ Server JRE、Zulu OpenJDK(自0.3.0版起)、IBM SDK、Java Technology Edition(自0.6.0版起)和来自自定义URL的版本”。

他们在Github上列出了基本用法。以下是一个快速概要:

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

5

在Mac Sierra上使用Jenv:

如果安装后无法工作,请执行以下错误修复操作,将Java可执行文件添加到路径中。

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

即使eval "$(jenv init -)"可以完成此任务,但原因在于/bin文件夹不再存在于其首页中所述,而是使用shim文件夹作为/bin。

  • 确保~/.jenv存在
  • which java可能会打印出/Library/...
  • jenv global 1.8
  • jenv shell 1.8

最终,which java将给你:

/Users/xxxx/.jenv/shims/java


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接