升级Kotlin 1.2.40后Room数据库构建报错:kapt出现NoClassDefFoundError
我来帮你搞定这个升级Kotlin后碰到的Room kapt崩溃问题!这个NoClassDefFoundError本质上是Kotlin元数据处理库版本不兼容导致的——Kotlin 1.2.40调整了元数据的内部结构,而你当前用的Room(或者它依赖的kotlin-metadata相关库)还是基于旧版Kotlin的元数据逻辑,自然找不到对应的类了。
下面给你几个靠谱的解决方案:
优先升级Room到兼容Kotlin 1.2.x的版本
Room 1.1.1及以后的版本已经对Kotlin 1.2系列做了适配,直接把Room的依赖升级到这个版本就能解决大部分问题。在你的Module级build.gradle里更新:implementation "android.arch.persistence.room:runtime:1.1.1" kapt "android.arch.persistence.room:compiler:1.1.1"另外,如果你的项目里显式声明了
kotlin-metadata-jvm依赖,一定要让它的版本和Kotlin版本保持一致:implementation "org.jetbrains.kotlin:kotlin-metadata-jvm:1.2.40"排查并排除冲突的依赖
有些第三方库会偷偷引入旧版本的kotlin-metadata-jvm,造成版本冲突。你可以用Gradle命令查看依赖树,找出冲突来源:./gradlew app:dependencies找到所有
kotlin-metadata-jvm的引用后,在Room编译器的依赖声明里排除旧版本:kapt("android.arch.persistence.room:compiler:1.1.1") { exclude group: 'org.jetbrains.kotlin', module: 'kotlin-metadata-jvm' }这样就能强制使用你项目里指定的Kotlin 1.2.40版本的元数据库了。
清理缓存后重新构建
有时候旧的编译缓存会搞出奇怪的问题,试试这些操作:- 点击Android Studio顶部菜单的
Build -> Clean Project - 接着点击
Build -> Rebuild Project - 如果还是不行,手动删除项目根目录下的
.gradle文件夹和Module里的build文件夹,然后重新同步项目
- 点击Android Studio顶部菜单的
要是以上方案都没解决,你可以暂时把Kotlin版本降级到1.2.31(这个版本和旧版元数据库兼容性更好),等Room后续版本完全适配后再升级——不过还是优先推荐升级Room,这才是长期的解决办法。
内容的提问来源于stack exchange,提问作者Andre Rocha




