본문 바로가기
개발/Spring

[Spring] library dependency version이 바뀌는 이슈 해결

by 달사쿠 2022. 4. 12.
반응형

Intro

스프링 프로젝트에서 0.9버전의 old kafka 라이브러리(kafka_2.10:0.9.0.0)를 사용할 일이 있었는데요. 해당 라이브러리와 의존관계가 있는 kafka-client 버전이 로컬에서 0.9에서 2.3.1로 변경되는 것을 확인했습니다.
문제는 2.3.1 version이 붙어서 잘 되면 상관없지만... old kafka와 kafka 2.x의 인터페이스가 많이 바뀌었다보니 특정 메서드를 찾지 못하는 에러가 발생했습니다.

사실 단순히 0.9버전의 kafka-client lib의 디펜던시를 받아서 사용하면 문제는 해결되었는데요.
저의 경우엔 관련해서 프로젝트를 뒤져봐도 2.3.1버전의 kafka-client dependency를 추가하지 않았는데 2.3.1버전으로 잡히는 것이 이상하여 좀 더 찾아보기로 했습니다.


dependencyInsight

Gradle에서는 의존관계 트리를 볼 수 있도록 dependencies, dependencyInsight 등을 제공하는데요.
저는 kafka-client에 엮긴 의존관계만 확인하고 싶었기에 특정 의존성에 관해 상세 정보 출력해주는 dependencyInsight로 확인해봤습니다.

 ./gradlew common:dependencyInsight --dependency org.apache.kafka:kafka-clients

이렇게 확인해보니 아래와 같이 찍히는 것을 확인했습니다.

> Task :common:dependencyInsight
org.apache.kafka:kafka-clients:2.3.1 (selected by rule)
   variant "compile" [
      org.gradle.status                  = release (not requested)
      org.gradle.usage                   = java-api
      org.gradle.category                = library (not requested)

      Requested attributes not found in the selected variant:
         org.gradle.dependency.bundling     = external
         org.jetbrains.kotlin.platform.type = jvm
         org.gradle.jvm.version             = 8
   ]

org.apache.kafka:kafka-clients:0.9.0 -> 2.3.1
...

반응형

저는 여기서 selected by rule 부분에 이상함을 느끼고, 이것과 관련해서 찾아보니 제가 궁금한 부분이 앞서 stack overflow에 올라온 것을 발견했습니다 ㅎ
https://stackoverflow.com/questions/37153484/why-does-gradle-downgrade-my-transitive-dependencies-in-a-grails-3-1-application

Why does Gradle downgrade my transitive dependencies in a Grails 3.1 application?

I am having a problem with a transitive dependency of my grails-flyway plugin. org.grails.plugins:grails-flyway:0.2.1 declares a dependency to org.flywaydb:flyway-core:4.0.1. When I include the plu...

stackoverflow.com


spring-boot-dependencies

결과를 요약하자면 spring-boot 가 특정 kafka 버전을 강제 적용(overwrite)한 것이였는데요. 제가 사용하는 Spring boot버전은 2.2.8버전이고, 이 버전에서 stack overflow에 적힌 방법대로 진행해보니 kafka 2.3.1 버전이 기입되어 있는 것을 확인했습니다.

cd ~/.gradle/caches/modules-2/files-2.1

grep -r "2.3.1" *

//결과
...
org.springframework.boot/spring-boot-dependencies/2.2.2.RELEASE/.../spring-boot-dependencies-2.2.2.RELEASE.pom:    
<kafka.version>2.3.1</kafka.version>
...

더불어서 스프링 부트 공식사이트에서 아래와 같은 내용을 확인할 수 있었습니다.

spring-boot-dependencies POM은 일반적인 dependency 버전을 관리합니다. Maven 및 Gradle용 Spring Boot 플러그인을 사용하면 빌드 속성을 사용하여 이러한 관리되는 종속성 버전을 사용자 지정할 수 있습니다.

만약 스프링부트가 강제한 버전을 다시 overwrite하고 싶다면 아래와 같이 overwrite할 대상과 버전을 명시하여 build.gradle에 추가해주면 됩니다.

ext['kafka.version'] = '0.9.0.0'


Spring과 Gradle의 얕은 지식이 이런 부분에서 드러나는 것 같습니다.
삽질하는 시간을 점점 줄일 수 있도록 많이 공부해야겠어요 :)

반응형

댓글