gradle 继承依赖程序上的库依赖关系

q0qdq0h2  于 2022-11-14  发布在  其他
关注(0)|答案(2)|浏览(361)

我有一个库,它提供了处理一些数据的实现,还有一个抽象类,它必须由使用它的程序进行扩展,以便使用数据处理的东西。
还有另一个库,它依赖于第一个库,也实现了抽象类。我想使 * 两个 * 库都可用于依赖于第二个库的程序。
示例:

libA/  (no deps)
  DataProcessor.java
  AbstractDataSource.java
libB/  (depends on libA)
  FilesystemDataSource.java
app/   (depends on libB)
  [here I want to access both DataProcessor and FilesystemDataSource]

我知道我可以将这两个库作为依赖项添加到应用程序中,但当build.gradle文件中没有那么多项时,维护起来可能会更容易。

jm2pwxwz

jm2pwxwz1#

使用api(而不是implementation)声明依赖项:
https://stackoverflow.com/a/44493379/68086开始:
从Gradle文档中:

dependencies {
    api 'commons-httpclient:commons-httpclient:3.1'
    implementation 'org.apache.commons:commons-lang3:3.5'
}

出现在api配置中的依赖项将以可传递的方式公开给库的使用者,因此将出现在使用者的编译类路径中。
另一方面,在implementation配置中找到的依赖项不会暴露给使用者,因此不会泄漏到使用者的编译类路径中。

  • 依赖项不再泄漏到使用者的编译类路径中,因此您永远不会意外地依赖于可传递依赖项
  • 由于减少了类路径的大小,编译速度更快
  • 当实现依赖关系发生变化时,重新编译的次数更少:将不需要重新编译消费者
  • 更干净的出版:当与新的maven-publish插件结合使用时,Java库生成的POM文件可以准确区分根据库进行编译所需的内容和在运行时使用库所需的内容(换句话说,不要将编译库本身所需的内容和根据库进行编译所需的内容混在一起)。
    编译配置仍然存在,但不应使用,因为它不能提供apiimplementation配置所提供得保证.
hs1ihplo

hs1ihplo2#

在gradle文件中添加libA作为libB的依赖项。同时在libC中添加libB作为依赖项。同时在libC的gradle配置中将transitive设置为true,以便获取可传递依赖库。
查看declaring dependencies上的Gradle官方文档和可传递依赖项。
组件的变体可以依赖于其他模块才能正常工作,即所谓的传递依赖关系。存储库上托管的模块版本可以提供元数据来声明这些传递依赖关系。默认情况下,Gradle会自动解析传递依赖关系。

相关问题