Maison  >  Article  >  Construction multi-module Gradle avec ensemble de sources personnalisé : classes manquantes dans le chemin de classe de compilation des modules dépendants

Construction multi-module Gradle avec ensemble de sources personnalisé : classes manquantes dans le chemin de classe de compilation des modules dépendants

WBOY
WBOYavant
2024-02-11 23:27:081113parcourir

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.

Contenu de la question

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 appsharedspark2spark3spark32spark33spark34spark35.

Question : J'essaie de créer le module shared 模块。所有模块(spark2spark35)都依赖于 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 spark33spark34spark35shared中引入了源集scala213testscala213。这些源集使用与 maintest 源相同的源。 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.gradlefichiers.

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
}

Solution

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer