这里是 Java 8。
假设有一个旧版本的widget
库,带有 Maven 坐标widgetmakers:widget:1.0.4
,其中定义了一个类,如下所示:
public class Widget {
private String meow;
// constructor, getters, setters, etc.
}
岁月流逝。这个widget
库的维护者决定 aWidget
永远不应该meow
,而是事实上应该bark
。于是有了一个新版本,它带有 Maven 坐标widgetmakers:widget:2.0.0
,Widget
看起来像:
public class Widget {
private Bark bark;
// constructor, getters, setters, etc.
}
所以现在我去构建我的应用程序,myapp
. 而且,想要使用我所有依赖项的最新稳定版本,我这样声明我的依赖项(在内部build.gradle
):
dependencies {
compile (
,'org.slf4j:slf4j-api:1.7.20'
,'org.slf4j:slf4j-simple:1.7.20'
,'bupo:fizzbuzz:3.7.14'
,'commons-cli:commons-cli:1.2'
,'widgetmakers:widget:2.0.0'
)
}
现在假设这个(虚构的)fizzbuzz
库一直依赖于 1.x 版本的widget
库,Widget
而meow
.
所以现在,我widget
在我的编译类路径中指定了 2 个版本:
widgetmakers:widget:1.0.4
它是由库拉入的fizzbuzz
,作为它的依赖项;和widgetmakers:widget:2.0.0
我直接引用
很明显,根据Widget
首先加载类加载的版本,我们将拥有 aWidget#meow
或 a Widget#bark
。
Gradle 是否提供任何设施来帮助我?有没有办法拉入同一个类的多个版本,并配置fizzbuzz
类使用旧版本Widget
,而我的类使用新版本?如果没有,我能想到的唯一解决方案是:
- 我可能能够完成某种基于着色和/或 fatjar 的解决方案,也许我将所有依赖项作为包拉入其中
myapp/bin
,然后为它们提供不同的版本前缀。诚然,我在这里没有看到明确的解决方案,但我确信有些事情是可行的(但完全是 hacky/讨厌)。或者... - 仔细检查我的整个依赖关系图,并确保我所有的传递依赖关系不会相互冲突。在这种情况下,对我来说,这意味着要么向维护人员提交拉取请求以将
fizzbuzz
其升级到最新widget
版本,要么不幸的是,降级myapp
以使用旧widget
版本。
但 Gradle (到目前为止)对我来说很神奇。所以我问:这里有什么 Gradle 魔法可以帮助我吗?