php小編新一在這篇文章中將為大家介紹如何使用自訂來源集的Gradle多模組建置。在建置過程中,我們經常會遇到依賴模組的編譯類別路徑中缺少類別的問題。本文將詳細解釋這個問題的原因,並提供解決方案,以確保依賴模組的編譯類別路徑中包含所有需要的類別。透過本文的指導,你將能夠更好地理解並應用Gradle多模組建置中的自訂源集功能,提高專案的建置效率和可維護性。
我目前正在為 openlineage spark 整合做出貢獻,這是一個完全使用 java 並使用 gradle (8.4) 建立的專案。這是一個多模組項目,其模組名稱為app
、shared
、spark2
、spark3
、spark32
、spark33
、spark34
和spark35
。
問題:
我正在嘗試為 apache spark 的 scala 2.12 和 2.13 變體建立 shared
模組。所有模組(spark2
到 spark35
)都依賴 shared
。我的目標是編譯像 spark35
這樣的模組來產生兩個版本:一個用於 scala 2.12,另一個用於 apache spark 的 scala 2.13 變體。這也需要使用相應的 spark 變體正確建構 shared
模組,以避免執行時錯誤。
採取的方法:
我使用java庫插件在spark33
、spark34
、spark35
和shared
中引入了來源集scala213
和testscala213
。這些來源集使用與 main
和 test
來源相同的來源。 apache spark 的 scala 2.12 變體的依賴項設定為預設值,並且我對 scala 2.13 來源集有附加聲明。這包括對 shared
模組的依賴。
遇到的問題:
當我從shared
專案請求scala213runtimeelements
(甚至是scala213apielements
配置)時,編譯類別路徑不包含shared
模組中的已編譯類。但是,恢復到預設配置後,這些類別將出現在類別路徑中。
問題:
為什麼指定特定配置 (scala213runtimeelements
) 會導致 shared
模組的編譯類別從我的其他模組的編譯類別路徑中遺失?如何解決此問題以確保 shared
模組的類別包含在 scala 2.12 和 2.13 版本的類別路徑中?
下面您將找到我的各種 build.gradle
檔案。
共享/build.gradle
sourcesets { scala213 { java.srcdir("src/main/java") resources.srcdir("src/main/resources") } testscala213 { compileclasspath += sourcesets.scala213.output runtimeclasspath += sourcesets.scala213.output java.srcdir("src/test/java") resources.srcdir("src/test/resources") } } configurations { scala213api scala213apielements { extendsfrom(scala213api) canberesolved = false canbeconsumed = true } scala213implementation.extendsfrom(scala213api) scala213runtimeelements { extendsfrom(scala213implementation, scala213runtimeonly) canberesolved = false canbeconsumed = true } scala213compileclasspath { extendsfrom(scala213compileonly, scala213implementation) canberesolved = true } scala213runtimeclasspath { extendsfrom(scala213implementation, scala213runtimeonly) canberesolved = true } testscala213implementation.extendsfrom(scala213implementation) testscala213runtimeonly.extendsfrom(scala213runtimeonly) testscala213compileclasspath { extendsfrom(testscala213compileonly, testscala213implementation) canberesolved = true } testscala213runtimeclasspath { extendsfrom(testscala213implementation, testscala213runtimeonly) canberesolved = true } }
spark33/build.gradle:
#sourceSets { scala213 { java.srcDir("src/main/java") resources.srcDir("src/main/resources") } testScala213 { compileClasspath += sourceSets.scala213.output runtimeClasspath += sourceSets.scala213.output java.srcDir("src/test/java") resources.srcDir("src/test/resources") } } dependencies { implementation(project(path: ":shared")) // others removed for brevity scala213Implementation(project(path: ":shared", configuration: "scala213RuntimeElements")) // others removed for brevity }
好的。我想到了。這是 RTFM 的案例。
具體來說,這部分手冊。我沒有將「變體」工件新增到 shared
專案中。因此,Gradle 不知道它應該消耗什麼。令人困惑的是,預設配置使用類,而變體則需要 JAR。
以上是使用自訂來源集的 Gradle 多模組建置:依賴模組的編譯類別路徑中缺少類的詳細內容。更多資訊請關注PHP中文網其他相關文章!