最近一直为这个 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=value | set -gx VAR value |
| 删除环境变量 | unset VAR | set -e VAR |
| 临时变量 | VAR=value command | env VAR=value command |
| 查看所有变量 | printenv | set -x |
| 添加 PATH | export PATH=$PATH:/new/path | set -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直接测试无环境变量的状态。