升级Gradle与Android Gradle Plugin至8.x后无法发布Android库
问题场景
原项目使用Gradle 7.6.1 + Android Gradle Plugin(AGP) 7.4.2,发布相关配置如下:
plugins { id("com.android.library") id("maven-publish") } task generateSourcesJar(type: Jar) { from android.sourceSets.main.java.srcDirs archiveClassifier.set("sources") } afterEvaluate { publishing { publications { release(MavenPublication) { from components.release artifact generateSourcesJar groupId "com.tazkiyatech" artifactId "android-utils" version "1.0.0" } } repositories { maven { name = "BuildFolder" url = "${project.buildDir}/repository" } } } }
升级至Gradle 8.x + AGP 8.x后,执行publish系列任务时触发报错:
- What went wrong:
A problem was found with the configuration of task ':library:generateSourcesJar' (type 'Jar').
Gradle detected a problem with the following location: '/Users/adil/Work/TazkiyaTech/android-utils/library/build/libs/library-sources.jar'.
Reason: Task ':library:generateMetadataFileForReleasePublication' uses this output of task ':library:generateSourcesJar' without declaring an explicit or implicit dependency. This can lead to incorrect results being produced, depending on what order the tasks are executed.
Possible solutions:
- Declare task ':library:generateSourcesJar' as an input of ':library:generateMetadataFileForReleasePublication'.
- Declare an explicit dependency on ':library:generateSourcesJar' from ':library:generateMetadataFileForReleasePublication' using Task#dependsOn.
- Declare an explicit dependency on ':library:generateSourcesJar' from ':library:generateMetadataFileForReleasePublication' using Task#mustRunAfter.
解决方案
只需在afterEvaluate块中,给自动生成的metadata任务添加对generateSourcesJar的显式依赖即可,修改后的完整配置如下:
plugins { id("com.android.library") id("maven-publish") } task generateSourcesJar(type: Jar) { from android.sourceSets.main.java.srcDirs archiveClassifier.set("sources") } afterEvaluate { // 给自动生成的metadata任务添加显式依赖 tasks.named("generateMetadataFileForReleasePublication") { dependsOn(generateSourcesJar) } publishing { publications { release(MavenPublication) { from components.release artifact generateSourcesJar groupId "com.tazkiyatech" artifactId "android-utils" version "1.0.0" } } repositories { maven { name = "BuildFolder" url = "${project.buildDir}/repository" } } } }
补充说明
Gradle 8.x对任务依赖的校验更为严格,不再允许隐式依赖存在。通过tasks.named()可以定位到publishing插件自动生成的generateMetadataFileForReleasePublication任务,再用dependsOn声明它必须在generateSourcesJar执行完成后再运行,即可解决依赖缺失的问题。
内容的提问来源于stack exchange,提问作者Adil Hussain

