摘要
我遵循了这个答案中给出的建议,创建了别名,使我能够在macOS上的JVM版本之间快速切换。我已经与这篇文章进行了交叉核对,这篇文章提出了类似的解决方案。这适用于Java15,但不适用于Java8。详见下文。
详细信息
macOS版本的详细信息:
$ sw_vers
ProductName: macOS
ProductVersion: 12.1
BuildVersion: 21C52
已安装Java版本的详细信息:
$ java --version
java version "15.0.1" 2020-10-20
Java(TM) SE Runtime Environment (build 15.0.1+9-18)
Java HotSpot(TM) 64-Bit Server VM (build 15.0.1+9-18, mixed mode, sharing)
$ /usr/libexec/java_home -V
Matching Java Virtual Machines (3):
15.0.1 (x86_64) "Oracle Corporation" - "Java SE 15.0.1" /Library/Java/JavaVirtualMachines/jdk-15.0.1.jdk/Contents/Home
1.8.301.09 (x86_64) "Oracle Corporation" - "Java" /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home
1.8.0_292 (x86_64) "AdoptOpenJDK" - "AdoptOpenJDK 8" /Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home
/Library/Java/JavaVirtualMachines/jdk-15.0.1.jdk/Contents/Home
这是我的.zshrc
:
# Aliases to quickly change active JVM version
export JAVA_8_HOME=$(/usr/libexec/java_home -v 1.8)
export JAVA_15_HOME=$(/usr/libexec/java_home -v 15)
alias java8="export JAVA_HOME=$JAVA_8_HOME"
alias java15="export JAVA_HOME=$JAVA_15_HOME"
# Set default to Java 15
java15
当我获取.zshrc
文件时,没有任何错误。
然而,当我运行别名java8
时,我会得到以下错误:
$ java8
export: not valid in this context: Plug-Ins/JavaAppletPlugin.plugin/Contents/Home
活动的Java版本没有改变,也就是说,它仍然是15.0.1(我的默认版本(。
起初,我怀疑我化名中的版本号是错误的。我已尝试将.zshrc
中的名称更改为完全限定名称(1.8.0_292
(:
export JAVA_8_HOME=$(/usr/libexec/java_home -v 1.8.0_292)
alias java8="export JAVA_HOME=$JAVA_8_HOME"
当我再次运行别名java8
时,在获取更新的.zshrc
之后,我不再收到错误。但现在我的Java环境处于崩溃状态:
$ java --version
Unrecognized option: --version
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
不过$JAVA_HOME
更新了,所以至少别名现在可以工作了:
$ echo $JAVA_HOME
/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home
幸运的是,我可以使用我的另一个别名java15
使我的环境恢复到工作状态:
$ java15
$ echo $JAVA_HOME
/Library/Java/JavaVirtualMachines/jdk-15.0.1.jdk/Contents/Home
$ java --version
java 15.0.1 2020-10-20
Java(TM) SE Runtime Environment (build 15.0.1+9-18)
Java HotSpot(TM) 64-Bit Server VM (build 15.0.1+9-18, mixed mode, sharing)
这表明别名确实在工作,至少java15
是这样。但是,由于某种原因,CCD_;拒绝";至";激活;无论我在别名中输入的版本号是什么。
请注意,我已经安装了Java 8的OpenJDK版本,因为Oracle的版本不再在他们的网站上提供,也不再通过Homebrew提供。
这正是我在系统上安装Java 8的方式,以防万一:
$ brew tap adoptopenjdk/openjdk
$ brew install adoptopenjdk8
最后,我能够通过";手动";为特定命令指定它,例如在使用Clojure/Leiningen时。例如,这很好:
$ JAVA_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home lein repl
这表明Java 8安装确实工作正常,而且问题只是与我的环境和.zshrc
有关。
更新
我发现了jEnv,并尝试使用它来代替别名。
不幸的是,这导致了同样的问题:
$ brew install openjdk@8
$ jenv add /usr/local/opt/openjdk@8/libexec/openjdk.jdk/Contents/Home
openjdk64-1.8.0.312 added
1.8.0.312 added
1.8 added
$ jenv local 1.8
$ jenv versions
system
* 1.8 (set by /Users/my-username/my-project-dir/.java-version)
1.8.0.312
15
15.0
15.0.1
17
17.0
17.0.1
openjdk64-1.8.0.312
openjdk64-17.0.1
oracle64-15.0.1
$ java --version
Unrecognized option: --version
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
天哪…答案一直在我眼前:
"无法识别的选项:--version";
对于Java 8,命令--version
无效。相反,我不得不使用-version
。较新版本的Java支持这两个命令(带有一两个-
(,这让我很反感
$ jenv global 17
$ java --version
openjdk 17.0.1 2021-10-19
OpenJDK Runtime Environment Homebrew (build 17.0.1+1)
OpenJDK 64-Bit Server VM Homebrew (build 17.0.1+1, mixed mode, sharing)
$ java -version
openjdk version "17.0.1" 2021-10-19
OpenJDK Runtime Environment Homebrew (build 17.0.1+1)
OpenJDK 64-Bit Server VM Homebrew (build 17.0.1+1, mixed mode, sharing)
$ jenv global 1.8
$ java --version
Unrecognized option: --version
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
$ java -version
openjdk version "1.8.0_312"
OpenJDK Runtime Environment (build 1.8.0_312-bre_2022_01_01_23_04-b00)
OpenJDK 64-Bit Server VM (build 25.312-b00, mixed mode)
这是我一段时间以来犯的最愚蠢的错误。