macOS Monterey运行jshell/jenv shell报错无法定位支持的Java运行时
macOS Monterey下jshell、jenv shell报错排查
问题背景
在macOS Monterey系统上运行jshell或jenv shell命令时遇到报错,已执行jenv enable-plugin export命令仍未解决,相关报错信息与环境配置如下:
报错详情
jshell执行报错
jshell The operation couldn’t be completed. Unable to locate a Java Runtime that supports jshell. Please visit http://www.java.com for information on installing Java.
jenv shell执行报错
jenv shell jenv: no shell-specific version configured
当前环境配置
- Java版本(执行
java -version返回结果):
openjdk version "1.8.0_292" OpenJDK Runtime Environment (AdoptOpenJDK)(build 1.8.0_292-b10) OpenJDK 64-Bit Server VM (AdoptOpenJDK)(build 25.292-b10, mixed mode)
- Jenv版本(执行
jenv --version返回结果):
jenv 0.5.5
- Jenv管理的Java版本列表(执行
jenv versions返回结果):
system 1.8 1.8.0.292 * openjdk64-1.8.0.292 (set by /Users/user/.jenv/version)
- Jenv环境检测结果(执行
jenv doctor返回结果):
[OK] JAVA_HOME variable probably set by jenv PROMPT [OK] Java binaries in path are jenv shims [OK] Jenv is correctly loaded
- Java路径查询结果(执行
which java返回结果):
/Users/user/.jenv/shims/java
- .zshrc配置中jenv相关内容:
JENV_PATH=/Users/user/.jenv/bin export PATH=$ANDROID_TOOLS:$ANDROID_SDK:$JENV_PATH:$PATH eval "$(jenv init -)"
排查解决方案
- jshell报错根因:当前激活的JDK 8版本不包含jshell工具
jshell是Java 9及以上版本才内置的交互式REPL工具,JDK 8的发行包内不存在这个可执行文件,和jenv配置是否正确没有关系,仅靠调整JDK 8的环境变量永远无法运行jshell。
解决步骤:- 安装JDK 9及以上版本,优先选择JDK 11、JDK 17这类长期支持版本,比如通过Homebrew安装可执行
brew install openjdk@17 - 将新安装的高版本JDK添加到jenv管理列表,命令格式为
jenv add <JDK安装目录下的Home文件夹路径>,例如默认Homebrew安装的openjdk17路径为/Library/Java/JavaVirtualMachines/openjdk-17.jdk/Contents/Home - 按需切换JDK版本:全局默认切换执行
jenv global openjdk64-17,仅当前终端会话临时切换执行jenv shell openjdk64-17 - 执行
source ~/.zshrc重载配置后,再运行jshell即可正常启动
- 安装JDK 9及以上版本,优先选择JDK 11、JDK 17这类长期支持版本,比如通过Homebrew安装可执行
- jenv shell报错根因:未给当前shell会话指定专属Java版本
这个提示不是配置故障,属于jenv的正常逻辑:直接执行不带版本参数的jenv shell命令时,jenv会检测当前会话是否设置过临时版本,没有设置就会返回该提示,此时终端默认使用全局配置或者当前目录下配置的Java版本。
如果需要给当前shell会话指定版本,在命令后追加对应版本号即可,例如jenv shell 1.8.0.292,设置完成后再执行jenv shell就会显示当前会话绑定的版本,不会再弹出该提示。 - 配置校验补充
执行jenv enable-plugin export后必须重载shell配置或者重启终端才能让插件生效,可以执行echo $JAVA_HOME验证输出路径是否和jenv当前选中的JDK路径一致,避免JAVA_HOME指向旧版本路径引发其他Java相关命令异常。
内容的提问来源于stack exchange,提问作者MicFin
相关产品推荐
相关产品推荐

