誰かの pom.xml で maven-shade-plugin が使用されているのを見つけました。私はこれまで maven-shade-plugin を使用したことがなかったので (Maven 初心者です)、これを使用する理由とその機能について理解しようとしました。
私はMaven ドキュメントしかし、私はこの発言を理解できません:
このプラグインは、依存関係を含む成果物を uber-jar にパッケージ化し、一部の依存関係のパッケージをシェーディング (つまり名前変更) する機能を提供します。
このページのドキュメントはあまり初心者向けではないようです。
「uber jar」とは何ですか? なぜこれを作ろうとするのでしょうか? 依存関係のパッケージの名前を変更する意味は何ですか? maven-shade-plugin apache ページの「Uber Jar のコンテンツの選択」などの例を確認してみましたが、「シェーディング」で何が達成されるのかまだ理解できません。
わかりやすい例や使用例(この場合、なぜシェーディングが必要だったのか、どのような問題を解決するのかの説明付き)があれば、教えていただけるとありがたいです。最後に、maven-shade-plugin はいつ使用すればよいのでしょうか?
ベストアンサー1
Uber JAR は、簡単に言えば、すべてを含む JAR です。
通常、Maven では依存関係の管理に依存します。アーティファクトには、それ自身のクラス/リソースのみが含まれます。Maven は、プロジェクトがビルドされるタイミングに応じて、プロジェクトが依存するすべてのアーティファクト (JAR など) を見つける責任があります。
uber-jar は、すべての依存関係を受け取り、依存関係の内容を抽出して、プロジェクト自体のクラス/リソースとともに 1 つの大きな JAR に格納するものです。このような uber-jar を使用すると、アプリを実行するのに大量の小さな JAR ではなく 1 つの大きな JAR だけが必要になるため、実行が簡単になります。また、場合によっては配布も容易になります。
補足: uber-jar を Maven 依存関係として使用しないでください。Maven の依存関係解決機能が損なわれます。通常、uber-jar は実際のデプロイメントまたは手動配布用の最終成果物に対してのみ作成し、Maven リポジトリに配置するために作成することはありません。
更新: 質問の一部に答えていないことに気付きました。「依存関係のパッケージの名前を変更する意味は何ですか?」。同様の質問を持つ人々の役に立つことを願って、簡単な更新をいくつか紹介します。
デプロイメントを容易にするために uber-jar を作成することは、shade プラグインの使用例の 1 つです。パッケージ名の変更を伴うその他の一般的な使用例もあります。
たとえば、Foo
特定のバージョンのライブラリ (例: 1.0) に依存するライブラリを開発しているとしますBar
。他のバージョンのライブラリは使用できないと仮定しますBar
(API の変更やその他の技術的な問題などにより)。Mavenで の依存関係をBar:1.0
として単純に宣言するとFoo
、次のような問題が発生する可能性があります。プロジェクトQux
は に依存しておりFoo
、また(の新機能を使用する必要があるため をBar:2.0
使用できません)。ここでジレンマが生じます。 (のコードは機能しません) と(のコードは機能しません) のどちらを使用すべきでしょうか?Bar:1.0
Qux
Bar:2.0
Qux
Bar:1.0
Qux
Bar:2.0
Foo
この問題を解決するために、 の開発者は、Foo
shade プラグインを使用して の使用法の名前を変更しBar
、jar 内のすべてのクラスBar:1.0
が jar に埋め込まれFoo
、埋め込まれたクラスのパッケージがからBar
に変更されるようにすることができます。そうすることで、はに依存しなくなり、別のパッケージにある「変更された」の独自のコピーを使用するようになるため、は に安全に依存できるようになります。com.bar
com.foo.bar
Qux
Bar:2.0
Foo
Bar
Bar