我有一个多模块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
上可用的传递依赖项。
答案 0 :(得分:0)
一个不太令人满意的解决方案是只在B中声明我需要从A获得的传递性依赖项。由于依赖项集相对较小,因此这可能是此项目的最佳方法;但我更喜欢优雅的东西。
也许我对传递性的依赖不满足?我之所以喜欢这样做,是因为它在整个项目模块中都保持dependencies
简洁,但这可能比它的价值还要麻烦。