Mac OS X 和多个 Java 版本
Posted
技术标签:
【中文标题】Mac OS X 和多个 Java 版本【英文标题】:Mac OS X and multiple Java versions 【发布时间】:2014-12-02 20:37:02 【问题描述】:如何在 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
jdk7除了这个还怎么安装?
【问题讨论】:
警告:热门答案推荐的 Homebrew Java 安装命令不再起作用。请参阅我的最新命令答案或this amazing answer,其中包含所有最新命令以及不同方法的详细说明。 【参考方案1】:在 Mac 上管理多个 java 版本的最简洁方法是使用Homebrew
。
在Homebrew
内,使用:
homebrew-cask
安装java版本
jenv
管理已安装的java版本
正如在 http://hanxue-it.blogspot.ch/2014/05/installing-java-8-managing-multiple.html 上看到的,这些是要遵循的步骤。
-
安装自制软件
安装自制 jenv
安装自制桶
使用 cask 安装特定的 java 版本(请参阅下面的“homebrew-cask 版本”段落)
为 jenv 添加这个版本来管理它
检查版本是否由 jenv 正确管理
为您需要的每个 java 版本重复步骤 4 到 6
自制桶版本
使用以下命令将homebrew/cask-versions
点击添加到自制软件:
brew tap homebrew/cask-versions
然后你可以查看所有可用的版本:
brew search java
然后你就可以安装你喜欢的版本了:
brew cask install java7
brew cask install java6
并像往常一样将它们添加到 jenv 管理。
jenv add <javaVersionPathHere>
我认为这是最干净、最简单的方法。
另一个需要注意的重要事项,如Mac OS X 10.6.7 Java Path Current JDK confusing 中所述:
对于不同类型的 JDK 或安装,您将有不同的 路径
您可以检查使用
/usr/libexec/java_home -V
安装的版本的路径,请参阅How do I check if the Java JDK is installed on Mac?在 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
资源
Removing Java 8 JDK from Mac http://hanxue-it.blogspot.ch/2014/05/installing-java-8-managing-multiple.html http://sourabhbajaj.com/mac-setup/index.html http://brew.sh https://github.com/Homebrew/homebrew/tree/master/share/doc/homebrew#readme http://sourabhbajaj.com/mac-setup/Homebrew/README.html “酿造水龙头”解释https://github.com/Homebrew/homebrew/blob/master/share/doc/homebrew/brew-tap.md “brew 版本”解释了 Homebrew install specific version of formula? 和 https://github.com/Homebrew/homebrew-versions https://github.com/caskroom/homebrew-cask “cask 版本”,类似于“brew 版本”,参见 https://github.com/caskroom/homebrew-versions 和 https://github.com/caskroom/homebrew-cask/issues/9447 http://www.jenv.be https://github.com/gcuisinier/jenv【讨论】:
值得一提的是,homebrew-cask 可以使用命令brew install caskroom/cask/brew-cask
而不是brew install cask
(Emacs 插件)安装。
我在实施此解决方案时遇到了一些问题,其中一个是jenv
返回No such file or directory.
错误。这个 wiki 帮我解决了这个问题。 github.com/gcuisinier/jenv/wiki/Trouble-Shooting
我要补充一点,所有 java 安装都将在 /Library/Java/JavaVirtualMachines/
中,当使用 jenv add
添加它们时,您添加的路径看起来像这样 /Library/Java/JavaVirtualMachines/[specific-version]/Contents/Home/
。干杯!
截至 2017 年 6 月 23 日,我运行 brew cask search java7
但没有找到“java7”的木桶。
@MingliangLIU 是的,我也是……真的很烂。我在 Github 上发现了这方面的问题,他们提到了一些解决方法,但我无法让它工作。所以我最终不得不通过苹果和 oracle 的“Java 版本下载和安装”网页“手动方式”进行操作。然后使用/usr/libexec/java_home -V
仔细检查安装路径。【参考方案2】:
卸载 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)
alias java7='export JAVA_HOME=$JAVA_7_HOME'
alias java8='export JAVA_HOME=$JAVA_8_HOME'
alias java9='export JAVA_HOME=$JAVA_9_HOME'
#default java8
export JAVA_HOME=$JAVA_8_HOME
然后您可以在终端中输入java7
或java8
来切换版本。
(编辑:更新以添加对 Java 9 的 Dylan 改进)
【讨论】:
到目前为止,这对我来说是最好的选择。只需一个简单的命令“java8”或“java7”即可轻松切换到任何版本。感谢您的帮助 太棒了! :) 对于像我这样的其他人,您可以使用:ls /Library/Java/JavaVirtualMachines 查看哪些版本可用。然后您可以打开不同的 1.8.x 版本。而且你还必须添加 export PATH=$JAVA_HOME/bin:$PATH 感谢这个。我只想提一下,我已经通过在 jdk8 之后安装 jdk7 来做到这一点(无需卸载 jdk8)。 不知道为什么我在 jenv 上浪费了我的时间,因为这很有效,并且不会用 jenv init 将你的 shell 启动时间缩短 0.5 秒。 如果你想让 java 9 以这种方式工作,java 9 的 java_home 的版本参数应该只是9
例如export JAVA_9_HOME=$(/usr/libexec/java_home -v9)
【参考方案3】:
适用于 macOS Sierra 420
本指南是从各种来源(上面的回复以及其他帖子)拼凑而成的,效果很好。
0。如果您还没有,请安装自制软件。
见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。点击“caskroom/versions”
仅供参考:“Tap”扩展了 brew 可以安装的可用存储库列表,超出了 brew 的默认可用存储库列表。
brew tap caskroom/versions
5。安装最新版本的java
brew cask install java
6。安装 java 6(或者你需要的 7 或 8)
brew cask install java6
#brew cask install java7
#brew cask install java8
?也许关闭并重新启动终端,以便它看到任何已设置的新 ENV 变量。
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
完成
未来快速参考
更改java版本
...查看可用的 java 版本列表
jenv versions
...那么,XX 匹配上面列表中的一个项目
jenv global XX
【讨论】:
另外,在brew cask install java*
之后重启你的终端
一步一步清晰而精彩的解释。
错误:木桶“java8”不可用:不存在同名木桶。
java8/9/10 不再可用作木桶。试试这个:“ brew cask install 采用openjdk/openjdk/adoptopenjdk8 ”
brew tap caskroom/versions
应该是brew tap homebrew/cask-versions
【参考方案4】:
SDKMAN! 是在 Mac OS 上使用多个版本的 Java、Gradle、Groovy、Kotlin 和其他 JVM 工具的绝佳工具。安装和使用文档在主站点上很清楚。
(我没有隶属关系,只是一个快乐的用户)。
作为示例用法,如果我在终端窗口中键入以下内容,则会出现可用 Java SDK 版本的列表(为简洁起见进行了编辑):
$ sdk list java
Available Java Versions
+ 9ea170
> + 8u131
7u141-zulu
这里+
表示已安装版本。 >
表示当前正在使用哪个版本。安装版本:
$ sdk install java 7u141-zulu
要在此终端窗口中使用版本:
$ sdk use java 9ea170
【讨论】:
sdkman 支持从 java 1.7 开始的版本。如果您愿意使用 java 1.6,此解决方案可能不适合您。 sdkman 很棒,但它们不支持版本中的特定版本。例如,Datastax 开发中心仅适用于 1.8.0_151,但我无法使用 sdkman 指定它。希望他们添加更多版本。 如果你有本地版本,我想你可以将它安装到 SDKMan - sdkman.io/usage#localversion (但我没有尝试过)【参考方案5】:首先,您需要确保安装了多个 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 版本,请从此处下载并安装相应的版本(JDK 8 表示为 1.8)。安装适当的 JDK 后,重复此步骤。
记下您要切换到的 JDK 版本。例如,“11.0”和“1.8”是上例中可用的 JDK 版本。
切换到所需的版本。例如,如果您想切换到 JDK 8,请输入以下行:
导出 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
然后,将步骤 3 中的终端输入添加到此文件:
切换到 JAVA 版本 8
export JAVA_HOME=`/usr/libexec/java_home -v 1.8`
保存并关闭文件。
【讨论】:
【参考方案6】:在此website 上找到 所以让我们从安装 jEnv 开始
在终端运行这个
brew install https://raw.github.com/gcuisinier/jenv/homebrew/jenv.rb
将 jEnv 添加到 bash 配置文件
if which jenv > /dev/null; then eval "$(jenv init -)"; fi
当你第一次安装 jEnv 时不会有任何与之关联的 JDK。
例如,我刚刚安装了 JDK 8,但 jEnv 不知道它。在 jEnv 上检查 Java 版本
目前它只在系统上找到 Java 版本(jre)。 *
显示当前选择的版本。与 rvm 和 rbenv 不同,jEnv 无法为您安装 JDK。您需要从 Oracle 网站手动安装 JDK。
从 Apple 网站安装 JDK 6。这将在/System/Library/Java/JavaVirtualMachines/
中安装Java。我们从 Apple 网站安装 Java 6 的原因是 SUN 没有为 MAC 提供 JDK 6,因此 Apple 创建/修改了自己的部署版本。
同样安装JDK7和JDK8。
将 JDK 添加到 jEnv。
JDK 6:
JDK 7:
JDK 8:
检查使用 jenv 安装的 java 版本
所以现在我们的系统上有 3 个版本的 Java。要设置默认版本,请使用命令
jenv local <jenv version>
例如——我希望 Jdk 1.6 启动 IntelliJ
jenv local oracle64-1.6.0.65
检查java版本
java -版本
就是这样。我们现在有多个版本的 java,我们可以轻松地在它们之间切换。 jEnv 还具有一些其他特性,例如 Gradle、Ant、Maven 等的包装器,以及全局或本地设置 JVM 选项的能力。查看文档了解更多信息。
【讨论】:
不要把你的命令的图像,它很难复制/粘贴它们。要突出显示命令,请对单个单词或短命令使用反引号“`”,或者在自己的行上使用 4 个空格(或列表中 4 的倍数)缩进您的命令。 谢谢关。我正在努力发布图像并花了很长时间尝试格式化但无法正确处理。感谢您分享反引号信息。 我想您可能已经使用了四次同一张图片。【参考方案7】:我最近发现了这个 Java 版本管理器 Jabba,它的用法与其他语言的版本管理器非常相似,例如 rvm(ruby)、nvm(node)、pyenv(python) 等。而且它肯定是跨平台的它可以在 Mac 上使用。
安装后,它会在 ~/.jabba 中创建一个目录来放置您安装的所有 Java 版本。它“支持安装 Oracle JDK(默认)/Server JRE、Zulu OpenJDK(自 0.3.0 起)、IBM SDK、Java 技术版(自 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
【讨论】:
【参考方案8】:我使用的是 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,使用上面的 sn-p 附加脚本并保存。一旦您输入source .profile
,这将运行您的配置文件脚本,而无需重新启动终端。现在输入 java -version
它应该显示 1.7 作为您当前的版本。如果您打算将其更改为 1.8,请注释 setjdk jdk1.7.0_15.jdk
行并取消注释 setjdk jdk1.8.0_60.jdk
行。保存脚本并使用 source 命令再次运行它。当我必须编译需要不同 java 版本的 2 个不同的 Maven 项目时,我使用这种机制来管理多个版本的 JDK/JRE。
【讨论】:
【参考方案9】:本着与@Vegard 相同的精神(轻量级):
使用 Homebrew 安装所需的 JDK将此jdk
bash 函数和默认值放入您的.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
然后,要切换你的jdk,你可以这样做
jdk 9
jdk 11
jdk 13
基于https://github.com/AdoptOpenJDK/homebrew-openjdk。
【讨论】:
【参考方案10】:Mac Sierra 上的 Jenv:
如果安装后无法运行,请进行此错误修复以将 java 可执行文件添加到路径
export PATH="$HOME/.jenv/shims:$PATH"
即使eval "$(jenv init -)"
可以完成这项工作。原因是 /bin 文件夹不再存在,如主页所述,而是将 shim 文件夹用作 /bin。
which java
可以打印 /Library/...
jenv 全球 1.8
jenv shell 1.8
最终,which java
给你:
/Users/xxxx/.jenv/shims/java
【讨论】:
【参考方案11】:使用 jenv 在 MAC 中管理多个 java 版本
使用以下命令安装自制软件
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
安装 jenv 并激活 jenv
brew install jenv
echo 'eval "$(jenv init -)"' >> ~/.bash_profile
点击木桶版本
brew tap homebrew/cask-versions
搜索可以安装的可用java版本
brew search java
例如安装 java6 使用以下命令
brew install cask java6
在jenv中添加多个java版本
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
添加jdk后重新hash jenv
jenv rehash
列出已知版本的 java 到 jenv
jenv versions
设置默认版本
jenv global oracle64-1.8.0.231
更改项目的 java 版本
jenv local oracle64-1.6.0.65
将 JAVA_HOME 设置为与 jenv 相同的版本
jenv exec bash
echo $JAVA_HOME
【讨论】:
【参考方案12】:我最近回答了,我真的建议您使用 SDKMAN 而不是 Homebrew。
使用 SDKMAN,您可以在 Mac 中轻松安装不同版本的 JAVA,并从一个版本切换到另一个版本。
您还可以将 SDKMAN 用于 ANT、GRADLE、KOTLIN、MAVEN、SCALA 等...
要在你的 mac 中安装一个版本,你可以运行命令 sdk install java 15.0.0.j9-adpt
【讨论】:
sdkman
和jenv
有什么区别?
@Exploring jenv 也是一个不错的选择,sdkman 还包括 kotlin、gradle、maven、ant、asciidotorJ 和许多其他开发者需要的工具【参考方案13】:
这是 bash 的更 DRY 版本(基于 Vegard 的回答)
将 1.7 和 1.8 替换为您感兴趣的任何版本 你会得到一个名为“javaX”的别名;其中 'X' 是 java 版本(下面 sn-p 中的 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
【讨论】:
【参考方案14】:要安装更新版本的 OpenJDK,我使用它。 OpenJDK 14 示例:
brew info adoptopenjdk
brew tap adoptopenjdk/openjdk
brew cask install adoptopenjdk14
有关当前信息,请参阅https://github.com/AdoptOpenJDK/homebrew-openjdk。
【讨论】:
【参考方案15】:我按照以下链接中的步骤操作 - https://medium.com/@euedofia/fix-default-java-version-on-maven-on-mac-os-x-156cf5930078,它对我有用。
cd /usr/local/Cellar/maven/3.5.4/bin/
nano mvn
--Update JAVA_HOME -> "$JAVA_HOME:-$(/usr/libexec/java_home)"
mvn -version
【讨论】:
【参考方案16】:通过 Homebrew 安装 Java 的新命令:
brew cask install adoptopenjdk/openjdk/adoptopenjdk8
brew cask install adoptopenjdk/openjdk/adoptopenjdk11
查看homebrew-openjdk repo 获取最新命令。
安装 Java
您可以通过 Homebrew、Jabba、SDKMAN 或手动安装 Java。有关所有命令的详细信息,请参阅this answer。
切换 Java 版本*
您可以使用jenv Jabba、SDKMAN 或手动切换 Java 版本。查看所有切换命令的详细信息here。
最佳解决方案
Jabba 专为在多个平台上工作而设计,因此如果您想要一个也可以在 Windows 上工作的解决方案,这是一个不错的选择 使用 Homebrew 下载 Java 版本并使用 jenv 切换版本提供了一个很好的工作流程。 jenv 可以轻松处理存储在计算机上任何目录中的 Java 版本,因此如果您有兴趣将 Java 存储在非默认目录中,它是一个不错的选择。 使用 SDKMAN 下载 Java 和切换版本是另一个不错的选择 应避免手动切换,因为这是不必要的头痛。手动切换Java版本的功能
这是用于手动切换 Java 版本的 Bash / ZSH 函数(OpenJDK):
jdk()
version=$1
export JAVA_HOME=$(/usr/libexec/java_home -v"$version");
java -version
有很多用于切换 Java 版本的工具,所以我强烈建议不要手动操作。
【讨论】:
【参考方案17】:这是一个很棒的教程 https://medium.com/@chamikakasun/how-to-manage-multiple-java-version-in-macos-e5421345f6d0 通过使用 brew 安装的 jEnv
或者你可以查看 homebrew-openjdk https://github.com/AdoptOpenJDK/homebrew-openjdk 使用 brew Tap 管理版本
【讨论】:
【参考方案18】:我知道这个问题已经有很多答案了,但我只想分享我的解决方案,只使用 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
(更改为所需的 Java 版本。像这样JD-GUI example)
享受
【讨论】:
以上是关于Mac OS X 和多个 Java 版本的主要内容,如果未能解决你的问题,请参考以下文章
如何在 MAC OS X 10.7 Lion 上安装多个 XAMPP 版本或多个 PHP 版本