0

ここで解決しようとしている依存関係の地獄の状況が少しあります。A、B、C の 3 つのプロジェクトがあります。A と B は両方とも C に依存しています。今、A は私が直接制御できる私自身のモジュールです。 B は私が使用しているライブラリで、C はモジュール A から直接使用されるライブラリと、依存関係 B によって使用されるライブラリです。

これを視覚化するには:

   C
   ^
 /  B
|   ^
 \ /
  A

さまざまな理由から、ローカルで必要な C に小さな変更を加える必要がありましたが、C が通常ダウンロードされるグローバル リポジトリにはデプロイしたくない (またはデプロイできない) 必要があります。

ローカル リポジトリにインストールされている C の修正バージョンに分類子をタグ付けし、A の POM で依存関係を変更して、次のような分類子を含めることで、これを実行しようとしました。

<dependency>
  <groupId>foo</groupId>
  <artifactId>C</artifactId>
  <version>0.7.16</version>
  <classifier>myclassifier</classifier>
</dependency>

しかしmvn dependency:tree、推移的な依存関係のために、クラスパスに分類子を含むバージョンと分類子を含まないバージョンの両方があることがわかります。

[INFO] --- maven-dependency-plugin:2.1:tree (default-cli) @ A ---
[INFO] org.example:A:jar:0.1-SNAPSHOT
...
[INFO] +- foo:C:jar:myclassifier:0.7.16:compile
[INFO] +- bar:B:jar:3.2.5:compile
[INFO] |  +- foo:C:jar:0.7.16:compile

このコンテキストで自分のプロジェクト/mavenに変更したバージョンを強制的に使用させる方法はありますか?

編集:解決策

今のところ、Filipe と Samuel の回答のおかげで、A の pom.xml でこのような除外を使用して解決しました。

<dependency>
  <groupId>foo</groupId>
  <artifactId>C</artifactId>
  <version>0.7.16</version>
  <classifier>myclassifier</classifier>
</dependency>

<dependency>
  <groupId>bar</groupId>
  <artifactId>B</artifactId>
  <version>3.2.5</version>
  <exclusions>
    <exclusion>
      <groupId>foo</groupId>
      <artifactId>C</artifactId>
    </exclusion>
  <exclusions>
</dependency>

注:これはもちろん、C での編集が非常にマイナーであり、B で使用される API を変更しない場合にのみ機能します。これは私の場合です。

4

2 に答える 2

2

明らかに、この新しいバージョンの C は、新しいアーティファクトではなく、このアーティファクトの新しいバージョンです。

したがって、ここでは分類子を使用するのではなく、代わりにバージョン番号を増やしてください。

プロジェクトは最新バージョンでビルドされます (最新バージョンの解決に問題がある場合でも、pom で推移的な依存関係を除外できます)。

ただし、B プロジェクトは古いバージョンの C でコンパイルされているため、これを行うときは非常に注意する必要があります。そのため、メソッド消去を変更したり、メソッドやクラスを削除したりすると、実行時に問題が発生します。

C ライブラリにクラスまたはメソッドを追加するだけであれば、動作するはずです。

于 2013-03-06T11:09:36.403 に答える