Rumah >Java >Binaan berbilang modul Gradle dengan set sumber tersuai: kelas tiada daripada laluan kelas kompilasi modul bergantung

Binaan berbilang modul Gradle dengan set sumber tersuai: kelas tiada daripada laluan kelas kompilasi modul bergantung

WBOY
WBOYke hadapan
2024-02-11 23:27:081179semak imbas

editor php Xinyi akan memperkenalkan anda cara menggunakan pembinaan berbilang modul Gradle dengan set sumber tersuai dalam artikel ini. Semasa proses binaan, kami sering menghadapi masalah kehilangan kelas dalam laluan kelas terkumpul modul bergantung. Artikel ini akan menerangkan punca masalah ini secara terperinci dan menyediakan penyelesaian untuk memastikan semua kelas yang diperlukan disertakan dalam laluan kelas yang disusun bagi modul bergantung. Melalui panduan artikel ini, anda akan dapat memahami dengan lebih baik dan menggunakan fungsi set sumber tersuai dalam pembinaan berbilang modul Gradle, dan meningkatkan kecekapan pembinaan dan kebolehselenggaraan projek.

Kandungan soalan

Saya sedang menyumbang kepada penyepaduan percikan garis terbuka, sebuah projek sepenuhnya dalam java dan dibina dengan gradle (8.4). Ini adalah projek berbilang modul dan modulnya dinamakan appsharedspark2spark3spark32spark33spark34spark35.

Soalan: Saya cuba membina modul shared 模块。所有模块(spark2spark35)都依赖于 shared。我的目标是编译像 spark35 这样的模块来生成两个版本:一个用于 scala 2.12,另一个用于 apache spark 的 scala 2.13 变体。这还需要使用相应的 spark 变体正确构建 shared untuk scala 2.12 dan 2.13 varian apache spark untuk mengelakkan ralat masa jalan.

Kaedah yang diambil: Saya menggunakan pemalam perpustakaan java dalam pergantungan modul spark33spark34spark35shared中引入了源集scala213testscala213。这些源集使用与 maintest 源相同的源。 apache spark 的 scala 2.12 变体的依赖项设置为默认值,并且我对 scala 2.13 源集有附加声明。这包括对 shared.

Masalah yang dihadapi: Apabila saya mendapat kelas yang disusun daripada modul shared 项目请求 scala213runtimeelements (甚至是 scala213apielements 配置)时,编译类路径不包含 shared. Walau bagaimanapun, selepas kembali kepada konfigurasi lalai, kelas ini akan hadir dalam classpath.

Soalan: Mengapa menentukan konfigurasi tertentu (scala213runtimeelements) 会导致 shared 模块的编译类从我的其他模块的编译类路径中丢失?如何解决此问题以确保 shared modul yang kelasnya disertakan dalam laluan kelas untuk versi skala 2.12 dan 2.13?

Di bawah anda akan menemui pelbagai build.gradle fail saya.

share/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
}

Penyelesaian

Baiklah. Saya memikirkannya. Ini adalah kes RTFM.

Secara khusus, bahagian manual ini. Saya tidak menambah artifak "varian" pada projek shared. Oleh itu, Gradle tidak tahu apa yang harus dimakan. Mengelirukan, konfigurasi lalai menggunakan kelas, manakala varian memerlukan JAR.

Atas ialah kandungan terperinci Binaan berbilang modul Gradle dengan set sumber tersuai: kelas tiada daripada laluan kelas kompilasi modul bergantung. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam