Ошибка Gradle с текстом unexpected tokens (use ';' to separate expressions on the same line) появляется при синхронизации проекта или запуске сборки, когда компилятор Kotlin DSL или Groovy встречает в файле build.gradle.kts два выражения подряд без разделителя. Сборка останавливается ещё на этапе парсинга скрипта, поэтому проект не конфигурируется вовсе — ни одна задача не выполняется, пока синтаксис не будет исправлен.
Чаще всего проблема возникает после копирования фрагмента конфигурации из документации или чужого репозитория: пример написан на Groovy, а вставлен в файл на Kotlin DSL, либо наоборот. Ниже разберём, почему возникает эта ошибка, как найти проблемную строку и как исправить типовые случаи.
Что означает сообщение об ошибке
Сообщение unexpected tokens (use ';' to separate expressions on the same line) выдаёт компилятор Kotlin, когда он не может разобрать скрипт сборки. В Kotlin DSL выражения в одной строке должны разделяться точкой с запятой, а если разделителя нет, парсер воспринимает второй фрагмент как «лишние токены» и останавливается.
На практике точка с запятой в Kotlin почти никогда не нужна намеренно: сообщение указывает не на то, что вам следует добавить ;, а на то, что строка написана синтаксически неверно. Компилятор просто предлагает один из формально допустимых способов «склеить» два выражения.
Ошибка относится к фазе парсинга, поэтому номер строки в выводе обычно указывает точно на место проблемы. Однако иногда реальная причина находится строкой выше — например, незакрытая скобка или кавычка смещает весь дальнейший разбор файла.
Сообщение «use ';' to separate expressions» — это симптом синтаксической ошибки в скрипте сборки, а не указание реально ставить точку с запятой.
Наиболее частые причины
Причина почти всегда сводится к смешиванию двух синтаксисов или к опечатке. Стоит проверить следующие типовые сценарии:
- 🔀 Вставка кода Groovy (
implementation 'group:artifact:1.0') в файлbuild.gradle.kts, где требуются скобки и кавычки-строки Kotlin. - 🔀 Обратная ситуация: код Kotlin DSL с вызовами функций вставлен в
build.gradleна Groovy без адаптации. - ✂️ Пропущенная закрывающая скобка, кавычка или фигурная скобка блока выше по файлу.
- ➕ Знак
+при объявлении зависимостей вместо отдельных строк — в Kotlin DSL конструкция видаimplementation(...) + implementation(...)недопустима. - 📝 Присваивание через
=там, где Kotlin DSL ожидает вызов метода, или наоборот.
Отдельный частый случай — настройка buildTypes или compileOptions. Пример из документации для Groovy записывается как minifyEnabled true, а в Kotlin DSL то же свойство задаётся как isMinifyEnabled = true. Буквальное копирование даёт ровно ту ошибку, которую вы видите.
Как найти проблемную строку
Начните с полного текста ошибки в консоли сборки или в окне Build в Android Studio / IntelliJ IDEA. Вывод содержит имя файла и номер строки, например: build.gradle.kts:42:13: unexpected tokens. Перейдите к указанной позиции и внимательно посмотрите на саму строку и пару строк выше.
Если синтаксис на указанной строке выглядит корректно, проверьте баланс скобок и кавычек выше по файлу. Незакрытая строка или блок dependencies { ... } без завершающей } смещают разбор, и компилятор сообщает об ошибке не там, где она реально допущена.
В Android Studio откройте проблемный файл build.gradle.kts — IDE подсвечивает синтаксические ошибки красным ещё до запуска сборки, что позволяет найти место без чтения логов.
Для запуска из терминала полезно запросить более подробный вывод:
./gradlew build --stacktrace
Опция --stacktrace показывает контекст ошибки, а при необходимости можно добавить --info для расширенного лога конфигурации.
Типовые исправления: Groovy против Kotlin DSL
Ключевой шаг — определить, какой DSL использует ваш проект. Файлы с расширением .gradle пишутся на Groovy, файлы .gradle.kts — на Kotlin. Синтаксис объявления одних и тех же настроек в них различается, и смешивать их нельзя.
| Задача | Groovy (build.gradle) | Kotlin DSL (build.gradle.kts) |
|---|---|---|
| Зависимость | implementation 'com.squareup.okhttp3:okhttp:4.12.0' | implementation("com.squareup.okhttp3:okhttp:4.12.0") |
| minify | minifyEnabled true | isMinifyEnabled = true |
| Версия SDK | compileSdk 34 | compileSdk = 34 |
| Исключение модуля | exclude group: 'org.example' | exclude(group = "org.example") |
Обратите внимание на закономерность: в Groovy аргументы часто передаются без скобок, а строки допустимы в одинарных кавычках. В Kotlin DSL вызовы оформляются как функции со скобками, строки — только в двойных кавычках, а свойства задаются через присваивание с is-префиксом для булевых значений.
Пошаговая инструкция по исправлению
Последовательность действий одинакова независимо от того, где именно возникла ошибка. Работайте от простого к сложному.
☑️ Проверка и исправление ошибки unexpected tokens
Сначала закомментируйте подозрительный фрагмент целиком и выполните сборку. Если ошибка исчезла, возвращайте код построчно — так вы локализуете конкретное выражение, которое ломает парсинг. Этот метод особенно эффективен, когда файл большой, а номер строки в выводе указывает неточно.
Затем перепишите найденное выражение в корректном синтаксисе вашего DSL, сверяясь с таблицей выше или с официальной документацией Gradle и Android Gradle Plugin. После правки выполните синхронизацию проекта в IDE и повторную сборку.
⚠️ Внимание: не добавляйте точку с запятой в конец строки «для проверки» — это не устраняет причину, а лишь маскирует неверную структуру выражения, и ошибка может всплыть в другом месте файла.
Ошибка в settings.gradle и других скриптах
Та же проблема возникает в settings.gradle.kts, buildSrc и вынесенных скриптах, подключаемых через apply(from = ...). Типовой сценарий — блок pluginManagement или dependencyResolutionManagement, скопированный из примера на другом DSL.
Ещё один источник — файлы gradle.properties или каталог версий libs.versions.toml не выдают именно эту ошибку, но некорректная ссылка на каталог в скрипте (например, обращение к несуществующему алиасу) иногда сопровождается каскадом синтаксических сообщений. Проверяйте первую ошибку в списке — последующие часто являются её следствием.
Почему после копирования примера из Stack Overflow появляется эта ошибка
Большинство старых ответов и примеров в документации библиотек написаны на Groovy, так как Kotlin DSL стал основным в новых шаблонах проектов сравнительно недавно. Если ваш проект создан с файлами .gradle.kts, любой пример на Groovy нужно транслировать: добавить скобки вокруг аргументов, заменить одинарные кавычки на двойные и превратить пробельные присваивания в вызовы или присваивания через знак равенства.
Профилактика: как не столкнуться с ошибкой снова
Несколько привычек заметно снижают вероятность повторения. Во-первых, при копировании примеров всегда проверяйте, для какого DSL они написаны — в официальной документации Gradle и Android есть переключатель между Groovy и Kotlin, выбирайте вкладку, соответствующую вашему проекту.
Во-вторых, держите подсветку синтаксиса включённой: IntelliJ IDEA и Android Studio подчёркивают ошибки в скриптах сборки до запуска. В-третьих, вносите изменения в скрипты небольшими порциями и синхронизируйте проект после каждой правки — тогда источник проблемы очевиден сразу.
⚠️ Внимание: при миграции проекта с Groovy на Kotlin DSL не переименовывайте файлы массово без переписывания содержимого. Автоматическая конвертация синтаксиса не выполняется, и каждый блок нужно адаптировать вручную, иначе сборка упадёт с десятками подобных ошибок.
Храните рабочую версию build-файлов в системе контроля версий. Если после правки появилась ошибка, git diff мгновенно покажет, какое именно изменение её вызвало.
Часто задаваемые вопросы
Нужно ли действительно ставить точку с запятой, как предлагает сообщение?
Нет. В Kotlin точка с запятой требуется только для двух выражений в одной строке, что в скриптах сборки практически не встречается. Сообщение лишь указывает, что компилятор видит два выражения там, где ожидал одно, — исправлять нужно сам синтаксис строки.
Ошибка указывает на строку, где всё написано правильно. Что делать?
Проверьте строки выше: незакрытая кавычка, скобка или блок сдвигают разбор файла, и реальная ошибка оказывается раньше указанной позиции. Также попробуйте закомментировать фрагмент и собрать проект, чтобы локализовать проблему.
Можно ли смешивать Groovy и Kotlin DSL в одном проекте?
Технически модули проекта могут использовать разные DSL, но внутри одного файла смешивать синтаксисы нельзя. Для единообразия и упрощения поддержки лучше придерживаться одного варианта во всём проекте.
Почему ошибка появилась после обновления Android Studio или плагина?
Новые версии Android Gradle Plugin и шаблонов проектов по умолчанию используют Kotlin DSL и могут менять названия свойств (например, добавление префикса is). После обновления сверьте скрипты с актуальной документацией и исправьте устаревшие конструкции.
Как быстро проверить скрипт без полной сборки?
Достаточно выполнить ./gradlew help — эта задача проходит фазу конфигурации, где и происходит парсинг скриптов, но не запускает компиляцию кода. Синтаксические ошибки проявятся сразу.