最近换了 Apple M1 的笔记本,发现项目运行不起来了,报了下面的错误
Exception in thread "main" java.lang.UnsatisfiedLinkError: Could not load library. Reasons: [no leveldbjni64-1.8 in java.library.path, no leveldbjni-1.8 in java.library.path, no leveldbjni in java.library.path, Can't load library: /var/folders/xp/zk2t87gj4q9263w39qk0mt380000gn/T/libleveldbjni-64-1-4043507736212128273.8]
看报错原因是找不到 leveldbjni 文件到导致的,但是我的项目中已经引用了 leveljni 包,而且之前运行都是没问题的
<dependency>
<groupId>org.fusesource.leveldbjni</groupId>
<artifactId>leveldbjni-all</artifactId>
<version>1.8</version>
</dependency>
查找资料发现,是因为我最近换了 Mac M1 的电脑,M1 是基于 arm64 架构的,而 leveldbjni-all 这个依赖,并不支持 arm64 架构,这就是报错的由来
好了,既然知道报错的原因,解决方案也很明确,找一下 leveldbjin 有没有发布新版本,支持 arm64 架构,但当我去 github 找到这个项目的时候,发现该项目已经停止维护了,最近一次提交时间是 7 年前,最新的 release 版本也是 1.8
issue 列表中也有人有人提过这个问题
arm64 跟 aarch64 本质上是同个东西,只是叫法不同
然后这个小哥基于人家给的教程重新构建了支持 aarch64 架构的 jar
issue 链接:https://github.com/fusesource/leveldbjni/issues/102
但是我用这个老哥的 jar 还是报一样的错误,既然有人重新构建了 jar,那么也应该会有其他人构建。基于这个思路,到 maven 仓库中找找。结果果真被我找到了支持 arm64 架构的 jar
用这个依赖替换原本的 leveldbjni-all,项目启动成功了,各项功能也正常
<!-- https://mvnrepository.com/artifact/io.github.tronprotocol/leveldbjni-all -->
<dependency>
<groupId>io.github.tronprotocol</groupId>
<artifactId>leveldbjni-all</artifactId>
<version>1.18.3</version>
</dependency>
总结这次经验,尽管解决方案看似简单,但在实际开发过程中,面对此类架构兼容性问题时,快速定位问题并找到合适的解决方案显得尤为重要,所以拿出来跟大家分享
原文始发于微信公众号(huangxy):Apple M1 架构 LevelDB JNI 库加载失败问题及解决方案
暂无评论内容