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