web-dev-qa-db-fra.com

Gradle exclut des fichiers spécifiques à l'intérieur de la dépendance

Je me demandais s'il y avait de toute façon à exclure le téléchargement de fichiers spécifiques, qui sont à l'intérieur d'une dépendance (pas une dépendance transitive).

Je change une version de Ant + Ivy en Gradle et cela a déjà été fait avec Ivy. Je demande parce que j'ai une seule dépendance qui contient de nombreux fichiers wsdl compilés dans Artifactory que nous tirons vers le bas, mais je ne veux pas télécharger tous les fichiers dans la dépendance.

Dans Ivy, il a été configuré comme:

Ces 6 artefacts sont publiés sur Artifactory dans un répertoire repo/dep.location/example/7.3/jar.

<publications>
    <artifact name="foo-1-0" type="jar" />
    <artifact name="foo-1-0-async" type="jar" />
    <artifact name="foo-1-0-xml" type="jar" />
    <artifact name="bar-1-0" type="jar" />
    <artifact name="bar-1-0-async" type="jar" />
    <artifact name="bar-1-0-xml" type="jar" />
</publications>

C'est ainsi que je récupère seulement deux des six artefacts.

<dependency org="dep.location" name="example" rev="7.3"
            conf="compile,runtime">
    <include name="foo-1-0-async"/>
    <include name="foo-1-0-xml"/>
</dependency>

Actuellement, si j'essaie de faire quelque chose de similaire dans Gradle, les exclusions sont ignorées et les six artefacts sont téléchargés.

compile (group:"dep.location", name:"example", version:"7.3")
{
    exclude module:'foo-1-0-xml'
    exclude module:'bar-1-0'
    exclude module:'bar-1-0-async'
    exclude module:'bar-1-0-xml'
}

J'utilise Gradle version 1.8.

43
bhumphrey

Je ne pense pas que Gradle ait un support intégré pour accomplir cela, mais vous pouvez nettoyer les artefacts du chemin de classe vous-même.

Inspiré par ce fil sur les forums Gradle, j'ai trouvé ceci:

// The artifacts we don't want, dependency as key and artifacts as values
def unwantedArtifacts = [
    "dep.location:example": [ "foo-1-0-xml", "bar-1-0", "bar-1-0-async", "bar-1-0-xml"],
]

// Collect the files that should be excluded from the classpath
def excludedFiles = configurations.compile.resolvedConfiguration.resolvedArtifacts.findAll {
    def moduleId = it.moduleVersion.id
    def moduleString = "${moduleId.group}:${moduleId.name}:${moduleId.version}" // Construct the dependecy string
    // Get the artifacts (if any) we should remove from this dependency and check if this artifact is in there
    it.name in (unwantedArtifacts.find { key, value -> moduleString.startsWith key }?.value)
}*.file

// Remove the files from the classpath
sourceSets {
    main {
        compileClasspath -= files(excludedFiles)
    }
    test {
        compileClasspath -= files(excludedFiles)
    }
}

Notez que Gradle téléchargera probablement les fichiers et les mettra en cache pour vous, mais ils ne devraient pas être dans votre chemin de classe.

4
Raniz

Je ne sais pas si c'est ce que vous voulez, mais puisque nous utilisons Spring Boot et Wildfly, nous devons supprimer le module Tomcat-starter du package standard Spring Boot, et cela ressemble beaucoup à ce que vous avez fait. Cependant, notre code stipule:

configurations {
    compile.exclude module: "spring-boot-starter-Tomcat"
}

Je n'ai pas vérifié si le pot correspondant n'est pas téléchargé ou tout simplement pas sur le chemin de classe, je sais cependant qu'il n'est plus utilisé.

1