[解決済み】maven-shade-pluginは何に使うのか、なぜJavaパッケージを再配置したいのか?
質問
ある人の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
は、別のパッケージに配置されています。
関連
-
[解決済み] Firebase クラスにシリアライズするプロパティが見つからない
-
[解決済み] この配列の中の数字を入れ替えるには、何が足りないのでしょうか?ジャバ
-
[解決済み] Application startメソッドで例外が発生する。JavaFx 11
-
[解決済み] Java Genericメソッドをstaticにするには?
-
[解決済み] なぜJPAには@Transientアノテーションがあるのですか?
-
[解決済み] アクティビティに割り当てられない
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] Mavenスナップショットとは何か、なぜそれが必要なのか?
-
[解決済み】JARパッケージングにおけるmaven scope compileとprovidedの違いについて
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] トークンのシンタックスエラー、これらのトークンを削除してください [closed].
-
[解決済み] この配列の中の数字を入れ替えるには、何が足りないのでしょうか?ジャバ
-
[解決済み] コレクションへの共有参照が見つかりました org.hibernate.HibernateException
-
[解決済み] 一部の入力ファイルが非推奨のAPIを使用またはオーバーライドしている
-
[解決済み] Eclipse- Dynamic Web Module 3.0 で新しいプロジェクトを作成するときに Java 1.6 以降が必要なエラーが発生する。
-
[解決済み] javac ソースファイルが見つかりません
-
[解決済み] 要素 'beans' の宣言が見つかりません。
-
[解決済み] どのように配列の10未満の値(x * 2)を倍増するコードを取得するには?(Java)
-
[解決済み] Javaでdoubleをfloatに変換する
-
[解決済み] x--やx++はここで何をするのですか?