You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Room初始化数据库时出现Duplicate class错误求助

问题:Room编译报错“duplicate class”

问题背景

我开始尝试使用Room,目前仅在Kotlin中编写了一个简单的Room数据库实现及实体类:

数据库类代码

@Database(entities = [Junk::class], version = 1)
abstract class MyDatabase : RoomDatabase() {
      companion object {
        private var appDatabaseInstance: MyDatabase? = null
        fun getDatabase(applicationContext: Context): MyDatabase {
            if (appDatabaseInstance == null) {
                appDatabaseInstance = Room.databaseBuilder(
                    applicationContext,
                    MyDatabase::class.java,
                    "my_db"
                ).build()
            }
            return appDatabaseInstance!!
        }
    }
}

实体类Junk代码

@Entity
class Junk {
    @PrimaryKey
    var id = 0
    var name: String?=null
}

编译错误信息

编译时出现错误:

C:\android_projects\room_test_app\app\build\generated\source\kapt\debug\hu\roomtest\stuff\db\MyDatabase_Impl.java:34: error: duplicate class: hu.roomtest.stuff.db.MyDatabase_Impl
public final class MyDatabase_Impl extends MyDatabase {
             ^

添加DAO后,DAO的实现类也报相同的重复类错误:

C:\android_projects\room_test_app\app\build\generated\source\kapt\debug\hu\roomtest\stuff\db\JunkDAO_Impl.java:34: error: duplicate class: hu.roomtest.stuff.db.JunkDAO_Impl
    public final class MyDatabase_Impl extends MyDatabase {
                 ^

我的Room Gradle配置

def room_version = "2.5.0"

implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version"

// To use Kotlin annotation processing tool (kapt)
kapt "androidx.room:room-compiler:$room_version"
// To use Kotlin Symbol Processing (KSP)
ksp "androidx.room:room-compiler:$room_version"
// optional - RxJava3 support for Room
implementation "androidx.room:room-rxjava3:$room_version"
// optional - Test helpers
testImplementation "androidx.room:room-testing:$room_version"

android/defaultConfig中配置:

javaCompileOptions {
            annotationProcessorOptions {
                arguments += ["room.schemaLocation": "$projectDir/schemas".toString()]
            }
        }

执行Make Project、Clean Project和Rebuild Project后错误依旧,请问该问题由什么原因导致?


问题原因及解决办法

核心原因:同时启用了三种注解处理器,导致Room重复生成实现类

你的Gradle配置里同时添加了annotationProcessor、kapt和ksp三种Room编译依赖,这三个注解处理器会各自独立生成Room的实现类(比如MyDatabase_Impl、JunkDAO_Impl),最终造成类重复的编译错误。

解决步骤:

  • 对于Kotlin项目,只保留一种注解处理器依赖:
    • 如果使用Kotlin Symbol Processing(推荐,编译速度更快),保留ksp依赖,删除annotationProcessor和kapt相关配置;
    • 如果使用Kotlin Annotation Processing Tool,保留kapt依赖,删除annotationProcessor和ksp相关配置;
  • 清理并重新编译项目。

调整后的Gradle配置示例(使用KSP):

def room_version = "2.5.0"

implementation "androidx.room:room-runtime:$room_version"
// 保留KSP依赖
ksp "androidx.room:room-compiler:$room_version"
// optional - RxJava3 support for Room
implementation "androidx.room:room-rxjava3:$room_version"
// optional - Test helpers
testImplementation "androidx.room:room-testing:$room_version"

另外,注意如果使用KSP,需要确保已经在项目根目录的build.gradle中添加了KSP插件:

plugins {
    id 'com.google.devtools.ksp' version '1.8.20-1.0.11' apply false
}

并在模块的build.gradle中应用插件:

plugins {
    // ...其他插件
    id 'com.google.devtools.ksp'
}

内容的提问来源于stack exchange,提问作者Adam Varhegyi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 05:45:37