1

わかりました、これはおなじみの質問かもしれませんが、私はまだ混乱しており、詳細を本当に明確にする答えを見つけるのに苦労しています.

私がいくつかの Maven プロジェクトを持っているシナリオ では、大多数が JAR アーティファクトを作成し、1 つが WAR アーティファクトの作成を担当しています。WAR アーティファクトには、これらの JAR が WEB-INF/lib フォルダー内に含まれるようにするために、コンパイルのスコープを持つ JAR アーティファクトへの依存関係があります。

このプラグインが、どの依存関係と推移的な依存関係が WARs lib フォルダーに含まれるかに関して、スコープにどのように応答するかはまだ不明です私の理解では、コンパイルすると、コンパイル スコープで宣言されている (再帰的になど) 依存関係と共に JAR が含まれることになりますが、提供されると費用はかかりません。指定されたスコープの依存関係は含まれません。

問題 具体的な例を挙げると、WAR プロジェクトは、コンパイルのスコープを持つwar-a内部 JAR プロジェクトに依存しています。スコープのため、WARs lib フォルダーに含まれます。コンパイルの範囲で、サードパーティ ライブラリ log4j に依存するようになりました。log4j JAR も、そのスコープのために lib フォルダーに含まれます。しかし...メールなどのlog4jの依存関係もそうです。log4jが必要ですが、その依存関係は必要ありません。提供された log4j を構成すると、その依存関係は含まれませんが、それ自体も含まれません。jar-ajar-ajar-a

除外を使用するなどのオプションを検討しましたが、40 以上の内部 JAR プロジェクトがある場合、POM ファイルで多くの除外が行われます。また、除外を使用するには、サードパーティの依存関係に関する特定の知識を知る必要がありますが、これは不要だと感じています。

誰かが上記のいずれかを明確にし、拡張し、答えることができますか? どんな入力でも大歓迎です。

更新上記に加えて、私は決定に行き詰まっています。必要なサードパーティ JAR のリストを WAR 内にバンドルできるようにする必要があります。これは、私たちが持っているさまざまな内部 Maven JAR プロジェクトのコンパイル スコープの依存関係を介して解決されます。または、すべてのサード パーティの依存関係を内部 Maven JAR プロジェクト内で提供されているものとして宣言し、Maven WAR プロジェクトのコンパイル スコープで明確なセットを指定する必要があります。

追加のサードパーティの依存関係が推移的な依存関係パスを介して WAR アーティファクトに自動的に追加されるため、私は前者のアプローチを好みます。しかし、2 番目のアプローチでは、どのサードパーティ ライブラリが含まれるかを正確に知ることができます。

4

2 に答える 2

1

プロジェクトのでpom.xml、タグを使用して依存関係をjar-a除外します。mailexclusions

<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.x</version>
    <exclusions>
        <exclusion>
            <groupId>log4j</groupId> 
            <artifactId>mail</artifactId>
        </exclusion>
    </exclusions>
</dependency>

サードパーティのライブラリが不要なライブラリに依存している場合は、それが最善の方法です。それらがオープンソースプロジェクトである場合は、不要なライブラリを削除するパッチを送信できます。

「将来の保証」について:繰り返し可能なビルドが必要な場合は、依存関係の正確なバージョン番号を宣言する必要があります。[1.0]これにより、新しいバージョンがリリースされるたびにMavenがそれらを更新できなくなります。このように、他のライブラリに依存する新しいバージョンに更新しないため、サードパーティのライブラリが依存関係を変更することはありません。もちろん、サードパーティのライブラリを新しいバージョンに更新するときも、依存関係を確認する必要があります。

一方、機能テストでは、新しいライブラリバージョンでアプリケーションが破損したときにレポートを作成する必要があります。

40以上のPOMを使用するのはそれほど簡単ではないようですが、すべての依存関係を手動でダウンロードする必要があった昔よりも簡単です。

http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Transitive_Dependencies

于 2011-10-04T13:32:28.713 に答える
1

このドキュメントで説明されている主題は、私の質問に対する答えのようなものです。<dependencyManagement>タグの使用について説明します。

このタグは、親 POM ファイル内で宣言でき、依存関係の詳細と除外を指定できます。次に、親 POM から継承する POM は通常どおり依存関係を宣言できますが、オーバーライドされない限り、親から構成を継承します。

たとえば、親の POM 依存関係の構成を取り上げます。

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.15</version>
        <exclusions>
          <exclusion>
            <groupId>log4j</groupId>
            <artifactId>mail</artifactId>
          </exclusion>
        </exclusions>
        <scope>compile</scope>
      </dependency>   
    </dependencies>     
  </dependencyManagement>

子 POM 内の依存関係は、はるかに単純になりました。

  <dependencies>
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
    </dependency>
  </dependencies>

ここで、子 POM はバージョン、除外、およびスコープ構成を継承します。これは、サードパーティのライブラリの依存関係について知る必要があるなど、私が言及したすべての問題を解決するわけではありませんが、これらの詳細を構成および管理するための単一の場所を提供します.

于 2011-10-04T15:27:19.943 に答える