如何在Mac上让窗口化应用使用SDKMAN安装的JDK
macOS 从启动台、Dock、Finder 直接启动的窗口化应用、.pkg 图形安装器,不会读取 Shell 配置文件(~/.zshrc/~/.bashrc/~/.zprofile 等)中配置的环境变量。SDKMAN 默认将 JAVA_HOME、JDK 路径相关的配置写入 Shell 配置文件,仅对终端内启动的进程生效,因此窗口类程序无法识别到已安装的JDK。
macOS 自带的Java环境探测逻辑会自动扫描 /Library/Java/JavaVirtualMachines/ 目录下的合法JDK包,只需要把SDKMAN安装的JDK软链到这个目录即可,操作步骤:
- 终端执行命令查询当前SDKMAN默认JDK的真实路径:
readlink -f ~/.sdkman/candidates/java/current
执行后会返回类似 /Users/xxx/.sdkman/candidates/java/17.0.12-tem 的路径,复制该路径备用。
2. 执行命令创建软链,将SDKMAN的JDK注册到系统全局JDK目录,需要输入当前用户的开机密码:
sudo ln -s 上一步复制的JDK真实路径 /Library/Java/JavaVirtualMachines/sdkman-managed.jdk
- 验证配置是否生效,终端执行:
/usr/libexec/java_home
如果正常返回你刚才软链的JDK路径,配置就完成了,所有窗口应用、pkg安装器都能正常识别到JDK。
后续如果通过SDKMAN切换了默认JDK版本,只需要先删除旧的软链
sudo rm /Library/Java/JavaVirtualMachines/sdkman-managed.jdk,再按上述步骤重新创建指向新版本的软链即可。
如果不想做全局配置,可以按需选择以下方式:
- 临时给当前登录会话的所有GUI应用注入JAVA_HOME:终端执行
launchctl setenv JAVA_HOME "$HOME/.sdkman/candidates/java/current",该配置在系统重启后会失效。 - 单应用指定JDK:找到对应窗口应用,右键选择「显示包内容」,打开
Contents/Info.plist文件,找到JVMRuntime配置项,直接填入SDKMAN安装的JDK绝对路径即可,该配置仅对当前应用生效。
注意:不要尝试将SDKMAN的初始化脚本写入/etc/profile等全局Shell配置文件,GUI应用不会加载这类配置,无法解决问题。
内容的提问来源于stack exchange,提问作者JuanKB1024

