Gradle 渐变复合构建,未解决可传递依赖关系

Gradle 渐变复合构建,未解决可传递依赖关系,gradle,dependencies,repository,composite,Gradle,Dependencies,Repository,Composite,首先,很抱歉,我必须用伪代码来展示这个问题,因为原始库代码是封闭源代码,整个构建过程稍微复杂一些 问题如下: 我们有一个项目a,它使用一个内部库B。这个库使用几个开源库,我们现在称它们为C和D 出于调试目的,我想创建项目a的gradle复合构建,其中包括使用includebild的库B 项目A:settings.gradle rootProject.name = 'A' includeBuild '../B' 项目A在其构建中包括库B。gradle: repositories { m

首先,很抱歉,我必须用伪代码来展示这个问题,因为原始库代码是封闭源代码,整个构建过程稍微复杂一些

问题如下:

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

出于调试目的,我想创建项目a的gradle复合构建,其中包括使用
includebild
的库B

项目A:settings.gradle

rootProject.name = 'A'

includeBuild '../B'
项目A在其构建中包括库B。gradle:

repositories {
    mavenCentral()
}

dependencies {
       compile group: 'bgroup', name: 'b', version: '1.0' 
}
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'
}
repositories {
     maven {
       url "http://D-Repository/maven"
     }

     mavenCentral()
 }

 dependencies {
       compile group: 'bgroup', name: 'b', version: '1.0' 
 }
库B将C和D作为依赖项。D有自己的存储库,C在MavenCentral上

库B build.gradle:

repositories {
    mavenCentral()
}

dependencies {
       compile group: 'bgroup', name: 'b', version: '1.0' 
}
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'
}
repositories {
     maven {
       url "http://D-Repository/maven"
     }

     mavenCentral()
 }

 dependencies {
       compile group: 'bgroup', name: 'b', version: '1.0' 
 }
我可以毫无问题地使用build.gradle文件编译库B。 但当我试图编译项目A的复合构建时,它说:

找不到dgroup:d:1.0

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

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

repositories {
    mavenCentral()
}

dependencies {
       compile group: 'bgroup', name: 'b', version: '1.0' 
}
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'
}
repositories {
     maven {
       url "http://D-Repository/maven"
     }

     mavenCentral()
 }

 dependencies {
       compile group: 'bgroup', name: 'b', version: '1.0' 
 }
因此,我必须添加D的存储库,即使A不直接将其用作依赖项

  • 这是预期的行为吗
  • 我是否缺少一些配置

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

正如在注释中发现的,您发布的B是一个包含依赖类的胖罐子。如果使用复合构建,则按照其含义使用正常的可传递依赖项解析。使用胖罐子作为依赖项是非常糟糕的做法


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

存储库B在您的存储库中,它的元数据中有哪些依赖关系?它的元数据中不也有D吗?如果不是,为什么不呢?如果是,当从存储库中使用B时,A从何处获取?嗨,谢谢。你把我引向正确的方向。存储库上的库B是使用fatJar任务而不是CI上的普通jar任务构建的。这个fatJar包含丢失的到其meta的可传递库。现在,我必须找出是否有可能以某种方式使用“includebild”复合构建语法包含缺少的lib。如果不可能,我将不得不将依赖项添加到项目A中。好吧,依赖项与IncludeFild一起存在,A只是找不到它,因为它不在它知道的任何存储库中。顺便说一句,fatJars很臭,尤其是作为依赖项使用时。为了管理可传递的依赖项,您可以使用适当的构建工具,如Gradle、Ant/Ivy或Maven。因此,最干净的方法是省略fatJar任务,将缺少的存储库添加到ProjectA build.Gradle,即使它没有将它们列为依赖项?为什么要将它们作为依赖项添加到项目中?它们是B的依赖项。如果您使用正确的元数据正确地发布B,它们将自动过渡地拉入。这就是依赖管理构建系统的意义。再想象一下,你有一个依赖于E版本1的A和一个依赖于E版本10的B,你构建了一个两者的胖罐子,然后你构建了一个依赖于A和B的C。现在你需要两倍的大小,因为E包含了两次,你不知道实际使用的是哪一个等等。正确的生成系统将选择一个版本并将其包含在一个应用程序中,或警告您冲突。使用
api
实现
依赖项类型定义也会有所帮助。例如,当一个依赖项在项目B中声明为
api'com.group:artifact:+'
时,项目a应该将其作为必需的依赖项。这还需要在构建文件中使用
apply插件:“java库”