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个回答

5

我回复晚了,我真的建议你使用SDKMAN而不是Homebrew。

使用SDKMAN,您可以在Mac上轻松安装不同版本的JAVA,并在这些版本之间切换。

Java在您的Mac上

您还可以在SDKMAN上使用ANT、GRADLE、KOTLIN、MAVEN、SCALA等工具...

要在Mac上安装一个版本,您可以运行命令 sdk install java 15.0.0.j9-adpt cmd


sdkmanjenv有什么区别? - Exploring
2
探索使用 jenv 也是一个不错的选择,sdkman 包括了 Kotlin、Gradle、Maven、Ant、AsciidoctorJ 等许多开发人员需要的工具。 - bdzzaid

5

截至 2023年,在 Apple chip 上,brew install --cask zulu8 对我没有起作用。 brew install openjdk@8 也不行。唯一有效的解决方案是使用 brew install --cask adoptopenjdk8,然后当然要使用 vim ~/.zshrc,并在其中添加:

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'

使用新安装的(不同的)版本切换终端中的javac8。注意:您可能拥有不同于我的Java版本,因此这只是一个示例。

编辑:由于某种原因,激活后需要一些时间。我觉得需要重新启动笔记本电脑。


2
非常有帮助,谢谢。顺便提一下,如果你运行 brew tap homebrew/cask-versions,它会更新可用的 Casks,然后你就可以安装两个 Zulu 版本了。在我的 Mac M1 上,这对我很有效。brew install --cask zulu8brew install --cask zulu11 - Houman
1
旁边的问题:openjdkadoptopenjdk8zulu等之间有什么区别?为什么一个会比另一个更受欢迎? - VimNing
@VimNing 不错,但说实话,我不知道 :-( 只是这对我有效。 - Daniel Danielecki

5
我正在使用Mac OS X 10.9.5。当我需要一个版本来运行应用程序A并使用另一个版本来运行应用程序B时,这就是我在我的机器上管理多个JDK/JRE的方法。
在网上获得一些帮助后,我创建了以下脚本。
#!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

我将上述脚本放置在.profile文件中。只需打开终端,输入vi .profile,使用上面的片段追加脚本并保存。退出后,键入source .profile命令,这将运行您的个人资料脚本,无需重新启动终端。现在键入java -version命令,它应该显示1.7作为您当前的版本。如果您想将其更改为1.8,则请注释掉setjdk jdk1.7.0_15.jdk行,并取消注释setjdk jdk1.8.0_60.jdk行。保存脚本并再次使用source命令运行它。我使用此机制来管理多个JDK / JRE版本,当我必须编译需要不同Java版本的两个不同Maven项目时。

4

我知道这个问题已经有很多答案了,但我想分享我的解决方案,只使用Temurin和bash。

AdoptOpenJdk已停用,所以我使用Temurin


1. 使用镜像或包管理器下载Temurin

$ brew install --cask temurin

其他版本(如Java 8):

$ brew tap homebrew/cask-versions

$ brew install --cask temurin8


2. 将Bash脚本添加到您的Bash配置文件中

打开您的~/.zshrc~/.bash_profile(取决于您正在使用哪个),并添加以下代码:

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

3. 重启终端并更改您的Java版本

$ set-jdk N N代表您想要的Java版本,并且它已经安装好了。

例如,$ set-jdk 8 切换到Java 8 / 1.8


几点需要注意:

  • 它只会在您使用set-jdk命令的终端会话中保留Java版本
  • 它不会将Java版本设置为全局变量
  • 当您想要将JAVA_HOME添加到另一个脚本/应用程序中时,可以设置/Library/Java/JavaVirtualMachines/temurin-<version>.jdk/Contents/Home (将 <version> 更改为所需的Java版本。例如JD-GUI示例)

享受吧!


这很好!你真的需要:export PATH=$PATH:$JAVA_HOME/bin; 吗? - galusben

1

查找可用的Java版本:

brew search java

安装最新的稳定版本(截至今天为止是19):

brew info java
brew install java

对于系统 Java 包装器(例如:IDE),要找到最新的 JDK,请使用符号链接:

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

安装特定版本(11):
brew install java11

对于系统来说,Java包装器可以找到JDK 11:

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

您可以在PATH中拥有一个OpenJDK版本。将以下一行添加到您的~/.bash_profile文件中之一

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

那么,

source ~/.bash_profile

1

通过Homebrew安装Java的新命令:

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

请参阅homebrew-openjdk存储库以获取最新命令。

安装Java

您可以通过Homebrew、Jabba、SDKMAN或手动方式安装Java。有关所有命令的详细信息,请参见this answer

切换Java版本*

您可以使用jenv Jabba、SDKMAN或手动方式切换Java版本。有关所有切换命令的详细信息,请参见here

最佳解决方案

  • Jabba 被设计为能够在多个平台上运行,因此如果您需要一个可以在 Windows 上运行的解决方案,它是一个不错的选择。
  • 使用 Homebrew 下载 Java 版本并使用 jenv 切换版本提供了一个不错的工作流程。jenv 可以轻松处理存储在机器上任何目录中的 Java 版本,因此如果您希望将 Java 存储在非默认目录中,则是一个好的替代方案。
  • 使用 SDKMAN 下载 Javas 并切换版本也是另一个很好的替代方案。
  • 应避免手动切换,因为这只会带来不必要的麻烦。

手动切换 Java 版本的函数

这里是用于手动切换 Java 版本(由OpenJDK)的 Bash / ZSH 函数:

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

有很棒的工具可以切换Java版本,所以我强烈建议不要手动操作。


1

我在我的Mac M1 Air上解决了这个错误,只需在~/.zshrc文件中添加新JDK版本的路径即可。

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)

我在/Library/Java/JavaVirtualMachines路径下拥有多个JDK,因此我可以选择任何版本作为我的默认java路径。


1
你不应该在问题或答案中包含文字图片。 - Valerij Dobler
@ValerijDobler 你应该改进你的语法。回到主题:这对我来说是一个有效的答案。 - VimNing

0

这是一个更DRY的bash版本(基于Vegard的答案)

将1.7和1.8替换为您感兴趣的任何版本,您将获得一个名为“javaX”的别名;其中“X”是Java版本(在下面的片段中为7/8),它将允许您轻松切换版本。

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

0

0

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