2016-12-17 37 views
2

在依賴範圍「test」下的本文檔(https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html)中,它表示測試範圍不是可傳遞的。這是什麼意思?這是什麼意思,工件範圍不是傳遞?

  1. 這是否意味着如果我們在某些pom中包含一個作用域作爲測試的工件,那麼它的相關工件將不會自動下載/包含在classpath中?
  2. 或者這是否意味着如果我們在某些pom中包含工件,那麼其作爲測試範圍的相關工件將不會被下載/包含在classpath中?
  3. 或其他東西。

據我所知,第一個是不正確的,第二個是正確的。有人可以告訴我究竟是什麼意思?

回答

3

需要明確的是,this is the passage of the documentation

測試
此範圍表明,依賴並不需要正常使用的應用程序,並且僅適用於測試編譯和執行階段。這個範圍不是傳遞的。

這兩個句子處理在依賴關係解析期間可能出現的情況:聲明POM中的依賴關係,並考慮在POM中聲明的依賴關係的傳遞依賴關係。

第一部分意味着在您的POM中有一個範圍爲test的依賴項將導致該依賴項僅在測試類路徑中可用。換句話說,它適用於當你已經明確宣佈在POM依賴關係:

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

嘗試使用它在主Java類(src/main/java下)將導致編譯錯誤,並在測試Java類使用它(在src/test/java下)會正常工作。

第二部分適用於在POM中聲明的依賴關係的依賴關係。這意味着在POM中聲明的依賴關係的測試範圍依賴關係將被省略。例如,假設你對一個名爲A的庫具有編譯時依賴性,並且A本身對B具有測試範圍的依賴性;那麼在依賴解析中B將被忽略,並且不會在類路徑上結束。邏輯是,A需要B來運行它的測試,但作爲A的消費者,你不需要B就能夠使用它。無論您聲明的依賴項的範圍如何(無論是compile,runtime還是test),這些測試範圍的依賴關係都將被忽略,這就是爲什麼test範圍被稱爲不可傳遞的原因。

換句話說,這一切都取決於「有些朋友」的含義。當您在POM中聲明測試作用域依賴項時,它將在測試類路徑中可用。它的所有編譯和運行時傳遞依賴關係也將在測試類路徑中可用,因爲compileruntime範圍是可傳遞的,並且將繼承範圍爲test。當POM不是你自己的時候,測試作用域依賴將會被忽略(因此它的依賴關係也將被忽略)。

+0

我沒有得到「pom不是你自己」的一行時,請你詳細說明一下嗎? –

+0

@ user2509521「當pom不是你自己的時候」意味着我在談論其他依賴關係的POM,即傳遞依賴關係。如果我的依賴關係的依賴關係是範圍測試,那麼它們在解析期間被省略。 – Tunaki