Ответ 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 и т.д.).