2016-12-17 6 views
2

このドキュメント(https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html)では、依存関係の範囲 "test"の下で、テストスコープは推移的ではないと言います。どういう意味ですか?アーティファクトスコープが推移的でないことは何を意味しますか?

  1. それは我々はいくつかのポンポンでテストとしてスコープを持つアーティファクトが含まれている場合、その依存アーティファクトが自動的にクラスパスに含める/ダウンロードされることはありませんということですか?
  2. これは、いくつかのpomに成果物を含めると、テストとしてのスコープを持つ依存する成果物がクラスパスにダウンロード/含まれないことを意味しますか?
  3. または他の何か。

私が知っている限り、最初のものは真ではなく、2番目のものは正しいものです。誰かが正確にそれが何を意味するのか教えてもらえますか?

答えて

3

明確にすることが、this is the passage of the documentation

テスト
このスコープは、依存関係は、アプリケーションの通常の使用のために必要とされていないことを示し、およびテストのコンパイルと実行の段階でのみ使用可能です。この範囲は推移的ではありません。 POMで依存関係を宣言し、POMで宣言された依存関係の推移的依存関係を考慮:

これら2つの文は、依存関係の解決中に上昇することができますケースを扱います。

最初の部分は、POMにスコープtestの依存関係を設定すると、その依存関係がテストクラスパスでのみ使用可能になることを意味します。 (src/main/java下)メインJavaクラスでそれを使用しようと

<dependency> 
    <!-- GAV coordinates --> 
    <scope>test</scope> 
</dependency> 

は、コンパイルエラーになり、テストJavaクラスでそれを使用して:あなたは明示的にPOMで依存性を宣言したとき、別の言い方をすれば、それが適用されます(src/test/javaより)正常に動作します。

2番目の部分は、POMで宣言されている依存関係の依存関係に適用されます。つまり、POMで宣言された依存関係のテストスコープ依存性は省略されます。たとえば、Aと呼ばれるライブラリにコンパイル時の依存関係があり、A自体がBにテストスコープの依存関係を持っているとします。依存関係の解決ではBは無視され、クラスパスには終わりません。論理は、テストを実行するにはAがBを必要としますが、AのコンシューマーはBを使用する必要がないということです。これらのテストスコープの依存関係は、宣言された依存関係の範囲(compileruntime、またはtest)でも常に省略されます。そのため、testスコープは非推移的と呼ばれます。

他の言い方をすれば、それはすべて「some pom」の意味に依存します。 POMにテストスコープの依存関係を宣言するときは、テストクラスパス上で利用可能になります。 compileruntimeのスコープは推移的であり、testのスコープで継承されるため、そのコンパイルと実行時の推移依存はすべてテストクラスパスでも利用可能になります。 POMが独自のものでない場合、テストスコープの依存関係は常に省略されます(したがって、その依存関係も省略されます)。

+0

私は "ポンは自分のものではない"という行を得られなかったのですが、それを詳しく教えてください。 –

+0

@ user2509521「pomが自分のものでないとき」とは、私が他の依存関係のPOM、つまり推移的な依存関係について話していることを意味します。私の依存関係の依存関係がスコープテストのものであれば、解決の際に省略されます。 – Tunaki

関連する問題