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.
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 app
、shared
、spark2
、spark3
、spark32
、spark33
、spark34
和spark35
.
Frage:
Ich versuche, das shared
模块。所有模块(spark2
到 spark35
)都依赖于 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 spark33
、spark34
、spark35
和shared
中引入了源集scala213
和testscala213
。这些源集使用与 main
和 test
源相同的源。 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 }
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!