首先,对不起,我必须在伪代码中展示问题,因为原始库代码是封闭源代码,整个构建过程稍微复杂一些。
问题如下:
我们有一个项目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.
答案 0 :(得分:2)
正如在评论中发现的那样,您发布的B是一个包含依赖类的胖JAR。如果使用复合构建,则使用正常的传递依赖性解决方案。使用胖JAR作为依赖是非常糟糕的做法。
如果你现在依赖于胖JAR的复合构建替换,你有适当的依赖声明,但是A找不到D,因为它在它知道的任何存储库中都找不到。您要么必须使用包含的构建中的胖JAR替换对B的依赖,要么切换为使用适当的传递依赖性处理它的含义。这将涉及发布正常的B JAR,但使用正确的元数据来声明其依赖关系并将D特定的存储库添加到A,以便它可以解决传递依赖性。