문제 상황
개인 프로젝트 개발 초기 단계에 앱을 실행시켰는데, Execution failed for task ':app:checkDebugDuplicateClasses' 빌드 오류가 발생했다.
Execution failed for task ':app:checkDebugDuplicateClasses'.
> A failure occurred while executing com.android.build.gradle.internal.tasks.CheckDuplicatesRunnable
> Duplicate class kotlin.collections.jdk8.CollectionsJDK8Kt found in modules kotlin-stdlib-1.8.20 (org.jetbrains.kotlin:kotlin-stdlib:1.8.20) and kotlin-stdlib-jdk8-1.7.0 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.0)
Duplicate class kotlin.internal.jdk7.JDK7PlatformImplementations found in modules kotlin-stdlib-1.8.20 (org.jetbrains.kotlin:kotlin-stdlib:1.8.20) and kotlin-stdlib-jdk7-1.7.0 (org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.0)
Duplicate class kotlin.internal.jdk7.JDK7PlatformImplementations$ReflectSdkVersion found in modules kotlin-stdlib-1.8.20 (org.jetbrains.kotlin:kotlin-stdlib:1.8.20) and kotlin-stdlib-jdk7-1.7.0 (org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.0)
Duplicate class kotlin.internal.jdk8.JDK8PlatformImplementations found in modules kotlin-stdlib-1.8.20 (org.jetbrains.kotlin:kotlin-stdlib:1.8.20) and kotlin-stdlib-jdk8-1.7.0 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.0)
Duplicate class kotlin.internal.jdk8.JDK8PlatformImplementations$ReflectSdkVersion found in modules kotlin-stdlib-1.8.20 (org.jetbrains.kotlin:kotlin-stdlib:1.8.20) and kotlin-stdlib-jdk8-1.7.0 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.0)
Duplicate class kotlin.io.path.ExperimentalPathApi found in modules kotlin-stdlib-1.8.20 (org.jetbrains.kotlin:kotlin-stdlib:1.8.20) and kotlin-stdlib-jdk7-1.7.0 (org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.0)
Duplicate class kotlin.io.path.PathRelativizer found in modules kotlin-stdlib-1.8.20 (org.jetbrains.kotlin:kotlin-stdlib:1.8.20) and kotlin-stdlib-jdk7-1.7.0 (org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.0)
Duplicate class kotlin.io.path.PathsKt found in modules kotlin-stdlib-1.8.20 (org.jetbrains.kotlin:kotlin-stdlib:1.8.20) and kotlin-stdlib-jdk7-1.7.0 (org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.0)
Duplicate class kotlin.io.path.PathsKt__PathReadWriteKt found in modules kotlin-stdlib-1.8.20 (org.jetbrains.kotlin:kotlin-stdlib:1.8.20) and kotlin-stdlib-jdk7-1.7.0 (org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.0)
Duplicate class kotlin.io.path.PathsKt__PathUtilsKt found in modules kotlin-stdlib-1.8.20 (org.jetbrains.kotlin:kotlin-stdlib:1.8.20) and kotlin-stdlib-jdk7-1.7.0 (org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.0)
Duplicate class kotlin.jdk7.AutoCloseableKt found in modules kotlin-stdlib-1.8.20 (org.jetbrains.kotlin:kotlin-stdlib:1.8.20) and kotlin-stdlib-jdk7-1.7.0 (org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.0)
Duplicate class kotlin.jvm.jdk8.JvmRepeatableKt found in modules kotlin-stdlib-1.8.20 (org.jetbrains.kotlin:kotlin-stdlib:1.8.20) and kotlin-stdlib-jdk8-1.7.0 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.0)
Duplicate class kotlin.jvm.optionals.OptionalsKt found in modules kotlin-stdlib-1.8.20 (org.jetbrains.kotlin:kotlin-stdlib:1.8.20) and kotlin-stdlib-jdk8-1.7.0 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.0)
Duplicate class kotlin.random.jdk8.PlatformThreadLocalRandom found in modules kotlin-stdlib-1.8.20 (org.jetbrains.kotlin:kotlin-stdlib:1.8.20) and kotlin-stdlib-jdk8-1.7.0 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.0)
Duplicate class kotlin.streams.jdk8.StreamsKt found in modules kotlin-stdlib-1.8.20 (org.jetbrains.kotlin:kotlin-stdlib:1.8.20) and kotlin-stdlib-jdk8-1.7.0 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.0)
Duplicate class kotlin.streams.jdk8.StreamsKt$asSequence$$inlined$Sequence$1 found in modules kotlin-stdlib-1.8.20 (org.jetbrains.kotlin:kotlin-stdlib:1.8.20) and kotlin-stdlib-jdk8-1.7.0 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.0)
Duplicate class kotlin.streams.jdk8.StreamsKt$asSequence$$inlined$Sequence$2 found in modules kotlin-stdlib-1.8.20 (org.jetbrains.kotlin:kotlin-stdlib:1.8.20) and kotlin-stdlib-jdk8-1.7.0 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.0)
Duplicate class kotlin.streams.jdk8.StreamsKt$asSequence$$inlined$Sequence$3 found in modules kotlin-stdlib-1.8.20 (org.jetbrains.kotlin:kotlin-stdlib:1.8.20) and kotlin-stdlib-jdk8-1.7.0 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.0)
Duplicate class kotlin.streams.jdk8.StreamsKt$asSequence$$inlined$Sequence$4 found in modules kotlin-stdlib-1.8.20 (org.jetbrains.kotlin:kotlin-stdlib:1.8.20) and kotlin-stdlib-jdk8-1.7.0 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.0)
Duplicate class kotlin.text.jdk8.RegexExtensionsJDK8Kt found in modules kotlin-stdlib-1.8.20 (org.jetbrains.kotlin:kotlin-stdlib:1.8.20) and kotlin-stdlib-jdk8-1.7.0 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.0)
Duplicate class kotlin.time.jdk8.DurationConversionsJDK8Kt found in modules kotlin-stdlib-1.8.20 (org.jetbrains.kotlin:kotlin-stdlib:1.8.20) and kotlin-stdlib-jdk8-1.7.0 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.0)
해결방법
필자 생각에는 서로 다른 버전의 라이브러리들이 포함되면서 중복되는 클래스들끼리 충돌이 일어난 것 같았다.
우선, 구글링을 시도해 보았다. (구글링 키워드 - Execution failed for task ':app:checkDebugDuplicateClasses')
아래의 stackoverflow 사이트에서는 org.jetbrains.kotlin.android(Android에서 Kotlin을 사용하도록 도와주는 Gradle 플러그인) 버전을 '1.8.0'으로 변경하라고 되어 있다.
How to resolve: Execution failed for task ':app:checkDebugDuplicateClasses'
I'm currently taking a Udemy class to learn Android development with Kotlin. At the end of the last two exercises I'm running into the following compile issues: FAILURE: Build failed with an excep...
stackoverflow.com
필자는 프로젝트 수준의 build.gradle 파일에서 아래와 같이 Kotlin 버전을 '1.8.0'으로 수정한 뒤, Sync Now를 통해 동기화를 완료했다.

하지만,
This version (1.2.0) of the Compose Compiler requires Kotlin version 1.7.0 but you appear to be using Kotlin version 1.8.0 which is not known to be compatible.
이라는 문구의 추가 빌드 오류가 발생했다.
바뀐 Kotlin 버전과 Compose Compiler 버전이 호환되지 않아서 발생한 오류인 것 같았다.
구글에 kotlin compose version이라고 검색하여, 안드로이드 공식 문서에서 제공되는 'Compose와 Kotlin의 호환성 지도' 페이지를 참고하면 된다.
https://developer.android.com/jetpack/androidx/releases/compose-kotlin?hl=ko
Compose와 Kotlin의 호환성 지도 | Jetpack | Android Developers
이 페이지는 Cloud Translation API를 통해 번역되었습니다. Compose와 Kotlin의 호환성 지도 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 참고: Kotlin 2.0 이상을 사
developer.android.com
아래 사진의 왼쪽이 Compose 컴파일러 버전, 오른쪽이 호환되는 Kotlin 버전이다.
좀 전에 설정했던 Kotlin 버전 '1.8.0'에 호환되는 아래의 두 가지 버전 중 아무거나 설정하면 된다.

필자는 앱 수준의 build.gradle 파일에서 아래와 같이 버전을 1.4.0'으로 수정한 뒤, Sync Now를 통해 동기화를 완료했다.

이제 더이상 오류가 발생하지 않는다.
원인
필자는 서로 다른 버전의 라이브러리가 포함되면서 중복된 클래스 간에 충돌이 발생하는 경우, 왜 Kotlin 플러그인의 버전을 명확히 지정해야 하는지에 대해 추가로 알아보았다.
아래의 코드는 아까 진행했던 Kotlin 플러그인의 기본 버전을 지정하는 코드이다. Gradle은 Kotlin 플러그인의 기본 버전을 기준으로 관련 Kotlin 라이브러리들의 버전을 맞춰 가져온다. 따라서 Kotlin 플러그인 버전을 프로젝트 최상단에서 명확히 지정해주면 라이브러리 간 버전 충돌을 방지하고, 모든 모듈에서 일관된 Kotlin 환경을 유지할 수 있어 빌드 안정성과 오류 예방에 도움이 된다.
id 'org.jetbrains.kotlin.android' version '1.8.0' apply false
여기서 한 가지 의문이 들 수 있다.
라이브러리 간에 중복된 클래스가 존재하면, 단순히 Kotlin 플러그인 버전만 맞춘다고 해서 충돌 문제가 무조건 사라지는 것은 아니지 않을까?
하지만 핵심은 다음과 같다.
👉 Kotlin 버전을 일관되게 지정해주기만 한다면, Gradle은 해당 버전을 기준으로 호환되는 라이브러리만 가져오며, 중복 클래스가 발생하지 않도록 내부적으로 정리 및 상계를 수행한다. 결과적으로, 충돌 없이 안정적인 빌드 구성이 가능해지는 것이다.