27

これは、機能的な探求というよりも意味論的な探求であることがわかりました。

3 種類のコンパイル スコープの依存関係があります。

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

  2. 提供 - コンパイルに必要な Hibernate jar が JBoss によって提供されます。

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

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

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

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

4

2 に答える 2

13

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

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

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

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

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

于 2012-10-10T17:01:25.840 に答える
8

If the jars with are not true "runtime" dependencies (only for building) but not for the final artifact, you can exclude them various means:

  1. Exclusion in the assembly descriptor
  2. Exclusion in the jar (or war, ear, whatever) plugin configuration
  3. Shade Plugin minimize jar goal

I agree that shipping unnecessary classes is annoying (I've seen junit and testng jars in production deployments - brrrr...), but for all practical purposes it's a rather minor one.

If you have a dependency conflict (i.e shipping a "all deps" version of a library or framework), that's a different story, but doesn't sound like what you're facing here.

于 2012-10-10T20:44:53.010 に答える