多分この質問はちょっとしたようですが、何とか私を悩まします。アーティファクトがJARとしてビルドされているときに、Mavenスコープcompile
とprovided
を使用した場合の違いは何ですか?それがWARなら、私は理解します。アーティファクトはWEB-INF/libに含まれるかどうかです。しかし、JARの場合、依存関係は含まれません。スコープがcompile
またはprovided
の場合、クラスパスにする必要があります。私はprovided
の依存関係は推移的ではないことを知っていますが、それは唯一の違いですか? Maven DocからMavenスコープの違いはコンパイルされ、JARパッケージ化のために提供されます
答えて
:
- は、これは何も指定されていない場合に使用される、デフォルトのスコープです
コンパイルします。コンパイル 依存関係は、プロジェクトのすべてのクラスパスで使用できます。 さらに、これらの依存関係は依存するプロジェクトに伝播されます。
- が
を提供これは非常に、コンパイルのようなものですが、あなたはJDKまたは コンテナは、実行時に依存関係を提供することを期待を示しています。たとえば、 Java Enterprise EditionのWebアプリケーションを構築する場合、 は、Webコンテナがこれらのクラスを提供するため、サーブレットAPIおよび関連Java EE APIへの依存関係を スコープに設定します。この スコープは、コンパイルおよびテストのクラスパスでのみ使用でき、 は推移しません。
要約:(あなたが述べたように)
- 依存関係が推移的ではありません
- 提供範囲は、一方のスコープは、すべてのクラスパスで利用可能ですコンパイルし、コンパイルとテストクラスパスでのみ利用可能です。あなたはそのすべての依存関係(一般的なXXXX-all.jarを)持つ単一のJARファイルを生成するために計画している場合
- 提供の依存関係が
をパッケージ化されていない、そして、スコープの問題を提供し、この内部クラス理由スコープは生成されるJAR内ではパッケージ化されません。
詳細については
dependency ==>依存関係は**パッケージ化されません**。 –
OP混乱は、 'maven-assembly-plugin'を使ってパッケージ化すると、明らかに解決されます。最も重視されている答えには言及していません。 –
私はこの答えを理解していません。それはコメントのように見えます。 – reinierpost
をmavenのアセンブリ・プラグインを参照してください。コンパイルは、アプリをコンパイルし、実行するためのJARが必要であることを意味します。 Webアプリケーションの場合、例として、JARはWEB-INF/libディレクトリに配置されます。
コンパイルにはJARが必要ですが、実行時にはすでに環境によって提供されているJARがあるため、アプリケーションにパッケージ化する必要はありません。 Webアプリケーションの場合、これはJARファイルがWEB-INF/libディレクトリに置かれないことを意味します。
Webアプリケーションの場合、アプリケーションサーバーがすでにJAR(またはその機能性)を提供している場合は「提供済み」を使用し、そうでなければ「コンパイル」を使用します。
をコンパイルし、クラスパスに使用できるようにし、それは通常のjarファイルであれば、最終的な瓶の中にこの依存関係を追加しないでください。最終的にjarファイルがが
依存関係は、実行時環境で利用できるようになりますので、追加していない提供
- (例えば、実行可能なjarファイル)単一のjarがある場合はジャーにこのjarファイルを追加いずれにしてもこの依存関係。 (つまり、実行可能なjarなど)
jarファイルの場合、差異は、maven-jar-pluginでaddClassPathがtrueに設定されている場合、jarに含まれるMANIFEST.MFファイルにリストされているクラスパスにあります構成。 'コンパイル'依存関係はマニフェストに現れ、 '提供された'依存関係は現れません。
私のペットのかわいこの1つは、これらの2つの単語が同じ緊張を持つべきであるということです。コンパイルして提供するか、コンパイルして提供するかのどちらかです。ここ
は、サポートされているすべての依存関係(ソースmaven doc)についての簡単な
は、これは何も指定されていない場合に使用されるデフォルトのスコープ、ある
をコンパイルしています。コンパイルの依存関係は、プロジェクトのすべてのクラスパスで使用できます。さらに、これらの依存関係は依存するプロジェクトに伝播されます。
が
を提供これは非常に、コンパイルのようなものですが、あなたはJDKまたはコンテナは、実行時に依存関係を提供することを期待を示しています。たとえば、Java Enterprise Edition用のWebアプリケーションを構築する場合、Webコンテナがこれらのクラスを提供するため、Servlet APIおよび関連するJava EE APIへの依存関係を指定されたスコープに設定します。このスコープは、コンパイルおよびテストのクラスパスでのみ使用でき、推移的ではありません。
ランタイム
このスコープは、依存関係がコンパイルに必要とされないことを示しますが、実行するためです。ランタイムとテストのクラスパスにありますが、コンパイルクラスパスにはありません。
試験
この範囲は、依存関係は、アプリケーションの通常の使用のために必要とされていないことを示し、そして試験のコンパイルと実行フェーズでのみ使用可能です。この範囲は推移的ではありません。
システム
このスコープは、明示的に含まれているJARを提供しなければならないことを除いてに似ています。アーティファクトは常に利用可能であり、リポジトリで参照されません。この範囲のみセクションのタイプのPOMの依存性に支持されている(Mavenの2.0.9以降でのみ使用可能)
インポート。これは、指定されたPOMのセクション内の依存関係の有効なリストで置き換えられる依存関係を示します。それらが置き換えられるため、インポートのスコープに依存することは、依存関係の推移性を制限することに実際には関与しません。
- 1. maven提供スコープ
- 2. パッケージ化されたプロジェクトをjarに依存してコンパイルする
- 3. MSCVR100D.DLLデバッグシンボルはどのパッケージで提供されていますか?
- 4. パッケージ化されたアーカイブと展開されたアーカイブの違い
- 5. MavenがスコープとEclipseランタイムクラスパスを提供
- 6. ソースからのパッケージとコンパイルされたバイナリからのパッケージのインストールの違い
- 7. 提供されたユーザーアカウント
- 8. jarファイルにパッケージ化されたドキュメントへのアクセス
- 9. 子供が親のためにグループ化されている人
- 10. Netbeansでコンパイルされたjarのエラー
- 11. 難読化されたAndroid dex/jarファイルをJavaソースコードに逆コンパイル
- 12. スタートアップ時に提供されたコアデータdoc
- 13. 私はのlibusbパッケージで提供される例libusb.cコンパイルしようとしているUbuntuの
- 14. RavenDb - パッケージに提供された資格情報が認識されませんでした
- 15. JSTL 1.2が宣言されましたが、Mavenリポジトリから1.1が提供されました
- 16. tomcat7-maven-pluginのゴールで「提供された」クラスパスを使用する
- 17. VSIXにパッケージ化されたプロジェクトテンプレートにアセンブリを含めるには
- 18. Mavenのwarプロジェクトにパッケージ化される異なるファイル
- 19. 依存関係は、maven jarアーティファクトでパッケージ化されているはずですか?
- 20. warファイルにパッケージ化されたjarファイルからリソースをロードする方法は?
- 21. Midjeの事実に「提供された」ものはどのように実装されていますか?
- 22. 先にコンパイルされたコードとネイティブにコンパイルされたコードの違いは何ですか?
- 23. mavenパッケージには依存するjarファイルは含まれていません
- 24. 国際化されたWebサイトのオフラインアプリケーションキャッシュマニフェストを提供するにはどうすればよいですか?
- 25. Mavenを使用して生成されたjarまたはsources-jarにgroovyテストソースを含める方法
- 26. Maven/Gradleコンパイルされたクラスをリストアップ
- 27. JPAはEclipseLinkからどのプロバイダに提供されますか?
- 28. Androidで提供されるonKey()、OnKeyDown()、およびdispatchKeyEvent()メソッドの違いは?
- 29. ログインプラットフォームまたはデバイスに応じてトークンが提供されていますか?
- 30. ストアドプロシージャパラメータが提供されていませんでした。エラー
はい、わかります。しかし、私は 'JARパッケージング'コンテキストでスコープの違いについて熟考しています。 Mavenのdocはそれについて言及しません。 私はしばらくMavenを使っていますが、私はすでにそれについて質問しています:) 'JARパッケージング'コンテキストでは 'compile'と' provided'の間に違いはないようです依存関係遷移)。私は正しい? – emstol
"classpath-availability"、はい。 – Jacob
@Jacob "コンパイルスコープは*すべてのクラスパス*で利用可能ですが、"とは何を意味していますか? – Geek