Решение ошибки Lombok и OpenJDK 16: IllegalAccessError
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Для решения проблемы IllegalAccessError
обновите версию Lombok до той, что совместима с вашей версией JDK:
<!-- Вставьте последнюю доступную версию Lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>ПОСЛЕДНАЯ_ВЕРСИЯ</version> <!-- Откройте мощь Супер Саяджина с версией 1.18.22 или более поздней -->
<scope>provided</scope>
</dependency>
Если проблема все равно не решается, переключите JDK на версию, совместимую с Lombok:
// Указываем путь к JDK, которую поддерживает Lombok, и вперёд! **
export JAVA_HOME=$(path_to_compatible_jdk)
Внимательный подбор версий JDK и Lombok
Соблюдайте совместимость между версией JDK, которую вы используете, и версией Lombok. Например, для JDK 16 требуется Lombok 1.18.22 или новее. Учитывайте ограничения, вводимые модульностью в Java 9 и последующих версиях.
Настройка Maven для работы с JDK 16
Если вы используете Maven и JDK 16, то в настройках maven-compiler-plugin
укажите используемую версию JDK и включите опцию --enable-preview
:
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<release>16</release>
<compilerArgs>
<arg>--enable-preview</arg> <!-- Активируем экспериментальные возможности в JDK 16 -->
</compilerArgs>
</configuration>
</plugin>
Деликатный подход к аннотационным процессорам
Добавьте Lombok в annotationProcessorPaths
, чтобы избежать возможных проблем при компиляции, особенно при использовании новых версий JDK:
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>ПОСЛЕДНЯЯ_ВЕРСИЯ</version> <!-- Дарим Lombok немного поддержки -->
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
«Проницательные» флаги компилятора для обхода модульных ограничений
В некоторых случаях, для обеспечения корректной работы JDK, используйте дополнительные флаги компилятора (--add-opens
), чтобы дать Lombok доступ в обычно ограниченные области:
<compilerArgs>
<arg>--add-opens</arg> <!-- Обеспечиваем доступ...
<arg>java.base/java.lang=ALL-UNNAMED</arg> ... для Lombok! -->
<arg>--enable-preview</arg>
</compilerArgs>
Визуализация
Давайте попробуем упростить эту информацию:
| Событие | Диагноз |
| --------------------------- | -------------------------------------- |
| Действующий пропуск (🎫) | ✅ Доступ открыт. Вход разрешён! |
| Срок пропуска истёк (📜) | ❌ Доступ закрыт. Возврат! |
| Контроль безопасности (👮) | 🚫 Требуется повторная проверка. Подлинность? |
Вот так это выглядит на практике:
LombokProcessor (🎫) с действительным пропуском ➡️ Желает войти в JavacProcessingEnvironment (🎉)
Безопасность (👮) настороже (🚫)
Результат? IllegalAccessError. ⛔ Извините, Lombok, попробуйте с другим пропуском!
Подробнее о настройках кодировки в JDK и опциях компилятора
Если требуется более детальная отладка, выставьте кодировку UTF-8
и активируйте в Maven опции показа устаревшего кода и предупреждений:
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<encoding>UTF-8</encoding> <!-- Потому что UTF-8 — всегда верный выбор 😄 -->
<compilerArgs>
<arg>-XshowDeprecation</arg> <!-- Показываем устаревший код! -->
<arg>-Xlint:all</arg>
</compilerArgs>
</configuration>
</plugin>
Альтернативы Lombok при несовместимости
Если Lombok не совместим с вашей версией Java, придётся искать альтернативы. Рассмотрите возможность самостоятельного использования аннотаций @Getter
, @Setter
или переход на современные инструменты, такие как data-классы в Kotlin или record-типы в Java.
Поиск помощи в интернете
Если вы столкнулись с проблемой несовместимости, найдите новые идеи и рекомендации в интернете путем изучения уроков или блогов о возможностях, предлагаемых Lombok. Объединенные знания — сила!
Полезные материалы
- Документация Javadoc от Oracle
- Обсуждения проблем Lombok на GitHub – возможные решения
- История изменений Lombok – последние обновления и исправления
- Заметки Oracle о com.sun.tools.javac – использование внутреннего API Sun
- Инструменты Gradle для работы с Java, компиляции и тестирования
- Использование плагина Compiler Maven