シェーディングされたジャーとは何か、maven-shade-plugin
役に立つ?また、Uber jarとは何ですか。
これはシェーディングの説明の基礎となるため、最初にuber JARが何であるかを説明します。
ber JAR
Uber JARは、複数のJAR(または、それほど一般的ではないが、他の複数のJAR自体)の内容を含むJARです。
アプリケーションはほぼ確実に他のパッケージを使用し、これらのパッケージはJARとして提供される場合があります。 Mavenを使用する場合、これらの依存関係は次のように表現されます。
<dependency>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
</dependency>
実行時に、アプリケーションは、クラスパスでこのJARに含まれるクラスを見つけることを期待します。
これらの各依存JARをアプリケーションと共に出荷するのではなく、これらの依存JARのすべてのクラスなどを含むuber JARを作成し、このuber JARからアプリケーションを実行するだけです。
シェーディング
シェーディングは、uber JARを作成し、そのuber JARに含まれるパッケージの名前を変更する方法を提供します。 uber JARが別のアプリケーションの依存関係として使用される可能性がある場合、uber JARの依存クラスのバージョンが、この他のアプリケーションの同じ依存関係のバージョンと競合するリスクがあります。シェーディングは、uber JAR内のパッケージの名前を変更することにより、このような問題を回避するのに役立ちます。
例えば:
Foo
ライブラリを含むuber JARを作成します。Bar
のuber JARを使用しますBar
アプリケーションは、Foo
に依存していますが、そのライブラリのv1.2.0に依存しています。Foo
のバージョン1.0.0と1.2.0の間に衝突がある場合、Bar
の所有者はどちらがロードされるかに依存できないため、問題が発生する可能性があります。アプリケーション内で実行する場合、コードが誤動作するか、コードが誤動作します。
シェーディングは、このような問題を回避するのに役立ち、Foo
のプロバイダーが使用する依存ライブラリのバージョンを明示できるようにします。
maven-shade-plugin
を使用すると、(a)uber JARを作成し、(b)その内容をシェーディングできます。
概要
Uber JARの作成は、展開プロセスを簡素化するための便利な手法です。
シェーディングは、uber JARアイデアの拡張であり、通常、次の場合に使用が制限されます。