Java 8在这里。Gradle能以任何方式帮助解决jar地狱吗?
说有一个老版本的widget
libray的,与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
库有总是依赖于一个1.x版本的widget
库,其中Widget
将meow
。
所以现在,我对我的编译类路径中指定2个版本的widget
:
widgetmakers:widget:1.0.4
这是由fizzbuzz
库被拉入,因为它的依赖;和widgetmakers:widget:2.0.0
其中我直接引用
所以,很显然,这取决于其中Widget
版本首先得到classloaded,我们要么有一个Widget#meow
或Widget#bark
。
Gradle是否提供任何帮助我的设施?有什么办法可以拉同一班的多个版本,并配置fizzbuzz
班使用老版本Widget
,我的班级使用新版本?如果没有,我能想到的唯一的解决方案是:
- 我也许能实现某种shading-和/或基于fatjar-soltuion的,其中或许我拉在我所有的依赖关系包
myapp/bin
下和然后给他们不同的版本前缀。无可否认,我在这里看不到一个明确的解决方案,但肯定有一些可行的(但完全哈克/讨厌)。或... - 仔细检查我的整个依赖关系图,只是确保我的所有传递依赖不会相互冲突。在这种情况下,对于我来说,这意味着要么向
fizzbuzz
维护人员提交拉取请求,以便将其升级到最新的widget
版本,或者可悲的是,将myapp
降级为使用较旧的widget
版本。
但是Gradle(到目前为止)对我来说已经是魔术了。所以我问:是否有任何Gradle魔法可以利用我?
我看到你可以正确使用同一个库的两个不同版本的唯一可能的方法是通过引用你自己或库所需的每个版本。如果没有,那么你将不得不依赖于Gradle提供的版本。如果版本错误,你也会得到一个没有发现异常的类/方法。 Gradle可以找到缺少的依赖关系并将它们拉出来,但是通过将其与2个库混淆来手动破坏Gradle的依赖关系解析机制从长远来看不会有任何好处。 –
谢谢@WeareBorg(+1)。 **(1)**当你说“*指自己或图书馆所需要的每个版本*”时,你能详细说明一下吗?我已经是JVM开发超过10年了,并且不熟悉这种策略/方法!你能举一个你的意思吗? **(2)**在这种情况下,Gradle的默认行为是什么?保持不动,哪个版本的'widget'库将Gradle最终检索/解析?再次感谢! – smeeb
1)我的意思很简单,但是我知道maven的语法,在这里你可以排除你不需要的特定版本的库,所以其他版本会自动拖动。2)由于类路径的增加,它将成为列表中的第一个,对于maven,它将是最新的。 –