UTF-8 в Gradle: отдельно исходники, ресурсы и JVM
Кодировка — договор о том, как байты превращаются в текст. В Gradle одна настройка не меняет одновременно сохранённые исходники, компилятор, фильтрацию ресурсов, чтение файлов приложением и терминал. Сначала найдите этап, на котором текст становится неправильным.
Кодировка Java-исходников
Для проекта с задачами JavaCompile в build.gradle на Groovy используйте параметр именно этих задач:
import org.gradle.api.tasks.compile.JavaCompile
tasks.withType(JavaCompile).configureEach {
options.encoding = 'UTF-8'
}Сами файлы .java должны быть сохранены в UTF-8. Изменение options.encoding указывает компилятору, как их читать; оно не перекодирует файл из Windows-1251. Неверно интерпретированные байты нужно сначала восстановить из правильного источника, а не повторно сохранить уже испорченные символы.
Не путайте пути файлов с кодировкой
Настройка sourceSets.main.java.srcDirs задаёт расположение исходников и не влияет на чтение символов. У Android Gradle Plugin есть собственное свойство compileOptions.encoding для Java-исходников. В Android-проекте с поддерживающей его версией AGP допустима отдельная настройка:
android {
compileOptions {
encoding = 'UTF-8'
}
}Это настройка Java-компиляции Android-плагина, а не универсальная кодировка всех Kotlin-исходников, ресурсов и процессов. Проверяйте DSL своей версии AGP и используемый тип задачи.
Ресурсы и параметры JVM
- Для текстовых ресурсов, которые Gradle фильтрует или разворачивает через expand/filter, проверьте filteringCharset задачи копирования. При обычном копировании байты не нуждаются в перекодировании.
- org.gradle.jvmargs управляет Gradle Daemon. Изменение file.encoding у daemon не заменяет явный charset чтения и записи в вашем приложении.
- Если меняете org.gradle.jvmargs, сохраняйте уже нужные memory/system flags. Не стирайте всю строку одним скопированным параметром.
- При JavaExec или Test параметры отдельного JVM-процесса настраиваются отдельно от daemon.
Проверка на маленьком примере
Сохраните строку «Привет, café» в UTF-8, соберите нужную JavaCompile-задачу и проверьте результат отдельно от терминала, например записью файла с явно заданным UTF-8. Если файл корректен, а консоль показывает мусор, исследуйте кодировку и шрифт терминала. Полная clean-сборка не исправляет неверные исходные байты и не должна быть единственным методом диагностики.