我有一个具有以下结构的android项目:

-- Calendar
------app (app module)
----------build.gradle (module level)
------build.gradle (project level)
------Commons(A common project which i reuse across various projects)
----------common (common module in Commons project)
-------------build.gradle (for only common module level)
----------build.gradle(for Commons Project)

现在的问题是,如果我编译Commons,将其部署到bintray,然后在应用程序模块中用作implementation 'com.amitkma.Commons:common:1.0.0',则所有依赖项(在通用build.gradle中实现)也可以在应用程序模块中使用。但是如果我像下面那样使用它implementation project(:Commons:common),仅可使用通过api提供的依赖项。

我想知道apiimplementation相对于模块是否像上面那样直接编译或使用有什么区别?

最佳答案

这里有两件事在起作用:

  • 声明依赖项时apiimplementation的分隔。简而言之,implementation范围中的依赖项仅在运行时可见,因为它们是实现细节。此类库将在其已发布的Maven元数据中使用runtime范围。 the documentation
  • 中的更多信息
  • 在Gradle 5.0之前,Gradle混合了Maven元数据范围compileruntime,因此所有runtime依赖项确实出现在编译类路径上。 Gradle 5 changes this

  • 因此,当您发布组件时,Gradle 4.x的局限性意味着common可以使用app依赖项。请注意,移至Gradle 5处将导致破裂,如记录所示。
    而且,当您直接使用项目时,可以正确执行分隔。

    解决方法是简单地将依赖于通用api的一部分的依赖关系提升为api中的common配置,对于运行时的依赖关系,在app中声明它们,因为毕竟它们直接需要它们。

    关于gradle - 依赖项目中缺少依赖,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54145395/

    10-11 20:01