24.02.01 Duplicate class error

KSang·2024년 2월 3일
0

TIL

목록 보기
47/101

앱을 테스트하려고 ExampleInstrumentedTest 클래스에 함수를 옮겨봤는대

Duplicate class error가 뜨며 실행이 안됬다.

image


Duplicate class

Duplicate class에러는 동일한 클래스가 두 번 이상 정의되었을 때 발생한다고 한다.

Duplicate class org.hamcrest.core.IsSame found in modules hamcrest-core-1.1 (org.hamcrest:hamcrest-core:1.1) and junit-4.10 (junit:junit:4.10)
Duplicate class org.hamcrest.internal.ArrayIterator found in modules hamcrest-core-1.1 (org.hamcrest:hamcrest-core:1.1) and junit-4.10 (junit:junit:4.10)
Duplicate class org.hamcrest.internal.SelfDescribingValue found in modules hamcrest-core-1.1 (org.hamcrest:hamcrest-core:1.1) and junit-4.10 (junit:junit:4.10)
Duplicate class org.hamcrest.internal.SelfDescribingValueIterator found in modules hamcrest-core-1.1 (org.hamcrest:hamcrest-core:1.1) and junit-4.10 (junit:junit:4.10)

Go to the documentation to learn how to Fix dependency resolution errors.

에러 코드를 보면 'org.hamcrest:hamcrest-core:1.1'과 'junit:junit:4.10'라는 두 개의 의존성 모듈 사이에 클래스 중복 문제가 발생했다고 한다.

둘다 테스트를 하기 위한 프레임워크인데 테스트 하면서 코드를 수정하다보니 생긴문제 같다

이를 어떻게 해결할까

https://stackoverflow.com/questions/57645919/duplicate-hamcrest-and-junit-classes-after-updating-gradle-and-android-studio-to

역시 스택오버플로우 형님들은 이미 겪어본 문제들이다

gradle에서 의존성을 설정해주자.

    configurations.all {
        resolutionStrategy.dependencySubstitution {
            substitute(module("org.hamcrest:hamcrest-core:1.1")).using(module("junit:junit:4.10"))
        }
    }

이렇게 되면 org.hamcrest:hamcrest-core:1.1대신 junit:junit:4.10모듈을 사용하게 된다.

리빌드를 다시 해봤다.

image

서로 다른 모듈에서 guava와 listenablefuture 가 충돌한다고 나온다

이 둘이 대체 뭐고 왜 충돌하는 걸까?

Guava: Guava는 Google에서 제공하는 오픈 소스 Java 라이브러리로, Java의 표준 컬렉션 API를 확장하고 공통 유틸리티를 제공합니다. 이 라이브러리는 여러 가지 기능을 포함하고 있으며, 그 중 일부는 다음과 같습니다:

캐싱: 고성능, 쉽게 사용할 수 있는 캐싱 기능을 제공합니다.
컬렉션: 표준 Java 컬렉션 API를 확장하여 다양한 새로운 컬렉션 타입을 제공합니다.
함수형 프로그래밍: Java에서 함수형 프로그래밍 스타일을 지원합니다.
동시성 유틸리티: 자바의 표준 동시성 라이브러리를 보완하고 간소화합니다.

ListenableFuture: ListenableFuture는 Guava의 동시성 유틸리티 중 하나로, 비동기 계산의 결과를 표현하는 클래스입니다.

java.util.concurrent.Future 인터페이스를 확장하며, 결과가 준비되면 리스너를 실행하여 결과를 소비할 수 있도록 합니다.

위에서 언급한 문제는 이 두 모듈이 동일한 ListenableFuture 클래스를 제공하면서 발생합니다

ListenableFuture클래스를 둘다 제공함으로 둘 중 하나를 제외하면된다.

guava에서 listenablefuture 제거하기

    configurations.all {
        resolutionStrategy.dependencySubstitution {
            substitute(module("org.hamcrest:hamcrest-core:1.1")).using(module("junit:junit:4.10"))
        }
    }

exclude문을 사용해 guava에서 listenablefuture모듈을 제외해줬다.

이러면 겹치는 클래스가 없으니 문제없이 실행된다.

그런데 guava의 최신버전으로 업데이트하면 Guava 라이브러리에는 ListenableFuture가 포함되어 있으므로

com.google.guava:listenablefuture이 필요없게 된다고 한다.

    implementation("com.google.guava:guava:33.0.0-jre")

최신 버전으로 업데이트하고 실행해보자

에러없이 실행되는 모습을 볼 수 있다.

0개의 댓글