Gradle在相关项目之间以级联方式共享依赖项

时间:2019-01-28 09:18:52

标签: gradle

我具有以下Java项目结构:

Util
 |
  -- Core
      |
       -- Services
      |
       -- Tools

项目:对Core和Util项目的工具和服务引用,问题是我最终在每个项目上编写了相同的依赖项,如果有继承关系,则必须有更好的方法来添加引用项目的依赖项需要。

我了解Gradle中的多个项目,但这与多重项目不同,因为我基本上可以使用Core库,对其进行编译(它将包含Core + Util库)并在另一个项目中使用它。

我想知道什么是最好的方法吗?

1 个答案:

答案 0 :(得分:0)

  1. 在每个项目中重复相同的依赖关系通常是合理的,因为在更大的项目中,您永远都不知道它们何时会变得不同,并且当有人更改公共依赖关系列表时,您也不想处理编译/运行时问题

    我相信向您的构建中添加依赖项分析器插件更为实用。它将帮助您删除不必要的依赖关系并显式添加传递性依赖关系。并且,如果将此插件添加到构建链中,它将有助于您将来保持依赖关系的健康。在gradle-dependency-analyze处选择此插件,或者在某个地方有更好的fork或同等产品。

  2. 在您的情况下,您实际上没有选择权,因为只有两种依赖项:(1)外部(其他jar人工制品)或(2)内部(多模块构建中的另一个模块)。

    2.1使用外部类似Maven的依赖项时,它将带有自己的依赖项(它们被称为“传递性依赖项”)。这意味着如果您执行compile 'yourgroup:Core:1.0',那么您将获得Util作为传递依赖。但是,如上所述,最好在编译过程中使用可传递依赖项时明确列出这些依赖关系,或防止它们被意外删除并使应用程序在运行时崩溃。

    2.2。如果您的项目位于同一版本控制库中,并且通常一起更改和构建,则多模块布局是您的最佳选择。在这种情况下,您将引用Core之类的compile project(':Util:Core')依赖项,它也将Util当作传递依赖项。这样,您就可以按照您的要求进行操作,并为ServicesTools定义依赖项-在subprojects {}的{​​{1}}闭包中。

  3. 内置多模块功能并不会限制您在其他地方使用Core/build.gradle库。无论是否为多模块构建,都可以始终以相同的方式向Core添加maven-publish插件,执行Core/build.gradle任务并从另一个项目引用publishToMavenLocal对于外部依赖项。

  4. 您始终可以将公共代码(如将添加公共依赖项的代码)放入外部gradle文件或自定义插件中,并Core.jar放入applyServices