1. ホーム

[解決済み】maven-shade-pluginは何に使うのか、なぜJavaパッケージを再配置したいのか?

2022-03-27 18:20:24

質問

ある人のpom.xmlでmaven-shade-pluginが使われているのを発見しました。私はこれまでmaven-shade-pluginを使ったことがなかったので(そして私はMaven n00bです)、これを使用する理由とその機能を理解しようとしました。

を見てみると Mavenドキュメント しかし、この文は理解できません。

このプラグインは、アーティファクトを依存関係を含めてuber-jarにパッケージ化し、依存関係の一部のパッケージをshade - すなわちリネームする機能を提供します。

ページのドキュメントがあまり初心者に優しくないようです。

uber jar とは何ですか?依存関係のあるパッケージの名前を変更することに何の意味があるのでしょうか?maven-shade-pluginのapacheページにある"Selecting contents for Uber Jar,"などの例を見てみましたが、"shading."で何を達成しているのかまだ理解できていないようです。

この場合、なぜシェーディングが必要なのか、どのような問題を解決しているのか、などの説明があれば、ぜひ教えてください。最後に、maven-shade-pluginはいつ使えばいいのでしょうか?

どのように解決するのですか?

ユーバーJARとは、簡単に言えば、すべてを含んだJARのことです。

通常、Mavenでは依存関係管理に頼っています。 アーティファクトには、それ自身のクラスやリソースだけが含まれています。 Mavenは、プロジェクトがビルドされるときに、プロジェクトが依存しているすべてのアーティファクト(JARなど)を見つける責任を負います。

uber-jarは、すべての依存関係を受け取り、依存関係の内容を抽出し、プロジェクト自体のクラス/リソースと一緒に、1つの大きなJARに入れるものです。このようなuber-jarを持つことで、アプリを実行するために、大量の小さなJARの代わりに、1つの大きなJARが必要になるため、実行が容易になります。 また、場合によっては配布も容易になります。

余談ですが、Mavenの依存関係解決機能を台無しにしてしまうので、uber-jarをMavenの依存関係として使用するのは避けてください。通常、uber-jarは実際のデプロイメントや手動配布のための最終アーティファクトにのみ作成し、Mavenリポジトリに置くためには使用しません。


更新: 質問の一部に答えていないことに気づきました: "依存関係のパッケージ名を変更するポイントは何ですか?以下は、同じような質問をしている人たちの助けになればと思い、簡単に更新したものです。

デプロイを容易にするためにuber-jarを作成することは、shadeプラグインの使用例の1つです。また、パッケージ名の変更を伴う一般的な使用例もあります。

例えば、私が開発している Foo ライブラリの特定のバージョン (例えば 1.0) に依存します。 Bar ライブラリのインストールが必要です。 他のバージョンの Bar libは、(APIの変更、または他の技術的な問題などの理由で)。 もし私が単に Bar:1.0 として Foo がMavenの依存関係にある場合、次のような問題に陥る可能性があります。 Qux プロジェクトは Foo であり、さらに Bar:2.0 (を使用することはできません。 Bar:1.0 なぜなら Qux の新機能を使用する必要があります。 Bar:2.0 ). ここでジレンマが発生します。 Qux 使用 Bar:1.0 (どの Qux のコードは動作しません)または Bar:2.0 (どの Foo のコードは動作しません)?

この問題を解決するために、開発者は Foo の使用法を変更するために、shade プラグインを使用することを選択できます。 Bar にあるすべてのクラスが Bar:1.0 jar に埋め込まれます。 Foo jarのパッケージとなり、埋め込まれた Bar クラスは com.bar から com.foo.bar . そうすることで Qux に安全に依存することができます。 Bar:2.0 というのも、現在 Foo に依存しなくなりました。 Bar のコピーを使用しています。 Bar は、別のパッケージに配置されています。