我有一个多模块 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
。