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
ライブラリが常にwidget
ライブラリの 1.x バージョンに依存しているとしWidget
ましょうmeow
。
widget
そのため、コンパイル クラスパスで の 2 つのバージョンを指定しています。
widgetmakers:widget:1.0.4
これは、fizzbuzz
ライブラリの依存関係としてライブラリによって取り込まれます。とwidgetmakers:widget:2.0.0
私が直接参照している
Widget
したがって、明らかに、最初にクラスロードされる のバージョンに応じて、Widget#meow
または のいずれかになりますWidget#bark
。
Gradle は、ここで私を支援するための機能を提供していますか? 同じクラスの複数のバージョンを取り込みfizzbuzz
、古いバージョンの を使用するようにクラスを構成Widget
し、新しいバージョンを使用するように私のクラスを構成する方法はありますか? そうでない場合、私が考えることができる唯一の解決策は次のとおりです。
- ある種のシェーディングおよび/またはファットジャーベースのソリューションを達成できるかもしれません。おそらく、すべての依存関係をパッケージとして取り込み、
myapp/bin
異なるバージョンプレフィックスを付けます。確かに、ここで明確な解決策はわかりませんが、何かが実現可能であると確信しています(ただし、完全にハック/厄介です)。または... - 依存関係グラフ全体を注意深く調べて、すべての推移的な依存関係が互いに競合していないことを確認してください。この場合、これは
fizzbuzz
メンテナーにプルリクエストを送信して最新widget
バージョンにアップグレードするか、残念ながらダウングレードmyapp
して古いwidget
バージョンを使用することを意味します。
しかし、Gradle (これまでのところ) は私にとって魔法のようなものでした。だから私は尋ねます:ここで私を利用できるGradleマジックはありますか?