首頁  >  文章  >  使用自訂來源集的 Gradle 多模組建置:依賴模組的編譯類別路徑中缺少類

使用自訂來源集的 Gradle 多模組建置:依賴模組的編譯類別路徑中缺少類

WBOY
WBOY轉載
2024-02-11 23:27:081113瀏覽

php小編新一在這篇文章中將為大家介紹如何使用自訂來源集的Gradle多模組建置。在建置過程中,我們經常會遇到依賴模組的編譯類別路徑中缺少類別的問題。本文將詳細解釋這個問題的原因,並提供解決方案,以確保依賴模組的編譯類別路徑中包含所有需要的類別。透過本文的指導,你將能夠更好地理解並應用Gradle多模組建置中的自訂源集功能,提高專案的建置效率和可維護性。

問題內容

我目前正在為 openlineage spark 整合做出貢獻,這是一個完全使用 java 並使用 gradle (8.4) 建立的專案。這是一個多模組項目,其模組名稱為appsharedspark2spark3spark32spark33spark34spark35

問題: 我正在嘗試為 apache spark 的 scala 2.12 和 2.13 變體建立 shared 模組。所有模組(spark2spark35)都依賴 shared。我的目標是編譯像 spark35 這樣的模組來產生兩個版本:一個用於 scala 2.12,另一個用於 apache spark 的 scala 2.13 變體。這也需要使用相應的 spark 變體正確建構 shared 模組,以避免執行時錯誤。

採取的方法: 我使用java庫插件在spark33spark34spark35shared中引入了來源集scala213testscala213。這些來源集使用與 maintest 來源相同的來源。 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中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除