본문 바로가기

트러블슈팅

[Gradle] 라이브러리 버전 충돌(버전이 여러개인 경우)

(kotlin 사용중)

 

문제

갑자기 jackson objectMapper 가 제네릭 타입추론을 못한다는 에러가 발생함

변경점은 build.gradle 에 jasperreports 의존성만 추가한 것 밖에 없었다.

 

원인 찾기

실제 다운 받은 라이브러리 확인

jackson.core 가 버전이 3개나 된다.

뭔가 현재 프로젝트에 원하지 않은 라이브러리까지 추가된거 같다.

 

그렇다면 현재 사용중인 jackson.core 는 무엇인가?

gradle dependencies.tree 를 확인하면 된다.

intellij 를 먼저 이용해보자.

Gradle 윈도우 - 원하는 프로젝트 - Show Dependencies...

 

뭐가 엄청 많이 나오니까 cmd+f 로 찾자

 

그리고 계층구조를 잘 보기 위해서 Show Paths 를 누르면 잘 나옴

 

뭔가 jasperreports 하 하나 더 끼워졌다. 근데 버전이 무엇무엇 있고, 어떤 버전을 쓰는지는 잘 안나오는듯하다.

 

커맨드 라인에서

$> ./gradlew :프로젝트이름:dependencies

 

아래를 보면 2.9.10 을 쓰겠다는거 같은데... 실제 소스코드를 따라가보면 2.10.0.jar 로 이동함

com.fasterxml.jackson.core:jackson-annotations:2.10.0 -> 2.9.10

 

해결방법

1. 멀티프로젝트 일때 루트 프로젝트 build.gradle 에 버전 명시

subprojects {
	...
    
    dependencies {
        implementation "com.fasterxml.jackson.core:jackson-databind:$jacksonVersion"
        ...

하지만 실제로는 서브 프로젝트에서 받은 라이브러리 버전이 latest 이면 서브 프로젝트에서 받은 버전을 사용함

-> 이걸로 해결 못함

 

2. 서브 프로젝트에서 의존성 추가할 때 중복되는 라이브러리는 제외

dependencies {
    // jasperreports
    implementation("net.sf.jasperreports:jasperreports:$jasperreportsVersion") {
        exclude group: "com.fasterxml.jackson.core"
    }

해결은 되지만 모든 의존성 추가에서 하기는 힘듬

-> 해결은 되지만 의존성 추가가 복잡해짐

 

3. 버전 충돌시 어떻게 할지 명시, 모든 프로젝트를 1개의 버전으로 통일

subprojects {
    ...
    
    configurations.all {
        resolutionStrategy {
            force "com.fasterxml.jackson.core:jackson-databind:$jacksonVersion"
        }
    }

해결됨

-> 하지만 version update 가 어렵다는 단점은 있다.