준호씨의 블로그

OSX - M1 개발환경 오류 snappy-java - [FAILED_TO_LOAD_NATIVE_LIBRARY] no native library is found for os.name=Mac and os.arch=aarch6. #gradle특정모듈버전변경하기 본문

개발이야기

OSX - M1 개발환경 오류 snappy-java - [FAILED_TO_LOAD_NATIVE_LIBRARY] no native library is found for os.name=Mac and os.arch=aarch6. #gradle특정모듈버전변경하기

준호씨 2022. 8. 9. 23:15
반응형

얼마 전 지급받은 M1맥북에서 개발환경을 세팅하면서 겪은 이슈들을 하나씩 적어보려고 합니다.

 

Spring Boot 2.5.xx를 사용하는 프로젝트인데 서비스를 구동시키니 다음과 같은 에러가 발생하였습니다.

2022-08-09 19:32:09.007 ERROR 34738 --- [container-0-C-1] o.s.k.l.KafkaMessageListenerContainer    : Error while stopping the container: 

org.xerial.snappy.SnappyError: [FAILED_TO_LOAD_NATIVE_LIBRARY] no native library is found for os.name=Mac and os.arch=aarch64
...

문구를 보면 os.name=Mac, os.arch=aarch64에 맞는 native library를 찾지 못했다고 합니다.

Snappy에 대해 찾아보면 구글이 만든 압축 라이브러리이고 snappy-java는 Java로 포팅 한 것이라고 합니다.

 

spring-kafka > kafka-clients > snappy-java 순서로 참조하고 있습니다.

snappy-java github에 들어가 보면 1.1.8.2에서 M1을 지원하도록 패치가 되었다고 합니다.

https://github.com/xerial/snappy-java/releases/tag/1.1.8.2

 

Release 1.1.8.2 · xerial/snappy-java

Support Apple Silicon (M1, Mac-aarch64) Fixed the pure-java Snappy fallback logic when no native library for your platform is found.

github.com

현재 최신 버전은 1.1.8.4이니 1.1.8.4를 사용해보겠습니다.

 

Spring Boot버전을 올리면 snappy-java 버전도 올라가지만 Spring Boot를 버전업 하기 어려운 상황이라면 snappy-java만 버전을 바꿔주어야 합니다.

build.gradle.kts를 사용하기 때문에 다음과 같이 추가해 주었습니다.

implementation("org.xerial.snappy:snappy-java:1.1.8.4")

추가해 주고 나서는 오류가 발생하지 않았습니다. 다만 디펜던시 범위가 전체로 늘어났습니다.

spring-kafka 말고 모든 곳에 snappy-java의존 관계가 있는 것처럼 보입니다. 게다가 어떤 곳은 충돌이 난다고 나옵니다.

 

충돌이 난다고 하니 뭔가 찜찜합니다. 단순히 의존성을 추가하는 것이 아니고 기존에 1.1.7.7을 사용하던 부분을 1.1.8.4로 바꿀 방법 없을까요? 앞서 추가했던 implementatoin 설정을 제거하고 다음 설정으로 바꿔줍니다.

configurations.all {
    resolutionStrategy.eachDependency {
        if (requested.group == "org.xerial.snappy" && requested.name == "snappy-java" && requested.version == "1.1.7.7") {
            useVersion("1.1.8.4")
            because("support M1")
        }
    }
}

1.1.7.7이 보이면 1.1.8.4로 바꿔버립니다.

깔끔하네요.

기존에 conflict 나던 부분도 깔끔하게 나옵니다.

급한 대로 해결하긴 했지만 사실 임시방편일 뿐입니다. 이런 설정들이 많이 생기면 프로젝트가 불필요하게 지저분해집니다. 가급적이면 빠른 시일 내에 Spring Boot를 버전 업해서 관련 라이브러리들을 같이 버전업 시켜버리는 것이 좋을 거 같습니다.

 

참고

특정 디펜던시의 버전만 변경하는 설정에 대한 gradle공식 문서입니다.

https://docs.gradle.org/current/userguide/resolution_rules.html#sec:denying_version

 

Customizing resolution of a dependency directly

Gradle’s Ivy repository implementations support the equivalent to Ivy’s dynamic resolve mode. Normally, Gradle will use the rev attribute for each dependency definition included in an ivy.xml file. In dynamic resolve mode, Gradle will instead prefer th

docs.gradle.org

 

반응형
Comments