java - Dividiendo todos los directorios de salida en Gradle
build.gradle (3)
Gradle 4.0 salió ayer y actualicé mi proyecto para ello.
Ahora estoy recibiendo la siguiente advertencia:
Gradle ahora usa directorios de salida separados para cada lenguaje JVM, pero esta compilación asume un directorio único para todas las clases de un conjunto fuente. Este comportamiento ha quedado en desuso y está programado para eliminarse en Gradle 5.0
Me gustaría usar directorios de salida separados para cada idioma. ¿Qué necesito cambiar para que eso suceda?
Cosas que probé
-
gradle clean
seguido por lagradle build
- borrando el directorio de compilación y ejecutando la
gradle build
. - borrando el directorio de Gradle y Build y ejecutando
gradle
issue relacionado con GitHub
Plugins de Gradle:
- Java
- eclipse
- idea
- org.springframework.boot
Esto se debe al cambio introducido en Gradle 4.0: ahora utiliza directorios de salida separados si hay múltiples fuentes de idioma.
Para volver al comportamiento anterior y deshacerse de la advertencia, inserte esto en su 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")
Referencia: https://docs.gradle.org/4.0/release-notes.html#multiple-class-directories-for-a-single-source-set
Gradle 4.0 introduce el conjunto de fuente múltiple por lenguaje JVM para habilitar la memoria caché de compilación remota. Con el plugin java
su build/classes/main
debería convertirse en build/classes/java/main
y la build/classes/test
debería convertirse en build/classes/java/test
, etc.
Esa advertencia se define en:
@Override
public File getClassesDir() {
if (isLegacyLayout()) {
return fileResolver.resolve(classesDir);
}
SingleMessageLogger.nagUserOfDeprecatedBehaviour("Gradle now uses separate output directories for each JVM language, but this build assumes a single directory for all classes from a source set");
Object firstClassesDir = CollectionUtils.findFirst(classesDirs.getFrom(), Specs.SATISFIES_ALL);
if (firstClassesDir!=null) {
return fileResolver.resolve(firstClassesDir);
}
return null;
}
Entonces, si algún complemento dentro de su proyecto o su build.gradle
llama a build.gradle
DefaultSourceSetOutput.getClassesDir()
, recibe esta advertencia.
La forma oficialmente recomendada para deshacerse de esta advertencia es :
sourceSets.main.output.classesDir = new File(buildDir, "classes/main")
que corresponde a:
@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);
}
Tenga en cuenta que https://docs.gradle.org/current/javadoc/org/gradle/api/tasks/SourceSetOutput.html#getClassesDir() marca getClassesDir()
como obsoleto .
Por lo tanto, hasta que todos los complementos utilizados en el proyecto obtengan soporte para Gradle 4.0, debe seguir la solución e ignorar la desaprobación en el script de compilación del código fuente de Gradle.
Otro problema son los archivos de prueba. Si no te gusta tener un diseño de jerarquía diferente ( build/classes/main
y build/classes/java/test
) también debes ajustar la ruta de la prueba:
sourceSets.main.output.classesDir = new File(buildDir, "classes/main")
sourceSets.test.output.classesDir = new File(buildDir, "classes/test")
ACTUALIZACIÓN Los usuarios de IDEA pueden notar que IDE comienza a usar directorios separados para construirlo. Detectado por Gradle 4.x. Eso hace que sea imposible recargar la aplicación en caliente si ejecuta la aplicación fuera de IDEA. Para arreglar ese complemento y reimportar:
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
}
Tenga en cuenta que IDEA coloca los recursos en el mismo directorio que los archivos .class
para que su ruta de clase Gradle se corrompa. Simplemente haga gradle clean
para los módulos en los que use los comandos de compilación incorporados de IDEA (Ctrl + Shift + F10, etc.).
Por ejemplo, si combina Java, Kotlin y la estructura del proyecto Groovy debería ser como la siguiente:
root/
src/
main/
java/
kotlin/
groovy/
test/
java/
kotlin/
groovy/
En tu build.gradle tienes que especificar los complementos que se requieren para un idioma específico.
apply plugin: ''java''
apply plugin: ''groovy''
apply plugin: ''kotlin''