Java程序使用Alpine Linux報錯java.lang.NoClassDefFoundError: Could not initialize class org.xerial.snappy.Snappy解決


報錯內容

Caused by: java.lang.UnsatisfiedLinkError: /tmp/snappy-1.1.7-4a4b576a-c34c-481e-b6ac-9b4abacb112e-libsnappyjava.so: 
Error loading shared library ld-linux-x86-64.so.2: 
No such file or directory (needed by /tmp/snappy-1.1.7-4a4b576a-c34c-481e-b6ac-9b4abacb112e-libsnappyjava.so)

nested exception is java.lang.NoClassDefFoundError: Could not initialize class org.xerial.snappy.Snappy
org.springframework.web.util.NestedServletException: Handler dispatch failed; 
nested exception is java.lang.NoClassDefFoundError: Could not initialize class org.xerial.snappy.Snappy

描述

由於項目中使用了org.xerial.snappy.Snappy這個類,在正常的centos系統環境下,沒有問題;在微服務容器(openjdk:8-jdk-alpine)測試的時候發現有一個功能不正常,爬出了以上重要的日志

發現org.xerial.snappy.Snappy這個類無法初始化,日志往上查發現了真實的情況,即java.lang.UnsatisfiedLinkError: /tmp/snappy-1.1.7-4a4b576a-c34c-481e-b6ac-9b4abacb112e-libsnappyjava.so: Error loading shared library ld-linux-x86-64.so.2: No such file or directory (needed by /tmp/snappy-1.1.7-4a4b576a-c34c-481e-b6ac-9b4abacb112e-libsnappyjava.so

通過這個信息可以定位出是未找到ld-linux-x86-64.so庫

解決方式

由於openjdk:8-jdk-alpine容器使用的是Alpine Linux,經多方查找,可以使用以下方式解決

創建軟連接,如果/lib目錄下有linux-x86-64.so.2可以不用執行后邊的操作,沒有則需要繼續安裝
ln -s /lib /lib64

並安裝多個庫
apk add --no-cache bash tini libc6-compat linux-pam krb5 krb5-libs

bash不是必須的,只是用起來方便

最后添加到Dockerfile中如下

參考

https://issues.apache.org/jira/browse/SPARK-26995
https://github.com/apache/spark/pull/23898
https://github.com/rluta/spark/commit/f3f3b6353874bd19aa5c720a4a55ccebf29cafb1


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM