Решение ошибки Lombok и OpenJDK 16: IllegalAccessError

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для решения проблемы IllegalAccessError обновите версию Lombok до той, что совместима с вашей версией JDK:

xml
Скопировать код
<!-- Вставьте последнюю доступную версию Lombok -->
<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <version>ПОСЛЕДНАЯ_ВЕРСИЯ</version> <!-- Откройте мощь Супер Саяджина с версией 1.18.22 или более поздней -->
  <scope>provided</scope>
</dependency>

Если проблема все равно не решается, переключите JDK на версию, совместимую с Lombok:

shell
Скопировать код
// Указываем путь к JDK, которую поддерживает Lombok, и вперёд! **
export JAVA_HOME=$(path_to_compatible_jdk)
Кинга Идем в IT: пошаговый план для смены профессии

Внимательный подбор версий JDK и Lombok

Соблюдайте совместимость между версией JDK, которую вы используете, и версией Lombok. Например, для JDK 16 требуется Lombok 1.18.22 или новее. Учитывайте ограничения, вводимые модульностью в Java 9 и последующих версиях.

Настройка Maven для работы с JDK 16

Если вы используете Maven и JDK 16, то в настройках maven-compiler-plugin укажите используемую версию JDK и включите опцию --enable-preview:

xml
Скопировать код
<plugin>
  <artifactId>maven-compiler-plugin</artifactId>
  <configuration>
    <release>16</release>
    <compilerArgs>
      <arg>--enable-preview</arg> <!-- Активируем экспериментальные возможности в JDK 16 -->
    </compilerArgs>
  </configuration>
</plugin>

Деликатный подход к аннотационным процессорам

Добавьте Lombok в annotationProcessorPaths, чтобы избежать возможных проблем при компиляции, особенно при использовании новых версий JDK:

xml
Скопировать код
<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 доступ в обычно ограниченные области:

xml
Скопировать код
<compilerArgs>
  <arg>--add-opens</arg> <!-- Обеспечиваем доступ...
  <arg>java.base/java.lang=ALL-UNNAMED</arg> ... для Lombok! -->
  <arg>--enable-preview</arg>
</compilerArgs>

Визуализация

Давайте попробуем упростить эту информацию:

Markdown
Скопировать код
| Событие                     | Диагноз                                |
| --------------------------- | --------------------------------------  |
| Действующий пропуск (🎫)     | ✅ Доступ открыт. Вход разрешён! |
| Срок пропуска истёк (📜)     | ❌ Доступ закрыт. Возврат! |
| Контроль безопасности (👮)   | 🚫 Требуется повторная проверка. Подлинность? |

Вот так это выглядит на практике:

Markdown
Скопировать код
LombokProcessor (🎫) с действительным пропуском ➡️ Желает войти в JavacProcessingEnvironment (🎉)
Безопасность (👮) настороже (🚫)
Результат? IllegalAccessError. ⛔ Извините, Lombok, попробуйте с другим пропуском!

Подробнее о настройках кодировки в JDK и опциях компилятора

Если требуется более детальная отладка, выставьте кодировку UTF-8 и активируйте в Maven опции показа устаревшего кода и предупреждений:

xml
Скопировать код
<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. Объединенные знания — сила!

Полезные материалы

  1. Документация Javadoc от Oracle
  2. Обсуждения проблем Lombok на GitHub – возможные решения
  3. История изменений Lombok – последние обновления и исправления
  4. Заметки Oracle о com.sun.tools.javac – использование внутреннего API Sun
  5. Инструменты Gradle для работы с Java, компиляции и тестирования
  6. Использование плагина Compiler Maven