Gradle多项目依赖共享问题:子项目如何继承根项目依赖?
解决Gradle多模块项目中共享根项目依赖的问题
咱们先理清楚问题出在哪:你在根项目的subprojects块里配置了仓库和依赖,但这个块只会作用于根项目直接管理的子项目——也就是那些在根项目settings.gradle里被include的项目。而你现在是在projectB的settings.gradle里单独引用projectA,这就导致projectA没被纳入根项目的管理范围,自然继承不到根项目里的依赖配置,构建失败也就不奇怪了。
下面给你两种解决方案,第一种是Gradle多模块项目的标准做法,推荐优先采用:
方案一:用根项目统一管理所有子项目(推荐)
这是Gradle共享跨项目配置的默认方式,步骤很简单:
- 修改根项目的
settings.gradle,把projectA和projectB都纳入管理:
include ':projectA', ':projectB' // 如果projectA的实际路径不是根目录下的projectA(比如你之前的相对路径),在这里指定: // project(':projectA').projectDir = new File(settingsDir, '../projectA')
- 删掉projectB里的
settings.gradle配置,不需要在子项目里单独引用其他项目。 - 更新根项目的
build.gradle,把过时的compile换成Gradle推荐的implementation(compile在新版Gradle里已经被废弃了):
subprojects { repositories { jcenter() mavenCentral() mavenLocal() } dependencies { implementation 'com.google.guava:guava:23.0' implementation group: 'com.google.code.gson', name: 'gson', version: '2.8.2' } }
- projectB的
build.gradle保持你的配置不变即可:
dependencies { implementation project(':projectA') }
这样配置后,projectA和projectB都会自动继承根项目subprojects里的所有配置,包括仓库和依赖,构建就能正常运行了。
方案二:单独让projectA继承根项目配置(特殊场景用)
如果因为某些原因,你必须在projectB里单独引用projectA(不通过根项目统一管理),可以通过抽取共享配置脚本的方式来实现:
- 在根项目下创建一个单独的配置脚本,比如
shared-config.gradle,把共享的仓库和依赖放进去:
repositories { jcenter() mavenCentral() mavenLocal() } dependencies { implementation 'com.google.guava:guava:23.0' implementation group: 'com.google.code.gson', name: 'gson', version: '2.8.2' }
- 根项目的
build.gradle里修改subprojects块,引用这个脚本:
subprojects { apply from: rootProject.file('shared-config.gradle') }
- 在projectA的
build.gradle开头添加引用,让它也能获取到共享配置:
apply from: new File(rootProject.projectDir, 'shared-config.gradle')
这样不管projectA是被根项目管理,还是被projectB单独引用,都能加载到需要的依赖和仓库配置。
最后再提一句:Gradle多模块项目的最佳实践就是用根项目统一管理所有子项目的共享配置,这样既能保证配置一致性,也能避免各种路径和依赖继承的问题。
内容的提问来源于stack exchange,提问作者JoJota
相关产品推荐
相关产品推荐

