使用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相关配置;
- 如果使用Kotlin Symbol Processing(推荐,编译速度更快),保留
- 清理并重新编译项目。
调整后的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
相关产品推荐
相关产品推荐

