web-dev-qa-db-fra.com

Fractionnement de tous les répertoires de sortie dans Gradle

Gradle 4.0 est sorti hier et j'ai mis à jour mon projet pour cela.

Maintenant, je reçois l'avertissement suivant:

Gradle utilise désormais des répertoires de sortie distincts pour chaque langage JVM, mais cette version suppose un répertoire unique pour toutes les classes d'un ensemble source. Ce comportement est obsolète et doit être supprimé dans Gradle 5.0

Je voudrais utiliser des répertoires de sortie séparés pour chaque langue. Que dois-je changer pour que cela se produise?


Choses que j'ai essayées:

  • gradle clean suivi par gradle build
  • suppression du répertoire de construction puis exécution de gradle build.
  • suppression du répertoire gradle et build, puis exécution de gradle

GitHub associé problème


Plugins Gradle:

  • Java
  • Éclipse
  • idée
  • org.springframework.boot
30
shammancer

Gradle 4.0 introduit plusieurs sourceSets par langage JVM afin d'activer la mise en cache de génération à distance. Avec le plugin Java, votre build/classes/main Devrait devenir build/classes/Java/main Et build/classes/test Devrait devenir build/classes/Java/test, Etc.

L'avertissement que vous voyez est défini dans DefaultSourceSets.Java

Par conséquent, si un plugin dans votre projet ou votre build.gradle Appelle DefaultSourceSetOutput.getClassesDir() (ou accédez à classesDir), vous obtenez cet avertissement.

Solution 1

Utilisation

sourceSets.main.output.classesDir = new File(buildDir, "classes/main")

ce qui correspond à:

@Override
public boolean isLegacyLayout() {
    return classesDir!=null;
}

@Override
public void setClassesDir(File classesDir) {
    setClassesDir((Object)classesDir);
}

@Override
public void setClassesDir(Object classesDir) {
    this.classesDir = classesDir;
    this.classesDirs.setFrom(classesDir);
}

Notez que SourceSetOutput.Java marque getClassesDir() comme obsolète.

Donc, jusqu'à ce que tous les plugins de votre projet prennent en charge Gradle 4.0, vous devez vous en tenir à la solution de contournement et ignorer les avertissements de dépréciation.

Un autre problème concerne les fichiers de test. Si vous ne voulez pas avoir la nouvelle disposition (build/classes/main Et build/classes/Java/test), Vous devez également ajuster le chemin de test :

sourceSets.main.output.classesDir = new File(buildDir, "classes/main")
sourceSets.test.output.classesDir = new File(buildDir, "classes/test")

[~ # ~] mise à jour [~ # ~] Les utilisateurs de IDEA peuvent remarquer que IDE commence à utiliser des répertoires out distincts pour la construction si Gradle 4.x est détecté. Cela rend impossible le rechargement à chaud de l'application si vous exécutez l'application en dehors d'IDEA. Pour résoudre ce problème, ajoutez et réimportez:

subprojects {
    apply plugin: 'idea'
    // Due to Gradle 4.x changes (separate output directories per JVM language)
    // Idea developers refuse to reuse Gradle classpath and use own 'out/' directory.
    // Revert to old behavior to allow Spring Devtool to work with using fast Idea compiler.
    // https://youtrack.jetbrains.com/issue/IDEA-175172
    // Alternatively use native Gradle builds or bootRun.addResources = true
    // To use this feature Push Ctrl+Shift+F9 to recompile!
    // Be aware that Idea put resources into classes/ directory!!
    idea.module.inheritOutputDirs = false
    idea.module.outputDir = sourceSets.main.output.classesDir
    idea.module.testOutputDir = sourceSets.test.output.classesDir
}

Veuillez noter que IDEA place les ressources dans le même répertoire que les fichiers .class Afin que votre chemin de classe Gradle soit corrompu. Faites simplement gradle clean Pour les modules sur lesquels vous utilisez = IDEA commandes de build intégrées (Ctrl + Shift + F10, etc.).

15
gavenkoa

Cela est dû à la modification introduite dans Gradle 4.0: il utilise désormais des répertoires de sortie distincts s'il existe plusieurs sources de langue.

Pour revenir à l'ancien comportement et se débarrasser de l'avertissement, insérez-le dans votre build.gradle:

// Change the output directory for the main source set back to the old path sourceSets.main.output.classesDir = new File(buildDir, "classes/main")

Référence: https://docs.gradle.org/4.0/release-notes.html#multiple-class-directories-for-a-single-source-set

5
Dordoka Maisu

Mon cas était un peu spécifique car les répertoires des classes de sortie ont été utilisés pour construire une entrée de chemin de classe pour l'exécution en ligne de commande. Mais peut-être que cela aidera quelqu'un.

J'ai décidé de concaténer tous les répertoires de sortie. Le changement que j'ai fait était de forme

sourceSets.integrationTest.output.classesDir

à

ext {
    classpathSeparator = System.properties['os.name'].toLowerCase().contains('windows')?";":":"
}
...
sourceSets.integrationTest.output.classesDirs.join(classpathSeparator)
0
Tono Wiedermann