Gradle embed配置隐式依赖警告问题及优化诉求
Gradle多项目构建:优雅嵌入依赖并消除隐式依赖警告
问题背景
在Gradle多项目构建中,我通过自定义embedApi配置将依赖嵌入到jar包,但收到Gradle警告:任务:myproject:jar使用了:mylibrary:jar的输出却未声明显式/隐式依赖,导致执行优化被禁用。当前的基础配置如下:
apply plugin: 'java-library' configurations { embedApi } dependencies { configurations.api.extendsFrom(configurations.embedApi) } jar { from { configurations.embedApi.collect { it.isDirectory() ? it : zipTree(it) } } }
手动给每个子项目的jar任务添加dependsOn(':mylibrary:jar')能解决问题,但重复配置不够优雅,希望能在根项目统一处理,或者有更简洁的embedApi('<dependency>')写法。
优雅解决方案
方案一:根项目统一配置,自动关联任务依赖
在根项目的build.gradle中添加以下配置,让所有子项目自动处理embedApi的任务依赖,无需每个子项目重复编写:
subprojects { apply plugin: 'java-library' configurations { embedApi } dependencies { api.extendsFrom embedApi } jar { // 嵌入embedApi中的依赖到jar包 from { configurations.embedApi.collect { it.isDirectory() ? it : zipTree(it) } } // 自动解析embedApi中的项目依赖,添加对应的jar任务依赖 configurations.embedApi.incoming.afterResolve { resolvedConfig -> resolvedConfig.dependencies.each { dep -> if (dep instanceof ProjectDependency) { dependsOn "${dep.dependencyProject.path}:jar" } } } } }
子项目中只需简单声明依赖即可:
dependencies { embedApi project(':mylibrary') }
方案二:优化任务依赖绑定时机(更高效)
如果希望在配置解析阶段就绑定任务依赖,避免延迟解析,可以调整为:
subprojects { apply plugin: 'java-library' configurations { embedApi } dependencies { api.extendsFrom embedApi } tasks.named('jar').configure { jarTask -> // 在embedApi配置解析前,先绑定项目依赖的jar任务 configurations.embedApi.incoming.beforeResolve { def projectDeps = configurations.embedApi.dependencies.withType(ProjectDependency) jarTask.dependsOn projectDeps.collect { "${it.dependencyProject.path}:jar" } } // 嵌入依赖到jar包 jarTask.from { configurations.embedApi.collect { it.isDirectory() ? it : zipTree(it) } } } }
核心原理
Gradle警告的本质是:虽然embedApi声明了项目依赖,但jar任务直接从配置中读取文件时,Gradle无法自动推断任务间的执行顺序。通过手动将embedApi中项目依赖对应的jar任务添加为当前jar任务的依赖,让Gradle明确任务执行顺序,即可消除警告并恢复执行优化。
内容的提问来源于stack exchange,提问作者DasBabyPixel
相关产品推荐
相关产品推荐

