SmartQuery /ВОПРОС → ПРИМЕР → ПОНЯТНЫЙ ОТВЕТ
Системы и инструменты

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-сборка не исправляет неверные исходные байты и не должна быть единственным методом диагностики.

Документация