L'éditeur php Xinyi vous expliquera comment utiliser la construction multi-modules Gradle avec des ensembles de sources personnalisés dans cet article. Pendant le processus de construction, nous rencontrons souvent le problème des classes manquantes dans le chemin de classe compilé des modules dépendants. Cet article expliquera en détail la cause de ce problème et fournira des solutions pour garantir que toutes les classes requises sont incluses dans le chemin de classe compilé des modules dépendants. Grâce aux conseils de cet article, vous serez en mesure de mieux comprendre et d'appliquer la fonction d'ensemble de sources personnalisé dans la construction multimodule Gradle, et d'améliorer l'efficacité de la construction et la maintenabilité du projet.
Je contribue actuellement à l'intégration openlineage spark, un projet entièrement en java et construit avec gradle (8.4). Il s'agit d'un projet multi-modules et ses modules sont nommés app
、shared
、spark2
、spark3
、spark32
、spark33
、spark34
和spark35
.
Question :
J'essaie de créer le module shared
模块。所有模块(spark2
到 spark35
)都依赖于 shared
。我的目标是编译像 spark35
这样的模块来生成两个版本:一个用于 scala 2.12,另一个用于 apache spark 的 scala 2.13 变体。这还需要使用相应的 spark 变体正确构建 shared
pour les variantes scala 2.12 et 2.13 d'Apache Spark afin d'éviter les erreurs d'exécution.
Méthode prise :
J'utilise le plugin de bibliothèque Java dans la dépendance du module spark33
、spark34
、spark35
和shared
中引入了源集scala213
和testscala213
。这些源集使用与 main
和 test
源相同的源。 apache spark 的 scala 2.12 变体的依赖项设置为默认值,并且我对 scala 2.13 源集有附加声明。这包括对 shared
.
Problèmes rencontrés :
Quand je reçois la classe compilée du module shared
项目请求 scala213runtimeelements
(甚至是 scala213apielements
配置)时,编译类路径不包含 shared
. Cependant, après être revenu à la configuration par défaut, ces classes seront présentes dans le chemin de classe.
Question :
Pourquoi spécifier une configuration spécifique (scala213runtimeelements
) 会导致 shared
模块的编译类从我的其他模块的编译类路径中丢失?如何解决此问题以确保 shared
module dont les classes sont incluses dans le classpath pour les versions scala 2.12 et 2.13 ?
Vous trouverez ci-dessous mes différents build.gradle
fichiers.
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 }
D'accord. J'y ai pensé. C'est un cas de RTFM.
Plus précisément, cette partie du manuel. Je n'ai pas ajouté l'artefact "variantes" au projet shared
. Par conséquent, Gradle n’a aucune idée de ce qu’il devrait consommer. Curieusement, la configuration par défaut utilise des classes, tandis que les variantes nécessitent des JAR.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!