Skip to content

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-jdk7kotlin-stdlib-jdk8 はKotlin 1.8.0以降、kotlin-stdlibに統合されました
  • 古いバージョンのライブラリが依存関係に残っているため、同じクラスが複数のモジュールに存在する状態になっています
  • 手動でファイルを削除しても解決せず、ビルド時に再ダウンロードされてしまいます

効果的な解決策

方法1: Kotlin Gradleプラグインのバージョン更新(推奨)

最も確実な解決方法は、Kotlinプラグインのバージョンを1.8.0以上に更新することです。

プロジェクトレベルの build.gradle ファイルを開き、変更を行います:

groovy
// プロジェクトディレクトリ/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以上に更新
}

更新後、以下の操作を行います:

  1. Sync Project with Gradle Files(Gradleファイルとプロジェクトを同期)
  2. Build > Clean Project(プロジェクトのクリーン)
  3. File > Invalidate Caches / Restart(キャッシュの無効化と再起動)

なぜこの方法が効果的なのか?

Kotlin 1.8.0以降では、stdlib-jdk7stdlib-jdk8の機能がメインのstdlibに統合されました。プラグインを更新することで、これらの古い依存関係が自動的に適切に処理されます。

方法2: 依存関係の制約を追加

プラグインの更新が難しい場合、モジュールレベルのbuild.gradleに制約を追加することで解決できます:

groovy
// 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を利用する方法もあります:

groovy
// 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ライブラリの依存関係を削除します:

groovy
// 削除すべき行の例
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の機能を活用します:

  1. View > Tool Windows > Gradle を開く
  2. カテゴリ一覧から app > Tasks > android > androidDependencies をダブルクリック
  3. 生成されたレポートで kotlin-stdlib を含むエントリを検索
  4. 競合しているバージョンを特定

またはターミナルで次のコマンドを実行:

bash
./gradlew app:dependencies --configuration implementation

よくある間違いと回避策

⚠️ 依存関係のバージョンを部分的に変更する問題

gradle
// 誤った例 - 一部のライブラリのみバージョンを変更
implementation 'androidx.appcompat:appcompat:1.7.1' → 1.6.1

この方法は一時的な解決になる場合がありますが、他の機能に影響を与える可能性があるため推奨されません。代わりに包括的なアプローチを取りましょう。

⚠️ 手動でのファイル削除

エラーメッセージに表示されているファイルを手動で削除しても、ビルド時にGradleが再度ダウンロードするため解決しません。根本的な依存関係の問題を修正する必要があります。

補足:Composeを使用している場合の注意点

Jetpack Composeを使用している場合、KotlinコンパイラのバージョンとComposeの互換性にも注意が必要です:

groovy
android {
    composeOptions {
        kotlinCompilerExtensionVersion = "1.4.3" // Composeのバージョンに合わせる
    }
}

公式のComposeとKotlinの互換性マップで適切なバージョン組み合わせを確認してください。

まとめ

Kotlinでのクラス重複エラーを解決するには、以下のステップが有効です:

  1. Kotlin Gradleプラグインを1.8.0以上に更新
  2. 明示的なkotlin-stdlib-jdkX依存関係を削除
  3. 必要な場合は依存関係制約やBOMを使用
  4. Android Studioの依存関係分析ツールで競合を特定

これらの対策によって、同じクラスが異なるモジュールに存在することによるビルドエラーを解消し、安定した開発環境を維持できます。