无法在 macOS 上创建 Z shell 别名以"activate" Java 8 (OpenJDK)



摘要

我遵循了这个答案中给出的建议,创建了别名,使我能够在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)

这是我一段时间以来犯的最愚蠢的错误。

最新更新