簡體   English   中英

在運行集成測試時,sbt不能正確處理多模塊項目中的資源。 為什么?

[英]sbt doesn't correctly deal with resources in multi-module projects when running integration tests. Why?

我在sbt項目上具有以下配置:

  • moduleA包含許多集成測試。
  • moduleB (取決於moduleA )。 包含一個reference.conf文件;
  • moduleC (聚合moduleAmoduleB這是根)。

當我嘗試運行it:test我得到了錯誤,因為測試找不到在reference.conf可用的值。 手動將reference.conf復制到moduleA使其起作用。

問題似乎很明顯是由於某種原因(在根目錄下)運行it:tests時,sbt不夠聰明,無法將reference.conf添加到類路徑中。

誰能推理出為什么會這樣? sbt如何與類路徑和類加載器一起工作? 它將僅將所有內容轉儲到單個類加載器中嗎? 似乎並非如此。

謝謝

為了解決您的問題和評論,讓我分解一下SBT對您的項目所做的事情。

ModuleC項目,它聚合 ModuleAModuleB SBT的上下文中, 聚合意味着在根項目上運行的任何命令也將在聚合的子項目上運行。 因此,例如,如果您在根模塊上運行集成測試,那么您還將為其聚合模塊運行集成測試。 但是,重要的是要了解這並非一次完成 :該命令在每個子項目上單獨運行。

SBT必須解決的下一個問題是子項目的處理順序。 在這種情況下,由於ModuleB 依賴 ModuleA ,因此它必須在處理ModuleA之前先處理ModuleB 否則,如果它們之間沒有依賴關系,則順序將無關緊要, SBT很有可能會ModuleCModuleC的聚合列表中指定的順序。

但是,一個子項目依賴另一個項目意味着什么? 這是類似於一個SBT項目和它的一個關系libraryDependencies :因庫必須提供給子項目,它的資源和類中指定的階段(編譯,測試,運行等提供的類路徑)。

因此,當在ModuleC上運行集成測試時, SBT將首先運行ModuleA的集成測試。 由於ModuleA在項目中沒有其他依賴項,因此將對其進行處理, 而其classpath上沒有任何其他子項目 (這就是為什么它不能訪問ModuleB一部分的reference.conf文件的原因。)如果考慮一下,這是有道理的,因為否則,如果ModuleAModuleB相互依賴,那么您將無法解決- -egg情況,無法建立任何項目。

(順便說一句,如果ModuleA源代碼尚未編譯,則將在運行集成測試之前通過單獨的編譯過程對其進行編譯。)

接下來,它將嘗試處理ModuleB ,將ModuleA的資源和類添加到其類路徑中,因為它依賴於它們。

從您的描述看來, ModuleBreference.conf文件中的至少某些配置設置應該屬於ModuleA ,因為它需要在集成測試期間訪問它們。 這是否意味着整個文件應屬於ModuleA取決於您。 但是,每個子項目都有可能擁有自己的reference.conf文件資源(這是我假設您正在使用的Typesafe Config庫的設計功能)。 屬於ModuleAreference.conf文件的任何配置設置也將可供ModuleB ,因為它取決於ModuleA (如果您有多個reference.conf文件,則唯一的問題取決於打包和釋放ModuleC 。如果將所有子項目中的所有內容打包到一個JAR文件中,則需要合並各種例如,將reference.conf文件放在一起。)

另一種可能性是,某些或所有集成測試實際上應該屬於ModuleC而不是ModuleAModuleB 同樣,做出此決定將取決於您的要求。 如果每個子項目在所有情況下都執行集成測試是有意義的,則將它們放在子項目中。 如果它們僅對整個已完成的項目有意義,則將它們放在ModuleC

您可能需要閱讀SBT多項目構建的文檔,以獲取更多詳細信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM