0

我有一个多模块 Gradle 项目。一个模块(A)包含与数据库相关的类;另一个 (B) 包含 Spark 应用程序并依赖于 A。

Spark 依赖于 Guava 14.x。我的数据库类依赖于 Guava 28.x。

我需要能够在我的数据库模块中使用 Guava 28.x,并将该模块声明为 Spark 模块中的项目依赖项。

在模块 A 中对 Guava 进行着色(和重新定位)非常简单:

shadowJar {
    configurations = [project.configurations.shadow] // this was done to prevent ALL of A's dependencies from being shaded
    relocate 'com.google.common', 'shaded.com.google.common'
}
dependencies {
    shadow 'com.google.guava:guava:28.1-jre'
}

但是,当我将模块 A 声明为 B 中的依赖项时,例如:

dependencies {
  implementation project(':A')
}

最终出现在 B 上的JAR 是 AruntimeClasspath无阴影JAR。

当我指定带阴影的 JAR 时,例如:

dependencies {
  implementation project( path: ':A', configuration: 'shadow' )
}

A 的传递依赖项在 B 上均不可用runtimeClasspath

我的目标是在模块 A 中仅对Guava 进行着色和重新定位,以最小化 JAR 大小和构建时间。然后我需要阴影 JAR 以及 B 上可用的 A 的传递依赖项runtimeClasspath

4

1 回答 1

0

一个不太令人满意的解决方案是只在 B 中声明我需要来自 A 的传递依赖项。因为依赖项集相对较小,这可能是该项目的最佳方法;但我更喜欢更优雅的东西。

也许我对传递性的依赖令人担忧?我很喜欢这样做,因为它在dependencies整个项目的模块中保持简洁,但它可能比它的价值更麻烦。

于 2019-10-21T17:11:01.927 回答