这里是Java 8。
假设旧版本的widget
库的Maven坐标为widgetmakers:widget:1.0.4
,其中定义了以下类:
public class Widget {
private String meow;
// constructor, getters, setters, etc.
}
多年过去了。这个 widget
库的维护者决定一个 Widget
不应该 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
库总是依赖于widget
库的1.x版本,其中Widget
会meow
。现在,我在编译classpath上指定了2个版本的
widget
:1.
widgetmakers:widget:1.0.4
被fizzbuzz
库作为其依赖项拉入;以及
2. 我直接引用的widgetmakers:widget:2.0.0
显然,取决于哪个版本的Widget
被首先加载,我们将得到一个Widget#meow
或一个Widget#bark
。Gradle是否提供任何帮助我解决这个问题的工具?有没有办法拉入同一类的多个版本,并配置
fizzbuzz
类使用旧版本的Widget
,而我的类使用新版本呢?如果没有,我能想到的唯一解决方案是:1. 我可以通过某种阴影和/或fatjar-based的解决方案来实现,例如将所有依赖项作为
myapp/bin
下的包拉入,然后给它们不同的版本前缀。尽管我没有找到明确的解决方案,但我确定有可行的解决方案(但完全是hacky/nasty的)。或者...
2. 仔细检查我的整个依赖图,并确保所有传递依赖项不会发生冲突。对我来说,这意味着要么向fizzbuzz
维护者提交一个拉取请求,将其升级到最新的widget
版本,要么,可悲的是,降级myapp
以使用旧的widget
版本。但Gradle(到目前为止)对我来说一直是神奇的。所以我问:有没有Gradle魔法可以帮助我?
widget
库?再次感谢! - smeeb