앱을 테스트하려고 ExampleInstrumentedTest 클래스에 함수를 옮겨봤는대
Duplicate class error가 뜨며 실행이 안됬다.
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'라는 두 개의 의존성 모듈 사이에 클래스 중복 문제가 발생했다고 한다.
둘다 테스트를 하기 위한 프레임워크인데 테스트 하면서 코드를 수정하다보니 생긴문제 같다
이를 어떻게 해결할까
역시 스택오버플로우 형님들은 이미 겪어본 문제들이다
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모듈을 사용하게 된다.
리빌드를 다시 해봤다.
서로 다른 모듈에서 guava와 listenablefuture 가 충돌한다고 나온다
이 둘이 대체 뭐고 왜 충돌하는 걸까?
Guava: Guava는 Google에서 제공하는 오픈 소스 Java 라이브러리로, Java의 표준 컬렉션 API를 확장하고 공통 유틸리티를 제공합니다. 이 라이브러리는 여러 가지 기능을 포함하고 있으며, 그 중 일부는 다음과 같습니다:
캐싱: 고성능, 쉽게 사용할 수 있는 캐싱 기능을 제공합니다.
컬렉션: 표준 Java 컬렉션 API를 확장하여 다양한 새로운 컬렉션 타입을 제공합니다.
함수형 프로그래밍: Java에서 함수형 프로그래밍 스타일을 지원합니다.
동시성 유틸리티: 자바의 표준 동시성 라이브러리를 보완하고 간소화합니다.ListenableFuture: ListenableFuture는 Guava의 동시성 유틸리티 중 하나로, 비동기 계산의 결과를 표현하는 클래스입니다.
java.util.concurrent.Future 인터페이스를 확장하며, 결과가 준비되면 리스너를 실행하여 결과를 소비할 수 있도록 합니다.
위에서 언급한 문제는 이 두 모듈이 동일한 ListenableFuture 클래스를 제공하면서 발생합니다
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")
최신 버전으로 업데이트하고 실행해보자
에러없이 실행되는 모습을 볼 수 있다.