如何在Mac上更改Java的默认版本?
以下内容来自苹果公司官方java_home(1)手册页:
**USAGE**
/usr/libexec/java_home helps users set a $JAVA_HOME in their login rc files, or provides a way for
command-line Java tools to use the most appropriate JVM which can satisfy a minimum version or archi-
tecture requirement. The --exec argument can invoke tools in the selected $JAVA_HOME/bin directory,
which is useful for starting Java command-line tools from launchd plists without hardcoding the full
path to the Java command-line tool.
Usage for bash-style shells:
$ export JAVA_HOME=`/usr/libexec/java_home`
Usage for csh-style shells:
% setenv JAVA_HOME `/usr/libexec/java_home`
运行
/usr/libexec/java_home -V
Matching Java Virtual Machines (3):
17.0.7 (x86_64) "Amazon.com Inc." - "Amazon Corretto 17" /Library/Java/JavaVirtualMachines/amazon-corretto-17.jdk/Contents/Home
11.0.19 (x86_64) "Amazon.com Inc." - "Amazon Corretto 11" /Users/abhishek.khaiwale/Library/Java/JavaVirtualMachines/corretto-11.0.19/Contents/Home
11.0.19 (x86_64) "Amazon.com Inc." - "Amazon Corretto 11" /Library/Java/JavaVirtualMachines/amazon-corretto-11.jdk/Contents/Home
export JAVA_HOME=`/usr/libexec/java_home -v 11.0.19`
首先找出你存储环境变量的位置:
设置环境变量的步骤如下:
从JAVA下载JDK。
双击安装。
现在在你的文件中设置环境变量。
a. 对于emacs.profile,您可以使用此链接或查看下面的截图。
b. 对于ZSH配置文件设置 -
1. export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_112.jdk/Contents/Home
2. source ~/.zshrc - Restart zshrc to reflect the changes.
3. echo $JAVA_HOME - make sure path is set up properly
----> /Library/Java/JavaVirtualMachines/jdk1.8.0_112.jdk/Contents/Home
4. java -version
--> java version "1.8.0_112" Java(TM) SE Runtime Environment (build 1.8.0_112-b16)Java HotSpot(TM) 64-Bit Server VM (build 25.112-b16, mixed mode)
现在已经准备好了,您可以轻松地升级或降级JAVA版本。
如果您仍然无法设置它,可以使用以下命令:
export JAVA_HOME=/usr/libexec/java_home -v 1.8
然后您需要使用以下命令:
export JAVA_HOME=$( /usr/libexec/java_home -v 1.8)
这样一定会起作用。
以前我在 .zshrc 中使用别名来方便地切换版本,但今天我使用 SDKMAN 。 SDKMAN 还可以处理设置系统默认 java ,下载和安装新的 java 版本。
一旦安装了 sdkman ,您就可以执行类似于 nvm 工具处理 node 版本的命令。
sdk list java
将列出系统中可用的 java 版本以及可在线安装的版本,包括您可以在 sdk use
, sdk default
和 sdk install
命令中使用的标识符。
例如,要安装 Amazon Corretto 11.0.8 并询问是否应该成为新的默认值,请执行以下操作:
sdk install java 11.0.8-amzn
我经常使用的一个功能是 .sdkmanrc 文件。
如果将其放置在计算机上的某个目录中并在该目录中运行 sdk env
命令,则可以配置仅在该目录中使用的工具版本。还可以使用 sdkman_auto_env=true
配置使 sdkman 自动切换工具版本。
sdkman 还支持处理 JVM 的其他工具,如 gradle、kotlin、maven 等。
有关更多信息,请查看https://sdkman.io/usage#env
无需安装其他工具,将分别安装的JDK识别为/usr/libexec/java_home -V
的一级成员的简单方法是创建符号链接,操作如下:
sudo ln -s <path> /Library/Java/JavaVirtualMachines/jdk-[some-identifier].jdk
<path>
预计是一个包含子目录Contents/Home/bin
等的目录。
常见用例是注册Android Studio附带的JDK/JRE:
在最近版本的macOS Android Studio中,Java工具的默认位置是/Applications/Android\ Studio.app/Contents/jre
。我们将使用jdk-android-studio.jdk
作为标识符:
sudo ln -s /Applications/Android\ Studio.app/Contents/jre /Library/Java/JavaVirtualMachines/jdk-android-studio.jdk
/usr/libexec/java_home -V
将会在 匹配的Java虚拟机
中列出它:$ /usr/libexec/java_home -V
Matching Java Virtual Machines (1):
11.0.13 (arm64) "JetBrains s.r.o." - "OpenJDK 11.0.13" /Applications/Android Studio.app/Contents/jre/Contents/Home
/Applications/Android Studio.app/Contents/jre/Contents/Home
alias j8="jhome -v 1.8.0_162"
alias j9="jhome -v 9.0.1"
function jhome
set -g -x JAVA_HOME (/usr/libexec/java_home $argv)
echo "JAVA_HOME:" $JAVA_HOME
echo "java -version:"
java -version
end
funcsave jhome
要知道您安装的是哪个版本/次要版本,可以执行以下操作:
/usr/libexec/java_home -V 579ms Wed 14 Feb 11:44:01 2018
Matching Java Virtual Machines (3):
9.0.1, x86_64: "Java SE 9.0.1" /Library/Java/JavaVirtualMachines/jdk-9.0.1.jdk/Contents/Home
1.8.0_162, x86_64: "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_162.jdk/Contents/Home
1.8.0_121, x86_64: "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home
本文将指导您如何在MacOS设备上切换JAVA版本。这对于使用不支持更新的JAVA版本的应用程序非常有用。例如,像Cassandra这样的应用程序只能与JAVA 8版本一起使用。
首先,您需要确保已安装多个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,则输入以下行:
export JAVA_HOME=/usr/libexec/java_home -v 1.8
对于11.0,将“1.8”替换为“11.0”
通过在终端中输入以下内容来检查您的JDK版本:
java -version
如果您已正确执行所有步骤,则JDK版本应与您在最后一步指定的版本相对应。
(可选)要将此设置为默认的JDK版本,请在终端中输入以下内容:
open ~/.bash_profile
接着,将第三步的终端输入添加到此文件中:
export JAVA_HOME=`/usr/libexec/java_home -v 1.8`
保存并关闭文件。
完成。
/usr/libexec/java_home -v 1.7.0_75 --exec java -jar you-file.jar
这是我在我的Linux(Ubuntu / Mint mate)上的做法,我猜Mac可以类似地做。
步骤:
/mnt/star/program/java/jdk-1.8
ln -s /mnt/star/program/java/jdk-1.8 /mnt/star/program/java/java
/mnt/star/program/java/java
是软链接。JAVA_HOME
。/etc/profile.d/eric.sh
这样的文件,或者只使用~/.bashrc
。JAVA_HOME=/mnt/star/program/java/java
java -version
应该会打印出java版本。/mnt/star/program/java/jdk-11
~/.bashrc
中定义各种Java版本的变量。_E_JAVA_HOME_11='/mnt/star/program/java/jdk-11'
_E_JAVA_HOME_8='/mnt/star/program/java/jdk-8'
# 默认版本目录,
_E_JAVA_HOME_D=$_E_JAVA_HOME_8
~/.bashrc
中,定义切换Java版本的命令。## 切换java版本,
alias jv11="rm $JAVA_HOME; ln -s $_E_JAVA_HOME_11 $JAVA_HOME"
alias jv8="rm $JAVA_HOME; ln -s $_E_JAVA_HOME_8 $JAVA_HOME"
# 默认java版本,
alias jvd="rm $JAVA_HOME; ln -s $_E_JAVA_HOME_D $JAVA_HOME"
alias jv="java -version"
source ~/.bashrc
命令使更改生效。命令:
jv11
jv8
jvd
_E_JAVA_HOME_D
表示。jv
eric@eric-pc:~$ jv
java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)
eric@eric-pc:~$ jv11
eric@eric-pc:~$ jv
java version "11.0.1" 2018-10-16 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.1+13-LTS)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.1+13-LTS, mixed mode)
eric@eric-pc:~$ jvd
eric@eric-pc:~$ jv
java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)
eric@eric-pc:~$
JAVA_HOME
。在我的机器上手动安装jdk时,我保留了次要版本号,然后使用主要版本但不包括次要版本创建了一个软链接。
例如
//这是实际的目录,
jdk1.8.0_191
//这是到jdk1.8.0_191
的软链接
jdk-8
//这是到jdk-8
或jdk-11
的软链接
java
我在~/.bashrc
中定义命令别名,但在单独的文件中定义变量。
我使用~/.eric_var
来定义变量,并且~/.bashrc
将对其进行源化(例如source $HOME/.eric_var
)。
/usr/libexec/java_home
命令会告诉你什么? - Bart