运行应用时遇java.lang.UnsatisfiedLinkError错误求解决方案(snappy-java)
java.lang.UnsatisfiedLinkError 针对snappy-java-1.1.9.0的方案 错误详情
Exception in thread "main" java.lang.UnsatisfiedLinkError: 'int org.xerial.snappy.SnappyNative.maxCompressedLength(int)' at org.xerial.snappy.SnappyNative.maxCompressedLength(Native Method) at org.xerial.snappy.Snappy.maxCompressedLength(Snappy.java:381) at org.xerial.snappy.SnappyOutputStream.<init>(SnappyOutputStream.java:99) at org.xerial.snappy.SnappyOutputStream.<init>(SnappyOutputStream.java:91) at org.xerial.snappy.SnappyOutputStream.<init>(SnappyOutputStream.java:81) at org.apache.beam.sdk.util.SerializableUtils.serializeToByteArray(SerializableUtils.java:54) at org.apache.beam.sdk.util.SerializableUtils.clone(SerializableUtils.java:117)
该错误源于snappy-java的本地库(对应不同操作系统/架构的二进制文件)无法正确加载或版本不匹配,针对你使用的1.1.9.0版本,可尝试以下解决方法:
升级snappy-java版本:1.1.9.0属于较旧版本,存在不少平台兼容性问题。建议升级到稳定新版本(如1.1.10.1及以上),新版本修复了大量本地库适配问题,能自动匹配更多系统架构。修改项目依赖配置(Maven的
pom.xml或Gradle的build.gradle),替换版本号后重新构建项目。手动指定本地库路径:若无法升级版本,可手动下载与你操作系统、架构匹配的snappy本地库(
.dll/.so/.dylib),通过JVM参数指定库路径:-Djava.library.path=/path/to/your/native/library务必保证下载的本地库与snappy-java-1.1.9.0版本完全一致,否则会出现版本不兼容问题。
检查系统架构与JVM位数匹配:确认JVM位数(32位/64位)与操作系统架构一致,snappy-java本地库对位数敏感。64位JVM必须搭配64位本地库,32位同理。可通过
java -version命令查看JVM位数信息。排除冲突依赖:排查项目中是否存在多版本snappy-java依赖,或其他依赖引入了不兼容的snappy版本。使用依赖分析工具(如Maven的
dependency:tree、Gradle的dependencies命令)找出冲突,排除不兼容版本,统一保留1.1.9.0或升级后的版本。启用纯Java fallback实现:snappy-java提供纯Java实现作为备选,可通过系统参数强制启用:
-Dorg.xerial.snappy.use.systemlib=false该方案会牺牲部分性能,但能完全避免本地库加载问题,适合对性能要求不高的场景。
内容的提问来源于stack exchange,提问作者neha

