Heim >Java >Gradle-Multimodul-Build mit benutzerdefiniertem Quellsatz: Klassen fehlen im Kompilierungsklassenpfad abhängiger Module

Gradle-Multimodul-Build mit benutzerdefiniertem Quellsatz: Klassen fehlen im Kompilierungsklassenpfad abhängiger Module

WBOY
WBOYnach vorne
2024-02-11 23:27:081181Durchsuche

Der

php-Editor Xinyi führt Sie in diesem Artikel in die Verwendung der Gradle-Multimodulkonstruktion mit benutzerdefinierten Quellsätzen ein. Während des Erstellungsprozesses stoßen wir häufig auf das Problem fehlender Klassen im kompilierten Klassenpfad abhängiger Module. In diesem Artikel wird die Ursache dieses Problems ausführlich erläutert und Lösungen bereitgestellt, um sicherzustellen, dass alle erforderlichen Klassen im kompilierten Klassenpfad abhängiger Module enthalten sind. Durch die Anleitung dieses Artikels können Sie die benutzerdefinierte Quellsatzfunktion in der Gradle-Mehrmodulkonstruktion besser verstehen und anwenden und die Konstruktionseffizienz und Wartbarkeit des Projekts verbessern.

Frageninhalt

Ich trage derzeit zur Openlineage Spark-Integration bei, einem Projekt vollständig in Java, das mit Gradle (8.4) erstellt wurde. Dies ist ein Projekt mit mehreren Modulen und seine Module heißen appsharedspark2spark3spark32spark33spark34spark35.

Frage: Ich versuche, das shared 模块。所有模块(spark2spark35)都依赖于 shared。我的目标是编译像 spark35 这样的模块来生成两个版本:一个用于 scala 2.12,另一个用于 apache spark 的 scala 2.13 变体。这还需要使用相应的 spark 变体正确构建 shared-Modul für Scala 2.12- und 2.13-Varianten von Apache Spark zu erstellen, um Laufzeitfehler zu vermeiden.

Methode: Ich verwende das Java-Bibliotheks-Plugin in der Abhängigkeit des spark33spark34spark35shared中引入了源集scala213testscala213。这些源集使用与 maintest 源相同的源。 apache spark 的 scala 2.12 变体的依赖项设置为默认值,并且我对 scala 2.13 源集有附加声明。这包括对 shared-Moduls.

Aufgetretene Probleme: Wenn ich die kompilierte Klasse aus dem shared 项目请求 scala213runtimeelements (甚至是 scala213apielements 配置)时,编译类路径不包含 shared-Modul bekomme. Nach dem Zurücksetzen auf die Standardkonfiguration sind diese Klassen jedoch im Klassenpfad vorhanden.

Frage: Warum eine bestimmte Konfiguration angeben (scala213runtimeelements) 会导致 shared 模块的编译类从我的其他模块的编译类路径中丢失?如何解决此问题以确保 shared Modul, deren Klassen im Klassenpfad für die Scala-Versionen 2.12 und 2.13 enthalten sind?

Nachfolgend finden Sie meine verschiedenen build.gradle Dateien.

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
}

Lösung

Okay. Ich habe darüber nachgedacht. Dies ist ein Fall von RTFM.

Im Speziellen dieser Teil des Handbuchs. Ich habe das Artefakt „Varianten“ nicht zum shared-Projekt hinzugefügt. Daher hat Gradle keine Ahnung, was es konsumieren soll. Verwirrenderweise verwendet die Standardkonfiguration Klassen, während die Varianten JARs erfordern.

Das obige ist der detaillierte Inhalt vonGradle-Multimodul-Build mit benutzerdefiniertem Quellsatz: Klassen fehlen im Kompilierungsklassenpfad abhängiger Module. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen