Java 8はこちら。Gradleはどんな方法でも地獄を解決できますか?
public class Widget {
private String meow;
// constructor, getters, setters, etc.
}
年パス:Mavenのは、そうのようにそれに定義されたクラスを有する、widgetmakers:widget:1.0.4
座標と
セイwidget
librayの古いバージョンがあります。この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
)。
だから今、私は私のコンパイルクラスパス上widget
の2つのバージョンを指定しています:
widgetmakers:widget:1.0.4
それの依存関係として、fizzbuzz
ライブラリによって引き込まれます。そして、私はWidget
のバージョンが最初のクラスロードを取得しますこれに応じて、だから、明らかに直接
を参照しています
widgetmakers:widget:2.0.0
は、我々はどちらかWidget#meow
またはWidget#bark
を持つことになります。 ここで私を助けてくれる施設は何ですか?同じクラスの複数のバージョンをプルする方法はありますか?fizzbuzz
クラスをコンフィグレーションしてWidget
の古いバージョンを使用し、新しいバージョンを使用するようにクラスを設定しますか?そうでない場合、私は考えることができる唯一の解決策は以下のとおりです。
- 私は
myapp/bin
下shading-および/または多分私はパッケージとしてすべての私の依存関係にプルfatjarベースsoltuion、いくつかの種類を達成することができるかもしれないとそれらに異なるバージョン接頭辞を与えます。確かに私はここにはっきりした解決策は見当たりませんが、何かが実現可能であることは確かです(しかし、まったくハッキー/厄介です)。または... - 私の依存グラフ全体を慎重に調べて、私の過渡的な依存関係が互いに矛盾しないように注意してください。この場合は、
fizzbuzz
のメンテナにプルリクエストを送信して最新のwidget
バージョンにアップグレードするか、残念ながらmyapp
をダウングレードしてより古いバージョンのwidget
を使用することを意味します。
でも、私にとって、グラッド(これまで)は魔法でした。だから私は頼んでいます:ここで私を助けることができる任意のGradleの魔法はありますか?
私は、同じライブラリの2つの異なるバージョンを適切に使用することができる唯一の方法は、自分自身またはライブラリによって必要とされる各バージョンを参照することです。そうでない場合は、Gradleが提供するバージョンに依存する必要があります。また、間違ったバージョンのクラス/メソッドが見つからない場合、例外が発生します。 Gradleは、見つからない依存関係を見つけ出して引き出すことができますが、Gradleの依存関係解決メカニズムを2つのライブラリと混同して手作業で破壊することは、長期的にはうまくいくものではありません。 –
ありがとう@WeareBorg(+1)。 **(1)**あなた自身が必要としている場所であれライブラリであれ*各バージョンを参照する*と言うときは、もう少し詳しく説明できますか?私は10年以上の間、JVM開発者であり、この戦略/アプローチに精通していません!あなたが意味するものの例を挙げることができますか?そして、**(2)**この状況でのGradleのデフォルト動作は何ですか?そのまま残すと、 'widget'ライブラリのどのバージョンが最終的に検索/解決されますか?再度、感謝します! – smeeb
1)私は単純なものを意味していましたが、特定のバージョンで必要としないライブラリを除外できるmavenの構文を知っていますので、他のバージョンは自動的に引き出されます。2)クラスパスの追加のためにgradleの場合は、リストの最初のものになります。これはmavenにとっては最新のものになります。 –