Сгенерированный Avro класс: Не удается получить доступ к классу «Конструктор». Проверьте свой путь к классу модуля на наличие отсутствующих или конфликтующих зависимостей

#kotlin #avro

Вопрос:

Выполняется

 val myAvroObject = MyAvroObject.newBuilder()  

приводит к ошибке компиляции:

 Cannot access class 'MyAvroObject.Builder'. Check your module classpath for missing or conflicting dependencies  

Я могу получить доступ к другим MyAvroObject переменным. Точнее, такие методы, как

 val schema = MyAvroObject.getClassSchema() val decoder = MyAvroObject.getDecoder()  

отлично компилируется. Что делает это еще более странным, так это то, что я могу получить доступ newBuilder() в своей test/ папке, но не в своей src/ папке.

Почему я получаю ошибку компиляции при использовании newBuilder() ? Имеет ли значение пространство имен avro-схемы, используемое для генерации MyAvroObject ?

Ответ №1:

Check your module classpath обычно это означает, что ваши зависимости (которые вы не предоставили) перепутались. Один из них должен читать implementation вместо testImplementation , чтобы метод был доступен в main исходном наборе, а не только в test исходном наборе, но это вполне может быть связано с входными классами, расположением вывода сгенерированных классов или аннотациями @VisibleForTesting (просто посмотрите, что он даже генерирует). Команда gradlew также может перечислить зависимости для каждой конфигурации. Строитель, кажется, называется org.apache.avro.SchemaBuilder … есть только avro-1.11.0.jar amp; avro-tools-1.11.0.jar . С помощью шаблона проектирования «конструктор» .newBuilder() пытается вернуть внутренний класс Builder .