Gradle:在不丢失传递依存关系的情况下遮蔽番石榴

时间:2019-10-21 16:53:28

标签: apache-spark gradle guava gradle-shadow-plugin

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

火花取决于Guava14.x。我的数据库类取决于Guava 28.x。

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

在模块A中对番石榴进行着色(和重新定位)很容易:

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的runtimeClasspath结尾的JAR是A的不带阴影的 JAR。

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

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

B的runtimeClasspath上没有A的传递依赖项。

我的目标是在模块A中仅对 番石榴进行着色和重新放置,以最大程度地减少JAR大小和构建时间。然后,我需要阴影的JAR以及A在B的runtimeClasspath上可用的传递依赖项。

1 个答案:

答案 0 :(得分:0)

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

也许我对传递性的依赖不满足?我之所以喜欢这样做,是因为它在整个项目模块中都保持dependencies简洁,但这可能比它的价值还要麻烦。