Gradle multiproject多个依赖项

时间:2018-05-31 16:45:57

标签: java android gradle

我有一个像这样的gradle项目:

root
  |
  |---- projectA
  |
  |---- projectB
 ...

我的root build.gradle包含projectA和projectB所需的依赖项。我已经像这样定义了它们:

subprojects {
    repositories {
        jcenter()
        mavenCentral()
        mavenLocal()
    }
    dependencies {
        compile 'com.google.guava:guava:23.0'
        compile group: 'com.google.code.gson', name: 'gson', version: '2.8.2'

现在我试图从projectB添加对projectA的依赖,所以我的projectB build.gradle看起来像这样:

dependencies {
    implementation project(':projectA')
}

和projectB settings.gradle:

include ':projectA'
project(':projectA').projectDir = new File(settingsDir, '../projectA')

这当前失败了,因为projectA和B不依赖root来获取他们所需的依赖项。

我可以在root上从projectA添加另一个依赖项,或者从一个根项目共享相同依赖项的默认gradle方法是什么?

2 个答案:

答案 0 :(得分:1)

您的模块(A和B)未正确设置为根项目的子模块。 在基本文件夹中,根据需要创建settings.gradle文件,并添加子模块定义:

<强>根/ settings.gradle

include 'projectA', 'projectB'

projectB的build.gradle文件是可以的,然后你需要删除root/projectB/settings.gradle文件;子模块及其位置在父构建文件中指定。

答案 1 :(得分:1)

使用&#34;编译&#34;指定依赖关系关键字已被弃用。要使用的新关键字是&#34;实施&#34;。 (见this SO question for an example of explanation。)&#34;编译&#34;之间的区别。和&#34;实施&#34;因为它与你的情况有关,是&#34;编译&#34;将依赖关系传播到所有连接的模块,同时&#34;实现&#34;是单级的。所以,如果你有

root
  module A
  module B

和模块B使用&#34; compile&#34;引入了一个depandency,然后root可以访问该依赖项。 但是如果您现在更改B以使用&#34; implementation&#34;来实现依赖关系,那么您仍然需要将依赖项添加到根项目的build.gradle。

为什么这有关系?因为儿童模块不允许知道其父母是谁。因此,虽然A和B都看到了你带入root的依赖关系,但他们真的不应该 - 看到这些依赖关系是Studio工作原理的一个怪癖。这也是为什么答案&#34;我可以在root&#34;中添加来自projectA的另一个依赖项。是的,不,你在那里运气不好,它会造成循环依赖,而且不允许&#34;。

我尝试的依赖项是:

在模块A和模块B中:

dependencies {
  implementation 'com.google.guava:guava:23.0'
  implementation group: 'com.google.code.gson', name: 'gson', version: '2.8.2'

然后在模块B中,您执行:

implementation project(':projectA')

然后在root中,你依赖于A和B.