IllegalAccessError при объявлении класса для пакета библиотеки - PullRequest
0 голосов
/ 25 марта 2019

В настоящее время я работаю над обслуживанием недокументированного кода и наткнулся на странную ошибку при запуске класса в Spring Boot. Код вызывает IllegalAccessError при выполнении, но компилируется правильно.

Похоже, что исходная команда пыталась получить доступ к закрытым методам Kafka Streams, это "путь MacGyver", но я не уверен в его поведении, поскольку IntelliJ правильно импортирует код и обрабатывает наследование, как и должно (если Я объявляю класс как локальный пакет, который он выделяет, говоря, что классы AbstractStream и KTableImpl не существуют).

Проект управляется с помощью Gradle, и это микро-сервис. Выполнение выполняется с помощью Spring Boot, и при запуске возникает ошибка.

Одним из возможных решений было использование библиотеки отражений Java, но это не кажется правильным подходом к решению этой ошибки. Может быть, установка загрузки не так?

package org.apache.kafka.streams.kstream.internals;

import org.apache.kafka.streams.kstream.KTable;

public class KTableSpy {

  public static <K> String getName(AbstractStream<K> stream) {
    return stream.name;
  }

  public static <K, V> void enableSendingOldValues(KTable<K, V> table) {
    ((KTableImpl<K, ?, V>) table).enableSendingOldValues();
  }
}

Этот класс должен был работать правильно и не мешать запуску службы. Вместо этого мы имеем следующую ошибку

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'AVCompanyStateProjector': Invocation of init method failed; nested exception is java.lang.IllegalAccessError: tried to access method org.apache.kafka.streams.kstream.internals.KTableImpl.enableSendingOldValues()V from class org.apache.kafka.streams.kstream.internals.KTableSpy

1 Ответ

0 голосов
/ 26 марта 2019

Не уверен, что вы пытаетесь выполнить, но AbstractStream и KTableImpl из пакета org.apache.kafka.streams.kstream.internals и не являются частью общедоступного API (как видно из названия).Это подразумевает, что методы (или даже весь класс) могут быть добавлены / удалены без уведомления.

Возможно, видимость с enableSendingOldValues() была изменена с public на частный пакет, нарушающий ваш код.

...