无法在 macOS 上为 "activate" Java 8 (OpenJDK) 创建 Z shell 别名
Unable to create Z shell alias to "activate" Java 8 (OpenJDK) on macOS
总结
我已关注 the advice given in this answer to create aliases which allow me to quickly switch between JVM versions on macOS. And I have cross-checked with this article,它提出了类似的解决方案。这适用于 Java 15,但不适用于 Java 8。请参阅下面的详细信息。
详情
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
。但是,出于某种原因,无论我在别名中输入什么版本号,java8
“拒绝”“激活”。
请注意,我已经为 Java 8 安装了 OpenJDK 版本,因为 Oracle 的版本在他们的网站上不再可用,也无法通过 Homebrew 获得。
这正是我在系统上安装 Java 8 的方式,以防万一:
$ brew tap adoptopenjdk/openjdk
$ brew install adoptopenjdk8
最后,我可以通过“手动”为特定命令指定它来使用 Java 8,例如,在使用 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.
我的天啊……答案一直就在我眼前:
"Unrecognized option: --version"
用Java8,命令--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)
这是我这一段时间以来犯的最愚蠢的错误。
总结
我已关注 the advice given in this answer to create aliases which allow me to quickly switch between JVM versions on macOS. And I have cross-checked with this article,它提出了类似的解决方案。这适用于 Java 15,但不适用于 Java 8。请参阅下面的详细信息。
详情
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
。但是,出于某种原因,无论我在别名中输入什么版本号,java8
“拒绝”“激活”。
请注意,我已经为 Java 8 安装了 OpenJDK 版本,因为 Oracle 的版本在他们的网站上不再可用,也无法通过 Homebrew 获得。
这正是我在系统上安装 Java 8 的方式,以防万一:
$ brew tap adoptopenjdk/openjdk
$ brew install adoptopenjdk8
最后,我可以通过“手动”为特定命令指定它来使用 Java 8,例如,在使用 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.
我的天啊……答案一直就在我眼前:
"Unrecognized option: --version"
用Java8,命令--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)
这是我这一段时间以来犯的最愚蠢的错误。