Gradle Composite Build,传递依赖关系未得到解决

时间:2017-11-29 15:05:06

标签: gradle dependencies repository composite

首先,对不起,我必须在伪代码中展示问题,因为原始库代码是封闭源代码,整个构建过程稍微复杂一些。

问题如下:

我们有一个项目A,它使用一个内部库B.这个库使用了几个开源库,我们现在将它们称为C和D.

出于调试目的,我想创建项目A的 gradle组合构建,其中包括使用includeBuild的库B。

项目A:settings.gradle

rootProject.name = 'A'

includeBuild '../B'

项目A在其build.gradle中包含了库B:

repositories {
    mavenCentral()
}

dependencies {
       compile group: 'bgroup', name: 'b', version: '1.0' 
}

库B将C和D作为依赖项。 D有一个自己的存储库,C在MavenCentral上。

Library B build.gradle:

repositories {

  maven {
    url "http://D-Repository/maven"
  }

  mavenCentral()
}

dependencies {
       compile group: 'dgroup', name: 'd', version: '1.0'
       compile group: 'cgroup', name: 'c', version: '1.6'
}

我可以使用build.gradle文件编译库B而不会出现问题。 但是当我尝试编译项目A的复合构建时,它说:

  

找不到dgroup:d:1.0

我确实解析了库C,但不是D 。我必须将D的存储库添加到项目A的build.gradle文件中以使其工作。

项目A包括D build.gradle的存储库:

repositories {
     maven {
       url "http://D-Repository/maven"
     }

     mavenCentral()
 }

 dependencies {
       compile group: 'bgroup', name: 'b', version: '1.0' 
 }

所以我必须添加D的存储库,即使A不直接将其用作依赖项。

  • 这是预期的行为吗?
  • 我错过了一些配置吗?

如果我只是从我们自己的存储库中获取库B(没有复合构建),我就不必将D的存储库添加到项目A.但是这样我在处理项目A时无法调试B.

1 个答案:

答案 0 :(得分:2)

正如在评论中发现的那样,您发布的B是一个包含依赖类的胖JAR。如果使用复合构建,则使用正常的传递依赖性解决方案。使用胖JAR作为依赖是非常糟糕的做法。

如果你现在依赖于胖JAR的复合构建替换,你有适当的依赖声明,但是A找不到D,因为它在它知道的任何存储库中都找不到。您要么必须使用包含的构建中的胖JAR替换对B的依赖,要么切换为使用适当的传递依赖性处理它的含义。这将涉及发布正常的B JAR,但使用正确的元数据来声明其依赖关系并将D特定的存储库添加到A,以便它可以解决传递依赖性。