Kotlinでのクラス重複エラーの解決
問題の説明
Androidプロジェクトでビルド時に次のようなエラーが発生するケースが多く報告されています:
Duplicate class kotlin.collections.jdk8.CollectionsJDK8Kt found in modules jetified-kotlin-stdlib-1.8.0 and jetified-kotlin-stdlib-jdk8-1.6.0
Duplicate class kotlin.internal.jdk7.JDK7PlatformImplementations found in modules jetified-kotlin-stdlib-1.8.0 and jetified-kotlin-stdlib-jdk7-1.6.0
このエラーは、プロジェクト内で異なるバージョンのKotlin標準ライブラリが衝突していることを示しています。具体的には:
kotlin-stdlib-jdk7
とkotlin-stdlib-jdk8
はKotlin 1.8.0以降、kotlin-stdlib
に統合されました- 古いバージョンのライブラリが依存関係に残っているため、同じクラスが複数のモジュールに存在する状態になっています
- 手動でファイルを削除しても解決せず、ビルド時に再ダウンロードされてしまいます
効果的な解決策
方法1: Kotlin Gradleプラグインのバージョン更新(推奨)
最も確実な解決方法は、Kotlinプラグインのバージョンを1.8.0以上に更新することです。
プロジェクトレベルの build.gradle
ファイルを開き、変更を行います:
// プロジェクトディレクトリ/build.gradle
plugins {
id 'com.android.application' version '8.0.0' apply false
id 'com.android.library' version '8.0.0' apply false
id 'org.jetbrains.kotlin.android' version '1.8.22' apply false // 1.8.0以上に更新
}
更新後、以下の操作を行います:
- Sync Project with Gradle Files(Gradleファイルとプロジェクトを同期)
- Build > Clean Project(プロジェクトのクリーン)
- File > Invalidate Caches / Restart(キャッシュの無効化と再起動)
なぜこの方法が効果的なのか?
Kotlin 1.8.0以降では、stdlib-jdk7
とstdlib-jdk8
の機能がメインのstdlib
に統合されました。プラグインを更新することで、これらの古い依存関係が自動的に適切に処理されます。
方法2: 依存関係の制約を追加
プラグインの更新が難しい場合、モジュールレベルのbuild.gradle
に制約を追加することで解決できます:
// app/build.gradle
dependencies {
// 他の依存関係...
constraints {
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.0") {
because("kotlin-stdlib-jdk7はkotlin-stdlibの一部となりました")
}
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.0") {
because("kotlin-stdlib-jdk8はkotlin-stdlibの一部となりました")
}
}
}
注意
この方法では、Kotlinプラグインのバージョンが1.8.0
以上になっていることを確認してください。異なるバージョンを指定すると、新たな競合を引き起こす可能性があります。
方法3: Kotlin BOMの使用
依存関係のバージョン管理を一元化するKotlin BOMを利用する方法もあります:
// app/build.gradle
dependencies {
implementation(platform("org.jetbrains.kotlin:kotlin-bom:1.8.0"))
// 他のKotlin関連の依存関係はBOMからバージョンを継承
implementation "org.jetbrains.kotlin:kotlin-stdlib"
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8" // 必要な場合
}
方法4: 明示的な依存関係の削除
モジュールレベルのbuild.gradle
から古いKotlinライブラリの依存関係を削除します:
// 削除すべき行の例
dependencies {
// 以下のような古いstdlib-jdkX指定を削除
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
// 代わりにメインのstdlibを使用
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
}
依存関係の競合を特定する方法
問題の原因となっている依存関係を特定するには、Android Studioの機能を活用します:
- View > Tool Windows > Gradle を開く
- カテゴリ一覧から app > Tasks > android > androidDependencies をダブルクリック
- 生成されたレポートで
kotlin-stdlib
を含むエントリを検索 - 競合しているバージョンを特定
またはターミナルで次のコマンドを実行:
./gradlew app:dependencies --configuration implementation
よくある間違いと回避策
⚠️ 依存関係のバージョンを部分的に変更する問題
// 誤った例 - 一部のライブラリのみバージョンを変更
implementation 'androidx.appcompat:appcompat:1.7.1' → 1.6.1
この方法は一時的な解決になる場合がありますが、他の機能に影響を与える可能性があるため推奨されません。代わりに包括的なアプローチを取りましょう。
⚠️ 手動でのファイル削除
エラーメッセージに表示されているファイルを手動で削除しても、ビルド時にGradleが再度ダウンロードするため解決しません。根本的な依存関係の問題を修正する必要があります。
補足:Composeを使用している場合の注意点
Jetpack Composeを使用している場合、KotlinコンパイラのバージョンとComposeの互換性にも注意が必要です:
android {
composeOptions {
kotlinCompilerExtensionVersion = "1.4.3" // Composeのバージョンに合わせる
}
}
公式のComposeとKotlinの互換性マップで適切なバージョン組み合わせを確認してください。
まとめ
Kotlinでのクラス重複エラーを解決するには、以下のステップが有効です:
- Kotlin Gradleプラグインを1.8.0以上に更新
- 明示的な
kotlin-stdlib-jdkX
依存関係を削除 - 必要な場合は依存関係制約やBOMを使用
- Android Studioの依存関係分析ツールで競合を特定
これらの対策によって、同じクラスが異なるモジュールに存在することによるビルドエラーを解消し、安定した開発環境を維持できます。