web-dev-qa-db-ja.com

依存関係アーティファクトのMaven「コンパイラーのみ」スコープはありますか

これは機能的な探求というよりは意味論的な探求であることに気づきました。

コンパイルスコープの依存関係には3つのタイプがあります。

  1. コンパイルのみのスコープ。実行時には使用されません。 GWTクライアント側開発者、MVP4G、RestyGWT、ソース保持アノテーションプロセッサ。私はRESTを使用しているので、GWTサーバー側は必要ありません。

  2. 提供-コンパイルにはHibernatejarが必要ですが、JBossによって提供されます。

  3. コンパイル+ランタイムjar。

ケース2の場合、提供されたスコープを使用できます。ケース3では、コンパイルスコープを使用します。

ただし、ケース1の場合、JBossがこれらのファイルをまったく提供していなくても、提供されたスコープを使用します。また、実行時に必要ありません。

とにかく、Mavenは、コンパイル時を除いてアーティファクトが実際には必要ないスコープに対して「提供された」の同義語を提供する必要があると思いませんか?おそらく、「コンパイル専用」スコープが必要ですか?

24
Blessed Geek

のjarが真の「ランタイム」依存関係(ビルドのみ)ではなく、最終的なアーティファクトではない場合は、さまざまな方法でそれらを除外できます。

  1. アセンブリ記述子での除外
  2. Jar(またはwar、earなど)プラグイン構成での除外
  3. シェードプラグインはjarを最小化します 目標

不要なクラスを出荷するのは面倒であることに同意します(本番環境でjunitとtestng jarを確認しました-brrrr ...)が、すべての実用的な目的にとって、それはかなりマイナーなものです。

依存関係の競合がある場合(つまり、ライブラリまたはフレームワークの「すべてのdeps」バージョンを出荷する場合)、それは別の話ですが、ここで直面しているもののようには聞こえません。

7
noahlz

語彙の半分しか知らない場合でも、言語が細かい区別を提供しないと文句を言わないでください。

アノテーションプロセッサなど、依存関係がビルドにのみ使用される場合は、Maven <plugin>または<dependency>である必要があります。

それ以外の場合、コンパイルクラスパスにある場合は、実行時に生成されたクラスファイルをリンクする必要があります。次に、2つのケースがあります。

  1. そのクラスをロードする必要があります
    1. クラスはアプリケーションの一部として出荷する必要があります:<scope>compile</scope>
    2. クラスはランタイム環境によって提供される必要があります:<scope>provided</scope>
  2. 必要な場合があります(クラスは特定の状況でのみロードされるため):<optional>true</optional>

カバーされていない唯一のオプションは、Javaプログラムをコンパイルし、JVMで実行しないことです。これは本当にあいまいなユースケースであり、Mavenの設計者がこの区別を表現するためだけのスコープ-特にそれはMavenのコア責任(ソフトウェアの構築)とは無関係であるためです。

14
meriton