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

迁移至Kotlin .kts后Android项目构建异常问题排查求助

我来帮你一步步解决这些迁移到KTS后遇到的构建问题,这些问题大多是配置细节和Gradle行为的小偏差导致的:

1. 初始依赖解析失败(401 Unauthorized + 错误仓库路径)

问题根源:你在Nexus仓库的credentials块里犯了一个低级错误——把密码重复赋值给了username,导致Nexus认证失败(返回401)。虽然配置了mavenCentral(),但Gradle会按仓库顺序依次尝试拉取依赖,当前面的仓库因缓存或网络问题没找到时,就会走到Nexus仓库,认证失败后又继续尝试后面的S3仓库,最终全部失败。

解决步骤:

  • 修正credentials块的赋值错误,把username = properties["nexusRepositoryPassword"].toString()改成password = properties["nexusRepositoryPassword"].toString()(这步你已经完成);
  • 清理Gradle本地缓存,避免错误缓存干扰:执行./gradlew clean build --refresh-dependencies,强制Gradle重新解析所有依赖。

2. 修正凭证后仍从S3仓库拉取androidyoutubeplayer(403 Forbidden)

问题根源:

  • 仓库顺序不一致:你初始迁移时移除了jcenter(),而Groovy版脚本里有jcenter()且放在mavenCentral()之前,这导致Gradle的依赖解析路径发生变化;
  • Gradle缓存残留:迁移后缓存的依赖来源记录混乱,导致Gradle错误地去S3仓库查找本应在mavenCentral的依赖;
  • 该S3仓库可能已关闭公共访问,本身就不包含androidyoutubeplayer依赖。

解决步骤:

  • 确保KTS脚本的仓库顺序和Groovy版完全一致(把jcenter()放在mavenCentral()之前,虽然jcenter已停止服务,但你提到有旧依赖需要它);
  • 再次清理Gradle缓存:./gradlew clean build --refresh-dependencies;
  • 给mavenCentral()添加内容过滤,强制让androidyoutubeplayer这类公共库只从mavenCentral拉取,避免Gradle去其他仓库尝试:
    mavenCentral {
        content {
            includeGroup("com.pierfrancescosoffritti")
            // 可添加其他公共库的group,比如org.jetbrains.kotlin等
        }
    }
    

3. 恢复jcenter()后的Kotlin版本不兼容错误

问题根源:这是最关键的错误!你在项目级build.gradle.kts的buildscript依赖里,kotlin-gradle-plugin没有指定版本号:

classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:") // 版本号为空!

Groovy版脚本里肯定指定了和kotlin_version一致的版本(比如1.4.32),但KTS版漏了,导致Gradle自动拉取最新的插件版本,和项目依赖的1.4.32版Kotlin标准库版本不匹配,从而出现版本兼容错误。

解决步骤:

  • 给kotlin-gradle-plugin指定正确的版本,和你定义的kotlin_version一致:
    classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version")
    
  • 同步Gradle后,执行./gradlew clean build,版本不兼容的问题会立刻消失。

4. 执行./gradlew assembleUat --info后的403/502错误

问题根源:

  • https://dl.bintray.com/objectbox/objectbox仓库已失效:Bintray在2021年停止服务,ObjectBox现在已迁移到mavenCentral;
  • https://s3.amazonaws.com/salesforcesos.com/android/maven/release仓库可能已关闭公共访问,或你已不再需要从这里拉取依赖;
  • 仓库顺序不合理,导致Gradle频繁去失效仓库尝试拉取依赖,浪费时间还返回错误。

解决步骤:

  • 移除失效的Bintray仓库:删掉maven { url = uri("https://dl.bintray.com/objectbox/objectbox") },ObjectBox依赖现在可从mavenCentral获取;
  • 检查是否需要保留S3仓库:如果项目不再依赖该仓库的库,直接移除;如果还需要,给它添加内容过滤,只让特定依赖去该仓库拉取:
    maven {
        url = uri("https://s3.amazonaws.com/salesforcesos.com/android/maven/release")
        content {
            includeGroup("com.salesforce.sos") // 只拉取这个group下的依赖
        }
    }
    
  • 把可靠的仓库(google()、mavenCentral())放在最前面,减少Gradle去无效仓库的次数。

总结

迁移到KTS时要格外注意配置细节(比如版本号、赋值顺序、仓库顺序),Groovy的容错性较高,但KTS是强类型语言会严格校验。另外,及时清理Gradle缓存、移除失效仓库、合理配置仓库内容过滤,能避免很多依赖解析问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 19:43:12