13

コモンズに依存するプロジェクトがあります-httpclient[2.0](コンパイル)。

いくつかのjbehaveテストを書きたいです-jbehave-core3.4.5(テスト)。この依存関係は両方ともcommons-langに依存しますが、バージョンは異なります-1.0.1と2.5。

依存

mvnパッケージを実行すると、テストセクションに[BUIDFAILURE]が表示されます。surefire-plugin出力のテストケースには例外があります。

java.lang.NoSuchMethodError: org.apache.commons.lang.StringUtils.substringBeforeLast(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;

ソースコード(commons-lang 1.0.1)を調べたところ、実際、StringUtils.substringBeforeLast(...)メソッドはありません。なぜmavenはテストでjbehave-coreからではなくcommons-httpclient(コンパイル)からcommons-langを使用するのですか?

commons-httpclientでこの競合する依存関係を除外する余裕はないので、コンパイル時にとどまる必要があります。

では、これをどのように解決できますか?--commons-テストではlang2.5バージョン、コンパイル時は1.0.1。

4

3 に答える 3

9

Maven 3:

Maven 3は、最も近い依存関係の取得を試み、コンパイルフェーズまたはテストスコープの依存関係の1つだけがコンパイルフェーズとテストフェーズの両方で使用されるようにします。

(Vineet Reynoldsに感謝します)

Maven 2(OLD):

<dependency>バージョンとスコープが異なる2つの異なるタグを定義してみてください。<scope>test</scope>テストと<scope>compile</scope>コンパイルには、依存関係内のタグを使用します。

于 2011-07-04T20:34:23.083 に答える
1

Maven 3では、groupIdの後にドットを追加することでMavenをだますことができます

<dependency>
  <groupId>groupId.</groupId>
  <artifactId>artifactId</artifactId>
  <version>version1</version>
  <scope>test</scope>
</dependency>

<dependency>
  <groupId>groupId</groupId>
  <artifactId>artifactId</artifactId>
  <version>version2</version>
  <scope>compile</scope>
</dependency>

ここでは順序が重要です。最初にテストしてからコンパイルする必要があります。

于 2021-05-28T17:33:30.670 に答える
-4

コンパイルとテストの依存関係に2つの異なるバージョンを用意するのは本当に悪い考えです。

非テストコードは、新しいJARの動作に依存し、古​​いJARのクラスを使用すると失敗する可能性があります。テストで古いJARを使用すると、テスト以外のコードは古いJARで失敗します。

そうでなければ、同じバージョンの古いJARをどこでも使用できたはずです...両方のJARバージョンをクラスパスに入れると、テストの実行時にどちらがピックアップされるかわかりません。それも悪い考えです。

したがって、非テストを取得して、同じJARバージョンの依存関係をテストする必要があります。

于 2018-06-08T06:33:12.620 に答える