2017-06-19 7 views
5

Wicketライブラリを含むいくつかのライブラリを含むMaven Java Webアプリケーション(.WAR)プロジェクトがあります(ただし、問題はウィックセット自体ではなく、むしろmavenと思われます)。ここで Mavenに同じ依存関係の複数のバージョンが含まれているのはなぜですか?

が問題だ:あなたはこのスクリーンショットで見ることができるように、 6.20.06.18.0::私だけ Wicket 6.20.0含まさえカントー、結果.WARは 二つのコピーのWicketライブラリのが含まれてい

enter image description here

いくつかの相反する輸入品を考えて、私は依存木を以下のものを使って表示しました:

mvn dependency:tree 

commnad ... but 依存関係ツリーにWicket 6.18.0の記述はありません! Eclipseの「依存関係階層」ビューを使用して再度チェックしたところ、そのインポートのトレースはないことが確認できました。

Eclipseでワークスペース全体で文字列 "6.18.0"を検索しましたが、どこにも見つかりませんでした!

重複したバージョンのライブラリが含まれている原因を調べるにはどうすればよいですか?

+3

は、あなたのポンポンを投稿してくださいことはできますか? – BackSlash

答えて

5

このようにMavenは機能しません。
同じartifactIdとgroupIdを持つが、バージョンが異なる複数の依存関係の解決は、単一の依存関係になります(使用されたバージョンは決定論者ではありません)。

  • あなたがmvn clean packageを実行していない:

    WARの同じlibフォルダ内の同じたartifactIdとのgroupIdが、2つの異なるバージョンの2つのアーティファクトの存在は、おそらく、これらのいずれかに関連していますただし、mvn packageのみです。

  • あなたはMaven warプラグインの盗んだバージョンを使用します。それを確認するために更新しようとしてください。

  • コンポーネントのビルド中にターゲットフォルダのWEB-INF/libフォルダにWicket jars 6.18.0をコピーするMavenプラグインがあります。

  • ビルドしているmaven WARプロジェクトは、WARタイプのアーティファクトとして依存しています。この場合、WAR依存関係の依存関係は、構築しているWARプロジェクトの中ではoverlaidです。なぜならWARの依存関係の


重複JARについての興味深いMavenの問題:

JARs with different versions can be in WEB-INF/lib with war as dependencies


Your answerとあなたのcommentは実際にあなたがあなたのビルドでWAR依存性を持っていることを示しています。
残念ながら、この制限を回避するための効果的で長期的な効果的なソリューションはありません。

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-war-plugin</artifactId> 
    <version>2.4</version> 
    <configuration> 
     <!-- ... --> 
     <packagingExcludes>WEB-INF/lib/wicket-*-6.18.0.jar</packagingExcludes> 
    </configuration> 
</plugin> 

しかし、それは時間を通して、あなたのビルドが少なく堅牢行います使用して、注意してください:

としては、Mavenの戦争プラグインのpackagingExcludesプロパティは、実際の問題に有効な回避策です使用して、私のコメントで述べています。 WAR依存関係のバージョンを更新する日とその新しいバージョンでは、別のバージョンのwicketを再度取得しますが、ビルドされたWARでは2つの異なるバージョンのjarファイルが重複する危険性があります。

overlayの要素を指定してthe overlayというフィーチャーを使用すると、一般にはwar依存関係に適用されるオーバーレイに焦点が当てられているため、maven-war-pluginの要素が一般に優れています。問題を早期に解決します。 その結果、あなたはWARの依存関係から任意の改札JARファイルを除外するように定義できます

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <version>2.4</version> 
    <artifactId>maven-war-plugin</artifactId> 
    <configuration>  
     <overlays> 
      <overlay> 
       <groupId>com.whatever.youlike</groupId> 
       <artifactId>myArtifact</artifactId> 
       <excludes> 
        <exclude>WEB-INF/lib/wicket-*.jar</exclude>     
       </excludes> 
      </overlay> 
     </overlays> 
    </configuration> 
</plugin> 

この方法が優れているが、これはまだ回避策です。
依存関係WARが更新され、実際のビルドで宣言された新しい依存関係(Wicket以外)を異なるバージョンで取得する日は、同じ種類の問題で終了することがあります。

WARアーティファクトへの依存関係を宣言することは、選択肢がないためにのみ行うべきだと思います。
ポムとプロジェクトのリファクタリングが可能なので、2つのWARが依存する共通のJAR依存性を導入し、2つのWARの共通のソースとリソースのみを含むと、実際の処理が簡単になります。

+0

+1、あなたの最初の箇条書きが正しい方向に私を指していたので、詳細については私の答えを見てください。基本的には依存関係でしたが、 "WAR"型の依存関係(オーバーレイと呼ばれていると思います)。これらはbuild tree/depには表示されません。明らかに階層。 –

+0

WARとしてパッケージ化されたアーティファクトにWARタイプの依存関係を含めることは、気づいたことがあるため、強くお勧めします。それは依存関係の解決の一部ではないので、 'dependency:tree'には表示されません。これは、lib/WARに組み込まれたコンポーネントのlib/WAR依存関係に含まれる「未処理」のjarファイルをコピーします。申し訳ありませんが、私は正確な名前を知らない:モンスタートラックのコピーかもしれない? ;) – davidxxx

+1

私は自分の答えを受け入れることを嫌いなので、編集後にあなたの答えを受け入れました:D特定の詳細に興味がある人は、以下の私自身の答えを見てください:https://stackoverflow.com/a/44632079/300741 –

0

他のLIBSには同じLIBSが、異なるバージョンを使用するか、別のバージョンを試してみましたmvn clean

+0

私は各ビルドでクリーニングしていました。問題は別のものでした。詳細については自分の答えを見てください。とにかく提案してくれてありがとう。 –

1

使用clean installをしなかったとの二重の依存性は、おそらく消えてしまいますので。

+0

私はいつもきれいです;)問題は別のものでした。とにかく助けてくれてありがとう。 –

0

コマンドmvn dependency:treeが正しい情報を伝えています。あなたが見ているのは、Eclipse /ビルドの問題です。

プロジェクトのすべてのターゲットとビルド領域をクリアします。必要に応じて、ソース管理から新しいフォルダにチェックインしてください。

また、IntelliJ IDEAでプロジェクトを構築し、正しい依存関係が得られるかどうかを確認することもできます(可能性が高いでしょう)。

2

まあ、私はそれを突き止めながら考え出しました。

私は、プロジェクト内のタイプ「戦争」の依存関係を持っていた:

<dependency> 
    <groupId>com.whatever.youlike</groupId> 
    <artifactId>myArtifact</artifactId> 
    <version>1.0.7-SNAPSHOT</version> 
    <type>war</type> 
</dependency> 

どうやら(私は、ここに私のせいでこのことを認識していなかった)の依存関係のこれらのタイプは、コピーしてクラスパスに自分自身が含まれますすべてのlibsをメインのWAR/libsフォルダにコピーしますが、依存関係ツリー/依存関係の階層には表示されません。

WARプラグインで明示的に除外設定することで解決I:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-war-plugin</artifactId> 
    <version>2.4</version> 
    <configuration> 
     <!-- ... --> 
     <packagingExcludes>WEB-INF/lib/wicket-*-6.18.0.jar</packagingExcludes> 
    </configuration> 
</plugin> 
+1

有効な回避策。 +1しかしそれにはいくつかの制限があります。 WARの依存関係が変更された日には、ビルドされたWARに2つの異なるバージョンのjarが重複する危険性があります。私は、ポームリファクタリングが長期的にはより良い解決策になると思います。 – davidxxx

+0

+1、そうです、それは優雅な解決策ではありません。 2つのプロジェクトを次のリリースで同じバージョンを使用するように調整します。今のところ、このクイックフィックスは仕事をしています。 –

+0

さらなる明確化:含まれているプロジェクトがJARフォームのリポジトリに存在しないので、私はWAR依存性を介してそれを含めます。私はそれから一つのクラスだけが必要です。プロジェクト全体をリファクタリングして、別の共有JARに一つのクラスを抽出するのは大変です。 –

関連する問題