Ошибка 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")
minifyminifyEnabled trueisMinifyEnabled = true
Версия SDKcompileSdk 34compileSdk = 34
Исключение модуляexclude group: 'org.example'exclude(group = "org.example")

Обратите внимание на закономерность: в Groovy аргументы часто передаются без скобок, а строки допустимы в одинарных кавычках. В Kotlin DSL вызовы оформляются как функции со скобками, строки — только в двойных кавычках, а свойства задаются через присваивание с is-префиксом для булевых значений.

📊 Где именно вы столкнулись с ошибкой unexpected tokens?
В build.gradle.kts (Kotlin DSL)
В build.gradle (Groovy)
В settings.gradle / settings.gradle.kts
В чужом скрипте, скопированном из интернета

Пошаговая инструкция по исправлению

Последовательность действий одинакова независимо от того, где именно возникла ошибка. Работайте от простого к сложному.

☑️ Проверка и исправление ошибки unexpected tokens

Выполнено: 0 / 6

Сначала закомментируйте подозрительный фрагмент целиком и выполните сборку. Если ошибка исчезла, возвращайте код построчно — так вы локализуете конкретное выражение, которое ломает парсинг. Этот метод особенно эффективен, когда файл большой, а номер строки в выводе указывает неточно.

Затем перепишите найденное выражение в корректном синтаксисе вашего 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 — эта задача проходит фазу конфигурации, где и происходит парсинг скриптов, но не запускает компиляцию кода. Синтаксические ошибки проявятся сразу.