web-dev-qa-db-ja.com

Maven:ライブラリによって追加された依存関係をオーバーライドする方法

ここに私の一般的な問題があります:

私のプロジェクトPは、バージョン1.0.1に依存するCに依存するBに依存するAに依存します。

Dのバージョン1.0.1に問題があり、別のモジュールの使用を強制したい。 Dへの依存関係を直接追加していないため、プロジェクトのPOMでこれを宣言する方法がわかりません。 Dへの依存関係を宣言したのはCです。

重要:この場合、バージョンが変更されるだけでなく、グループとアーティファクトも変更されます。したがって、依存関係のバージョンをオーバーライドするだけでなく、モジュールを除外して別のモジュールを含めることも重要です。

具体的なケースでは、Dは1.0.1に bug があるStAXです。バグのノートによると、「問題はstax-api-1.0.1(maven GroupId = stax)をstax-api-1.0-2(maven GroupId = javax.xml.stream)に置き換えることで解決されました」まさにそれを試みています。

したがって、D = stax:stax-api:jar:1.0.1およびC = org.Apache.xmlbeans:xmlbeans:jar:2.3.0

重要な場合に備えて、maven 2.0.9を使用しています。

Mvndependency:treeの出力

mvn dependency:tree
[..snip..]
[INFO] +- org.Apache.poi:poi-ooxml:jar:3.6:compile
[INFO] |  +- org.Apache.poi:poi-ooxml-schemas:jar:3.6:compile
[INFO] |  |  +- org.Apache.xmlbeans:xmlbeans:jar:2.3.0:compile
[INFO] |  |  |  \- stax:stax-api:jar:1.0.1:compile

私のプロジェクトのPOMでは、「A」に次の依存関係があります。

<dependency>
    <groupId>org.Apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.6</version>
</dependency>
<dependency>
    <groupId>org.Apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.6</version>
</dependency>

前もって感謝します。

100

現在のPOMでバージョンを指定するだけです。ここで指定されたバージョンは、その他を上書きします。

バージョンの強制
[。


リソース:

91
Colin Hebert

または、必要のない依存関係を除外することもできます。 STAXはJDK 1.6に含まれているため、1.6を使用している場合は、完全に除外できます。

以下の私の例はあなたにとって少し間違っています-あなたは2つの除外のうちの1つだけを必要としますが、私はどちらが確かかわかりません。 Staxには他のバージョンもあります。以下の例では、Aをインポートし、Bをインポートし、CとDをインポートしました。したがって、「A」への依存関係で、Staxの両方のバージョンを除外しました。

<dependency>
  <groupId>a.group</groupId>
  <artifactId>a.artifact</artifactId>
  <version>a.version</version>
  <exclusions>
    <!--  STAX comes with Java 1.6 -->
    <exclusion>
      <artifactId>stax-api</artifactId>
      <groupId>javax.xml.stream</groupId>
    </exclusion>
    <exclusion>
      <artifactId>stax-api</artifactId>
      <groupId>stax</groupId>
    </exclusion>
  </exclusions>
<dependency>
22
scot

また、サードパーティのライブラリで依存関係を無効にすることもできませんでした。 scotのアプローチを除外して使用しましたが、pomの新しいバージョンとの依存関係も追加しました。 (Maven 3.3.3を使用しました)

したがって、stAXの例では、次のようになります。

<dependency>
  <groupId>a.group</groupId>
  <artifactId>a.artifact</artifactId>
  <version>a.version</version>
  <exclusions>
    <!--  STAX comes with Java 1.6 -->
    <exclusion>
      <artifactId>stax-api</artifactId>
      <groupId>javax.xml.stream</groupId>
    </exclusion>
    <exclusion>
      <artifactId>stax-api</artifactId>
      <groupId>stax</groupId>
    </exclusion>
  </exclusions>
<dependency>

<dependency>
    <groupId>javax.xml.stream</groupId>
    <artifactId>stax-api</artifactId>
    <version>1.0-2</version>
</dependency>
6

ルートポンの</dependencies>タグ内に配置したものは、ルートポンのすべての子モジュールに含まれます。すべてのモジュールがその依存関係を使用している場合、これが方法です。

ただし、10個の子モジュールのうち3個だけが何らかの依存関係を使用する場合、この依存関係がすべての子モジュールに含まれることは望ましくありません。その場合は、</dependencyManagement>内に依存関係を置くだけです。これにより、依存関係を必要とする子モジュールは必ず独自のpomファイルで宣言する必要がありますが、</dependencyManagement>タグで指定された同じバージョンの依存関係を使用します。

</dependencyManagement>を使用して、推移的な依存関係で使用されるバージョンを変更することもできます。これは、最上位のpomファイルで宣言されているバージョンが使用されるためです。これは、プロジェクトAに別の外部プロジェクトC v1.0を含む外部プロジェクトB v1.0が含まれる場合に役立ちます。プロジェクトC v1.0でセキュリティ違反が見つかり、v1.1で修正されることもありますが、Bの開発者はプロジェクトをCのv1.1を使用するように更新するのが遅いです。その場合、単に宣言できます。プロジェクトのルートポム内のC v1.1への依存が `にあり、すべてが良好になります(B v1.0がC v1.1でコンパイルできると仮定)。