web-dev-qa-db-ja.com

シェードジャーとは何ですか?そして、ユーバージャーとシェードジャーの違い/類似点は何ですか?

シェーディングされたジャーとは何か、maven-shade-plugin役に立つ?また、Uber jarとは何ですか。

12
user3478709

これはシェーディングの説明の基礎となるため、最初に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内のパッケージの名前を変更することにより、このような問題を回避するのに役立ちます。

例えば:

  1. V1.0.0のFooライブラリを含むuber JARを作成します。
  2. 他の誰かがアプリケーションでBarのuber JARを使用します
  3. 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アイデアの拡張であり、通常、次の場合に使用が制限されます。

  • JARは、別のアプリケーション/ライブラリ内で使用されるライブラリです
  • JARの作成者は、JARによって使用される依存関係が制御下にあることを確認したい
  • JARの作成者は、JARを使用するアプリケーション/ライブラリの「バージョンの衝突」問題を回避したい
30
glytching