32 votes

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 le message d'avertissement suivant:

Gradle utilise désormais séparé de sortie des répertoires pour chaque JVM de la langue, mais cette construction suppose un répertoire unique pour toutes les classes à partir d'une source ensemble. Ce comportement est obsolète et devrait être supprimé dans Gradle 5.0

Je voudrais utiliser des répertoires en sortie pour chaque langue. Que dois-je modifier pour que cela se produise?


Choses que j'ai essayé:

  • gradle clean suivie par gradle build
  • la suppression du répertoire de construction, puis en exécutant gradle build.
  • la suppression de la gradle et répertoire de construction, puis en exécutant gradle

Liées GitHub problème


Gradle Plugins:

  • java
  • eclipse
  • idée
  • org.springframework.démarrage

15voto

gavenkoa Points 6974

Gradle 4.0 introduit plusieurs sourceSets par la JVM de la langue afin d'activer à distance de construire la mise en cache. Avec l' java plugin 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 n'est défini dans DefaultSourceSets.java

Par conséquent, si un plugin dans votre projet ou votre build.gradle des appels DefaultSourceSetOutput.getClassesDir() (ou accéder classesDir) vous obtenez ce message d'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 marques getClassesDir() comme obsolète.

Donc, jusqu'à ce que tous les plugins dans votre projet d'obtenir un soutien pour Gradle 4.0 vous devez vous en tenir à la solution de contournement et d'ignorer la dépréciation des avertissements.

Un autre problème est fichiers de test. Si vous ne voulez pas avoir la nouvelle mise en page (build/classes/main et build/classes/java/test) vous devez ajuster test de chemin de trop:

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

Mise à JOUR Les utilisateurs de l'IDÉE peut remarquer que l'IDE démarre à l'aide de séparer out annuaires pour construire si Gradle 4.x est détecté. Cela rend impossible à chaud application de rechargement si vous exécutez l'application en dehors de l'IDÉE. Pour corriger que d'ajouter et de les réimporter:

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 l'IDÉE met des ressources dans le répertoire .class fichiers de sorte que votre Gradle classpath peut être corrompu. Il suffit de ne gradle clean pour les modules sur lesquels vous utilisez IDÉE intégré dans l'accumulation de commandes (Ctrl+Maj+F10, etc).

5voto

Dordoka Maisu Points 51

Cela est dû à la modification introduite en Gradle 4.0: il utilise maintenant séparé de sortie des répertoires si il y a de multiples sources en langue.

Pour revenir à l'ancien comportement et de se débarrasser de l'avertissement, insérez ce dernier 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

0voto

Tono Wiedermann Points 377

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 cela aidera peut-être 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)
 

-1voto

Andrii Abramov Points 3881

Par exemple, si vous mélangez la structure de projet Java, Kotlin et Groovy, cela devrait ressembler à ceci:

 root/
    src/
       main/
            java/
            kotlin/
            groovy/
       test/
            java/
            kotlin/
            groovy/
 

Dans you build.gradle, vous devez spécifier les plugins requis pour un langage spécifique.

 apply plugin: 'java'
apply plugin: 'groovy'
apply plugin: 'kotlin'
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X