Подтвердить что ты не робот

Разделение всех выходных каталогов в Gradle

Gradle 4.0 вышел вчера, и я обновил свой проект для него.

Теперь я получаю следующее предупреждение:

Gradle теперь использует отдельные выходные каталоги для каждого языка JVM, но эта сборка предполагает наличие одного каталога для всех классов из исходного набора. Это поведение устарело и планируется удалить в Gradle 5.0

Я хотел бы использовать отдельные выходные каталоги для каждого языка. Что мне нужно изменить, чтобы это произошло?


Вещи, которые я пытался:

  • gradle clean последующим gradle build
  • удаление каталога сборки, затем запуск gradle build.
  • удаление каталога Gradle и сборки, затем запуск gradle

Связанная проблема GitHub


Плагины Gradle:

  • Джава
  • затмение
  • идея
  • org.springframework.boot
4b9b3361

Ответ 1

Gradle 4.0 вводит несколько sourceSet каждого языка JVM, чтобы включить удаленное кэширование сборки. С плагином java ваша build/classes/main должна стать build/classes/java/main а build/classes/test должна стать build/classes/java/test и т.д.

Предупреждение, которое вы видите, определено в DefaultSourceSets.java

Поэтому, если какой-либо плагин в вашем проекте или вашем build.gradle вызывает DefaultSourceSetOutput.getClassesDir() (или access classesDir), вы получите это предупреждение.

Решение 1

использование

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

что соответствует:

@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);
}

Обратите внимание, что SourceSetOutput.java помечает getClassesDir() как устаревший.

Поэтому, пока все плагины в вашем проекте не получат поддержку Gradle 4.0, вы должны придерживаться обходного пути и игнорировать предупреждения об устаревании.

Другая проблема - тестовые файлы. Если вы не хотите иметь новый макет (build/classes/main и build/classes/java/test), вам также следует настроить путь тестирования:

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

UPDATE Пользователи IDEA могут заметить, что IDE начинает использовать отдельную out директорию для сборки, если Gradle 4.x обнаружен. Это делает невозможной горячую перезагрузку приложения, если вы запускаете приложение за пределами IDEA. Чтобы исправить это добавить и повторно импортировать:

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
}

Обратите внимание, что IDEA помещает ресурсы в тот же каталог, что и .class чтобы ваш путь к классу Gradle мог быть поврежден. Просто выполните gradle clean для модулей, для которых вы используете встроенные команды сборки IDEA (Ctrl + Shift + F10 и т.д.).

Ответ 2

Это связано с изменением, внесенным в Gradle 4.0: теперь он использует отдельные выходные каталоги, если есть несколько языковых источников.

Чтобы вернуться к старому поведению и избавиться от предупреждения, вставьте его в свой 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")

Ссылка: https://docs.gradle.org/4.0/release-notes.html#multiple-class-directories-for-a-single-source-set

Ответ 3

Мой случай был немного конкретным, потому что каталоги выходных классов использовались для создания записи пути к классам для выполнения в командной строке. Но, возможно, это кому-то поможет.

Я решил объединить все выходные каталоги. Изменение, которое я сделал, было формой

sourceSets.integrationTest.output.classesDir

в

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

Ответ 4

Например, если вы смешиваете Java, структура проекта Kotlin и Groovy должна выглядеть следующим образом:

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

В файле build.gradle необходимо указать плагины, необходимые для определенного языка.

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