最近一直为这个 Java 的配置问题烦恼,安装了无数次,也使用了 mise、sdkman 等 Java 环境的配置工具,一直不得其法。

最初发现问题,是用 brew 安装了 libzip 库

现在看 (2025-08-11 22:54:49),极有可能是因为安装了 tldr,因为这个东东用到了 zlib 库,从而造成了 Java 连接到了 tldr 的 zlib 库,总归是因为版本的问题,从而造成了 Java 运行出错。

这个问题,搞了好长时间,我觉得至少有两周了。不过,好歹是顺利地解决了。赞!!

执行 ls-l/opt/homebrew/lib/libzip.*,显示内容为: lrwxr-xr-x woodman admin 44 B Mon May 26 07:47:26 2025  /opt/homebrew/lib/libzip. 5.5. Dylib ⇒ ../Cellar/libzip/1.11.4/lib/libzip. 5.5. Dylib lrwxr-xr-x woodman admin 42 B Mon May 26 07:47:26 2025  /opt/homebrew/lib/libzip. 5. Dylib ⇒ ../Cellar/libzip/1.11.4/lib/libzip. 5. Dylib lrwxr-xr-x woodman admin 40 B Mon May 26 07:47:26 2025  /opt/homebrew/lib/libzip. Dylib ⇒ ../Cellar/libzip/1.11.4/lib/libzip. Dylib 竟然有三个动态库文件,是不是与这些库文件有关系?

您的诊断非常准确!问题根源正是 /opt/homebrew/lib/ 下的这些 libzip 动态库文件。Java 运行时无意中加载了这些 Homebrew 版本的库(通过 java.library.path 路径),而非 JDK 自带的正确库版本,导致符号解析失败。

根本原因分析

从 ls 输出可见:

lrwxr-xr-x ... libzip.5.5.dylib ⇒ ../Cellar/libzip/1.11.4/lib/libzip.5.5.dylib
lrwxr-xr-x ... libzip.5.dylib ⇒ ../Cellar/libzip/1.11.4/lib/libzip.5.dylib
lrwxr-xr-x ... libzip.dylib ⇒ ../Cellar/libzip/1.11.4/lib/libzip.dylib
  • 这些是 Homebrew 安装的 libzip 1.11.4 版本
  • JDK 自带更旧/不兼容的 libzip 实现(用于 ZIP 文件处理)
  • Java 错误加载了 Homebrew 库而非 JDK 自带库

立即解决方案

方案一:安全移除冲突库(推荐)

# 备份冲突库(可选)
mkdir ~/libzip_backup
mv /opt/homebrew/lib/libzip.* ~/libzip_backup/

# 移除冲突库
sudo rm -f /opt/homebrew/lib/libzip.*

# 重建动态库缓存
sudo update_dyld_shared_cache -force

# 验证 Gradle
gradle -v

方案二:禁用 Homebrew libzip(保留文件)

# 重命名库文件使其不可被加载
sudo mv /opt/homebrew/lib/libzip.dylib /opt/homebrew/lib/libzip.dylib.disabled
sudo mv /opt/homebrew/lib/libzip.5.dylib /opt/homebrew/lib/libzip.5.dylib.disabled
sudo mv /opt/homebrew/lib/libzip.5.5.dylib /opt/homebrew/lib/libzip.5.5.dylib.disabled

# 立即生效
sudo update_dyld_shared_cache -force

后续预防措施

1. 确认库依赖关系

检查哪些程序依赖 Homebrew 的 libzip:

# 检查依赖 libzip 的 Homebrew 软件
brew uses --installed libzip

# 示例输出可能包含:
# php libmagic pcre2 ...

如果输出为空,说明可以安全移除

2. 重新安装受影响软件(如果需要)

# 列出依赖 libzip 的软件
brew deps --tree --installed | grep -B 3 'libzip'

# 重新安装这些软件
for formula in $(brew uses --installed libzip); do
  brew reinstall $formula
done

3. 完全卸载 Homebrew libzip

brew uninstall libzip
brew autoremove

验证修复结果

# 检查 libzip 是否成功禁用
ls /opt/homebrew/lib/libzip.*  # 应当显示无结果或已重命名的文件

# 检查 Java 库路径
java -XshowSettings:properties -version 2>&1 | grep java.library.path
# 现在不应包含 /opt/homebrew/lib

# 确认符号解析
nm /Library/Java/JavaVirtualMachines/temurin-17.jdk/Contents/Home/lib/libzip.dylib | grep ZIP_Open
# 应显示: T _ZIP_Open

# 最终测试
gradle -v

技术说明:为什么会出现冲突

JDK 自带库Homebrew 库冲突原因
/Library/Java/.../libzip.dylib/opt/homebrew/lib/libzip.dylib动态链接器(dyld)按路径顺序加载库
为 Java 内部使用优化通用系统级版本符号表不兼容
版本兼容 Java较新版本 (1.11.4)Java 期望特定的内部实现

解决关键:​确保系统在加载 Java 时找不到替代的 libzip 实现。大多数情况下只需移除 Homebrew 的 libzip 链接即可解决问题,而不会影响其他软件(除非明确依赖它的程序)。

结果是 gradle 也没办法用了

重新从 https://adoptium.net/temurin/releases网站下载了jdk-17的pkg安装包 ,也提示成功安装了,$JAVA_HOME也指向了17版本,运行java-version没问题了,但运行gradle-v依然报错: Error occurred during initialization of VM Could not resolve “ZIP_Open”: /Library/Java/JavaVirtualMachines/temurin-17.jdk/Contents/Home/lib/libzip.dylib

一直是对这个 zip 动态库文件报错,以下是解决方案,至少现在是可以运行 gradle 了。哈哈,是不是还有其它的问题,暂时还没发现。

而且连 sdkmanager 的问题,也顺便解决了。关键是连接到了不同版本的 zlib 库。中间又进行了无数次的修改,已经不知道到底是哪里出了问题。

在 Fish Shell 中确实没有 unset 命令(这是 Bash/Zsh 的命令),但您可以使用 set -e 命令实现相同效果。以下是针对您情况的 Fish Shell 解决方案:

修复环境变量的正确方式(Fish Shell 语法)

# 移除冲突的 DYLD_LIBRARY_PATH
set -e DYLD_LIBRARY_PATH

# 检查是否真正移除
echo $DYLD_LIBRARY_PATH  # 应显示空白行

# 添加正确的 JDK 库路径(临时方案)
set -x DYLD_LIBRARY_PATH /Library/Java/JavaVirtualMachines/temurin-17.jdk/Contents/Home/lib

# 立即测试 Gradle
gradle -v

永久修复方案(添加至 Fish 配置文件)

# 编辑配置文件
nvim ~/.config/fish/config.fish

# 添加以下内容:
set -gx DYLD_LIBRARY_PATH "/Library/Java/JavaVirtualMachines/temurin-17.jdk/Contents/Home/lib"

替代方案:删除冲突库(推荐长期方案)

# 备份并删除冲突库
sudo mv /opt/homebrew/lib/libzip.* ~/Documents/libzip_backup/

# 重建缓存
sudo update_dyld_shared_cache -force

# 检查环境
java -XshowSettings:properties -version 2>&1 | grep java.library.path

Fish Shell 环境管理常用命令汇总

功能Bash/Zsh 命令Fish Shell 等效命令
设置环境变量export VAR=valueset -gx VAR value
删除环境变量unset VARset -e VAR
临时变量VAR=value commandenv VAR=value command
查看所有变量printenvset -x
添加 PATHexport PATH=$PATH:/new/pathset -gx PATH $PATH /new/path

解决您问题的完整 Fish Shell 流程

# 1. 移除冲突库
sudo rm -f /opt/homebrew/lib/libzip.*

# 2. 清除错误的环境变量
set -e DYLD_LIBRARY_PATH

# 3. 重新配置 Java 环境
set -gx JAVA_HOME (path normalize /Library/Java/JavaVirtualMachines/temurin-17.jdk/Contents/Home)

# 4. 更新 Mise 环境
mise reshim --all
mise cache clean

# 5. 最终测试
gradle -v

Fish Shell 小技巧​:使用 functions 命令查看内置命令的源代码(如 functions set),可以更好地理解其工作原理。对于 Java/ Gradle 环境问题,建议用 env DYLD_LIBRARY_PATH= gradle -v 直接测试无环境变量的状态。