Could not open init generic class cache for initialization script: как исправить ошибку Gradle

Ошибка Could not open init generic class cache for initialization script появляется при запуске сборки Gradle и почти всегда сигнализирует о конфликте между версией Gradle и версией JDK, под которой запускается сборка. Типичный сценарий: проект собирался нормально, затем разработчик обновил Android Studio, перешёл на новую версию Java или открыл старый проект — и сборка падает с этим сообщением ещё на этапе инициализации скриптов.

Текст ошибки обычно дополняется строкой вида Could not initialize class org.codehaus.groovy.vmplugin.v7.Java7 или ссылкой на файл build.gradle / settings.gradle. Это указывает на то, что Groovy-компилятор внутри Gradle не может создать кэш классов для скрипта инициализации из-за несовместимости байт-кода. Ниже разберём причины и безопасные способы устранения проблемы.

Что означает эта ошибка

Gradle написан на Java и использует Groovy для выполнения скриптов сборки. При первом запуске он компилирует скрипты инициализации и сохраняет результат в кэше внутри каталога .gradle. Если версия JVM не поддерживается используемой версией Gradle, создание этого кэша завершается сбоем — отсюда и формулировка «could not open init generic class cache».

Классическая ситуация — старый Gradle (например, линейки 5.x или 6.x), запущенный на новой JDK (17, 21 и новее). Старые версии Groovy не знают о новых версиях байт-кода Java и падают при инициализации. Обратная ситуация тоже возможна, хотя встречается реже.

Основные причины возникновения

Прежде чем что-то менять, полезно понять, какой именно сценарий у вас. Возможные причины:

  • 🔧 Несовместимость Gradle и JDK — самая частая причина: старый Gradle wrapper запускается на новой Java.
  • 📦 Обновление IDE — после апдейта Android Studio или IntelliJ IDEA изменилась JDK, используемая для сборки по умолчанию.
  • 🗂️ Повреждённый кэш Gradle — редкий случай: кэш в ~/.gradle/caches испорчен после прерванной сборки.
  • 🌍 Неверная переменная JAVA_HOME — система указывает на неподходящую или неполную установку Java.
  • ⬇️ Недокачанный дистрибутив Gradle — обрыв загрузки wrapper-дистрибутива при первом запуске.

Определить причину помогает полный стек-трейс: запустите сборку с флагом --stacktrace и посмотрите, какой класс не удалось инициализировать. Упоминание Java7, Groovy или Unsupported class file major version прямо указывает на конфликт версий.

Шаг 1. Проверьте версии Java и Gradle

Первое действие — узнать, какая JDK реально используется при сборке. Выполните в терминале:

java -version

gradle -version

Если проект использует wrapper, версия Gradle задана в файле gradle/wrapper/gradle-wrapper.properties в строке distributionUrl. Сравните эту версию с таблицей совместимости: у каждой версии Gradle есть документированный диапазон поддерживаемых версий Java, который публикуется в официальной документации Gradle.

СитуацияПризнакНаправление решения
Старый проект, новая JDKUnsupported class file major versionОбновить Gradle wrapper
Новая IDE, старый wrapperОшибка после обновления Android StudioСменить Gradle JDK в настройках IDE
Ошибка после прерванной сборкиНе помогает смена версийОчистить кэш Gradle
JAVA_HOME указывает не тудаjava -version показывает не ту версиюИсправить переменную окружения
⚠️ Внимание: не меняйте версию Gradle «наугад». Сначала сверьтесь с официальной матрицей совместимости Gradle и Java — неподдерживаемая комбинация приведёт к той же ошибке или к новым сбоям плагинов.
📊 В какой ситуации вы столкнулись с этой ошибкой?
После обновления Android Studio
После установки новой версии Java
При открытии старого проекта
При первой сборке нового проекта

Шаг 2. Обновите Gradle wrapper

Если проект старый, а JDK новая — самый правильный путь: поднять версию Gradle до той, что поддерживает вашу Java. Для этого отредактируйте gradle-wrapper.properties, указав актуальную версию дистрибутива, либо выполните команду (при наличии рабочего Gradle в системе):

gradle wrapper --gradle-version 8.5

Номер версии подбирайте по официальной документации: для JDK 17 и 21 требуются относительно свежие линейки Gradle. После смены версии wrapper при первом запуске скачает новый дистрибутив — это займёт некоторое время и требует доступа в интернет.

Если проект — Android-приложение, помните о связке Gradle + Android Gradle Plugin (AGP): версия AGP в build.gradle корневого проекта должна поддерживать выбранную версию Gradle. Эту зависимость тоже стоит сверить с официальной таблицей совместимости Android-разработчика.

Шаг 3. Настройте JDK для сборки

Альтернативный путь — не трогать проект, а подобрать под него подходящую Java. В Android Studio и IntelliJ IDEA для этого есть отдельная настройка Gradle JDK: откройте настройки сборки (в актуальных версиях путь примерно такой: Settings → Build, Execution, Deployment → Build Tools → Gradle) и выберите подходящую JDK из списка установленных.

Вам нужно добиться одного из двух: либо версия Gradle поддерживает выбранную JDK, либо наоборот. Если нужной JDK нет в списке, установите её и добавьте через пункт добавления SDK в настройках IDE.

  • ☕ Проверьте, что переменная JAVA_HOME указывает на корректный каталог JDK, а не JRE.
  • 🔄 После смены JDK выполните Sync Project with Gradle Files в IDE.
  • 🧪 Проверьте сборку из терминала командой ./gradlew build, чтобы исключить влияние настроек IDE.

☑️ Диагностика ошибки generic class cache

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

Шаг 4. Очистите кэш Gradle

Когда версии заведомо совместимы, а ошибка остаётся, возможная причина — повреждённый кэш. Удалите каталог caches внутри пользовательской папки Gradle:

# Windows

rmdir /s %USERPROFILE%\.gradle\caches

Linux / macOS

rm -rf ~/.gradle/caches

Также имеет смысл удалить локальную папку .gradle в корне проекта и выполнить сборку заново. Gradle пересоздаст кэш с нуля. Учтите: после очистки первая сборка будет дольше обычного, так как зависимости и дистрибутивы загрузятся повторно.

⚠️ Внимание: перед удалением каталога .gradle закройте IDE и завершите все процессы Gradle — иначе часть файлов будет заблокирована, а очистка пройдёт неполностью.
Почему в тексте ошибки упоминается Groovy и Java7

Gradle использует движок Groovy для компиляции скриптов сборки. Класс org.codehaus.groovy.vmplugin отвечает за адаптацию Groovy к конкретной версии JVM. Если Groovy встречает неизвестную ему версию байт-кода Java, инициализация плагина завершается исключением — и создание кэша классов скрипта обрывается. Поэтому сообщение про кэш — это следствие, а первопричина кроется в связке Groovy/JVM.

Когда ничего не помогает

Если все шаги выполнены, а ошибка сохраняется, проверьте менее очевидные факторы. Антивирус или корпоративный файрвол могут блокировать запись в каталог кэша — временно добавьте папку .gradle в исключения и повторите сборку. Также убедитесь, что в пути к проекту и к домашнему каталогу пользователя нет проблем с правами доступа.

Ещё один сценарий — повреждённый дистрибутив wrapper. Удалите содержимое ~/.gradle/wrapper/dists и запустите сборку повторно: дистрибутив скачается заново. Если сборка выполняется в CI-окружении, проверьте, какая JDK установлена на агенте — она может отличаться от локальной.

Частые вопросы (FAQ)

Ошибка появилась сразу после обновления Android Studio. Что делать?

Обновлённая IDE могла сменить JDK, используемую для Gradle. Откройте настройки Gradle в IDE и выберите совместимую с вашей версией Gradle JDK, либо обновите Gradle wrapper и AGP до версий, поддерживающих новую Java.

Нужно ли переустанавливать Java для исправления ошибки?

Обычно нет. Достаточно установить подходящую версию JDK рядом с существующей и указать её в настройках IDE или через JAVA_HOME. Удалять другие версии Java не обязательно.

Безопасно ли удалять папку .gradle?

Да, это каталог кэша и дистрибутивов. Gradle пересоздаст его при следующей сборке. Единственное последствие — первая сборка после очистки займёт больше времени из-за повторной загрузки зависимостей.

Ошибка возникает только в терминале, а в IDE сборка работает. Почему?

IDE и терминал могут использовать разные JDK. Сравните вывод java -version в терминале с Gradle JDK, выбранной в настройках IDE, и приведите их к одной версии через JAVA_HOME.

Может ли ошибка быть вызвана самим кодом проекта?

Как правило, нет: сбой происходит на этапе инициализации скриптов, до выполнения задач сборки. Причина почти всегда в окружении — версиях Java, Gradle или состоянии кэша. Исключение — синтаксическая ошибка в скрипте инициализации, но тогда текст ошибки обычно другой.