我正在使用 maven 作為我們的依賴管理器的 mockito-core 依賴版本 3.6.0。我觀察到相同版本的 mockito-core 曾經帶有 'objenesis' jar 的 'compile' 依賴范圍
- org.mockito:mockito-core:jar:3.6.0:test
[INFO] | - net.bytebuddy:byte-buddy:jar:1.10.11:test
[INFO] | - net.bytebuddy:byte-buddy-agent:jar:1.10.11:test
[INFO] | \- org.objenesis:objenesis:jar:3.1:compile
但突然之間,它已將范圍更改為“測驗”以用于“物件”
- org.mockito:mockito-core:jar:3.6.0:test
[INFO] | - net.bytebuddy:byte-buddy:jar:1.10.11:test
[INFO] | - net.bytebuddy:byte-buddy-agent:jar:1.10.11:test
[INFO] | \- org.objenesis:objenesis:jar:3.1:test
這顯然對我們的應用程式中的依賴注入造成了重大問題,因為我們使用 cglib 為 bean 創建代理。
什么可能導致 mockito-core 的相同版本依賴的范圍發生變化?
uj5u.com熱心網友回復:
Mockito-core 在compile范圍內宣告了 objenesis,因為它需要它來編譯。但是,當您將作用域中的 mockito-core 添加test到另一個專案時,所有這些compile作用域依賴項都將變為test作用域。
但是,如果您在范圍內的其他地方有 objenesiscompile并且版本低于 mockito-core,則 objenesis 將回傳到compile范圍,而來自 mockito-core 的版本是更高版本,那就是選定的版本。
找出誰在提供其他物件的一種解決方案是從 mockito-core 中排除物件并檢查它在依賴項中出現的位置:樹。
Objenesis 經常用于compile范圍。以 Spring 為例。您可以在runtime范圍中添加明確的物件依賴關系,以從專案的角度獲得正確的范圍。像您的專案不直接使用的許多其他依賴項一樣。但是保持清潔是很多作業。
通過查看此示例專案,您可以看到這種效果。
uj5u.com熱心網友回復:
目標的輸出dependency:tree可能非常具有誤導性:它輸出的詳細資訊基于 Maven 對已決議依賴項的內部表示,并且只列出每個依賴項一次,即使這些依賴項是通過多個路徑包含的。可以使用更好的可視化,例如在您最喜歡的 IDE 中。
我不確定究竟是什么導致了您的問題,但它可能與 Mockito 的更改無關:如果您對模塊有測驗范圍依賴,那么它的編譯范圍依賴將作為測驗傳遞包含-范圍到你的專案。您的問題中顯示的確切配置在 Maven 中是不可能的(這只是依賴項的誤導性輸出:樹)。很可能其他一些編譯范圍依賴項也對 objenesis 有依賴關系,而其他依賴項已被洗掉或更改,并且不再具有該依賴項。
如果你直接依賴一個依賴,你應該在適當的 POM 中將它宣告為一個依賴,而不是依賴它被一個不相關的依賴傳遞地包含。您應該確保直接需要 objenesis 的任何組件都具有對 objenesis 的編譯(或運行時)范圍依賴。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/419177.html
標籤:
