Maven импортирует определение avro из зависимой банки

У меня есть два проекта maven, которые используют плагин avro-maven для генерации кода. Проблема, с которой я столкнулся, заключается в том, что в одном из этих проектов есть объект avro, который использует ссылку на другой объект avro из второго проекта maven. Хотя я включаю банку, созданную из второго проекта, как зависимость от maven, я не могу найти способ сгенерировать код для второго проекта.

По сути, рассмотрим случай, когда мой второй проект имеет определение avro, подобное приведенному ниже.

{
  "namespace": "my.second.project.avro",
  "name": "listNode",
  "type": "record",
  "fields":[
        {
            "name":"eventList",
            "type":{
                "type": "array",  
                "items": "my.first.project.AvroDefinition.avsc"
            }
         }
    ] 
}

В этом определении он относится к AvroDefinition.avsc, который включен в один из jar-файлов зависимостей, но я не могу найти способ извлечь AvroDefinition.avsc и использовать его для генерации кода во втором проекте. Кстати, avro-maven-plugin был настроен следующим образом:

   <plugin>
        <groupId>org.apache.avro</groupId>
        <artifactId>avro-maven-plugin</artifactId>
        <version>1.9.1</version>
        <executions>
            <execution>
                <phase>generate-sources</phase>
                <goals>
                    <goal>schema</goal>
                    <goal>protocol</goal>
                    <goal>idl-protocol</goal>
                </goals>
                <configuration>
                    <imports>
                        <import>${project.basedir}/src/main/avro/include/</import>
                    </imports>
                    <sourceDirectory>${project.basedir}/src/main/avro/</sourceDirectory>                        
                    <outputDirectory>${project.basedir}/src/main/java/</outputDirectory>
                    <stringType>String</stringType>
                </configuration>
            </execution>
        </executions>
    </plugin>

и ошибка, которую я получаю, следующая:

Execution default of goal org.apache.avro:avro-maven-plugin:1.9.1:schema failed: 
Undefined name: "my.first.project.AvroDefinition.avsc"

В любом случае, я надеялся, что смогу прибегнуть к помощи плагина удаленных ресурсов maven, но я не смог заставить его работать, поэтому мой вопрос: как это возможно? Как я могу импортировать определение avro из зависимой банки для создания моего кода?


person ypanag    schedule 05.12.2019    source источник
comment
Я делал это раньше, но только с помощью AVDL... Файлы Avsc не могут импортировать другие   -  person OneCricketeer    schedule 09.12.2019
comment
Спасибо за информацию, я наконец нашел обходной путь, чтобы сделать это с помощью плагина удаленных ресурсов maven и, следуя этому потоку stackoverflow.com/questions/30669013/   -  person ypanag    schedule 09.12.2019
comment
Прохладно. Не стесняйтесь ответить на свой вопрос ниже с рабочим решением   -  person OneCricketeer    schedule 11.12.2019


Ответы (2)


Наконец-то я нашел решение, скорее обходной путь, используя два плагина maven (maven-resources-plugin) и (maven-remote-resources-plugin).

По сути, первый плагин (maven-resources-plugin) просто использовался для копирования файлов avsc в каталог ресурсов проекта, поэтому, если у вас уже есть файлы в указанном каталоге, вы можете пропустить этот шаг.

Фактическая работа выполняется через (maven-remote-resources-plugin), который должен найти файлы для включения в банку в каталоге src/main/resources (кстати, по какой-то причине я не смог использовать опцию на плагине ) (отсюда шаг выше)

<plugin>
   <artifactId>maven-remote-resources-plugin</artifactId>
   <version>1.6.0</version>
   <executions>
     <execution>
       <goals>
         <goal>bundle</goal>
       </goals>
     </execution>
   </executions>
   <configuration>
     <includes>
        <include>**/*.avsc</include>
     </includes>
   </configuration>
</plugin>

Это гарантирует, что файлы avsc будут включены в банку, а затем во втором проекте/модуле вам нужно выполнить эту цель (см. ниже) из плагина, чтобы извлечь файлы avsc и сгенерировать код.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-remote-resources-plugin</artifactId>
    <version>1.6.0</version>
    <configuration>
      <resourceBundles>
        <resourceBundle>{groupId}:{artifactId}:{version}</resourceBundle>
      </resourceBundles>
    </configuration>
    <executions>
      <execution>
        <phase>generate-sources</phase>
        <goals>
          <goal>process</goal>
        </goals>
      </execution>
    </executions>
</plugin>

Обратите внимание на две вещи: во-первых, чтобы включить jar зависимостей в параметре resourceBundles, а во-вторых, установить фазу выполнения для generate-sources вместо ресурсов generate-resources по умолчанию, иначе он не будет работать, потому что avro-maven-plugin действительно выполняется на generate- sources, и к тому времени он должен иметь файлы avsc.

В качестве последнего примечания вы также должны включить в раздел импорта avro-maven-plugin следующую строку

<import>${project.build.directory}/maven-shared-archive-resources/</import>

который в основном является каталогом, в который файлы avsc будут экспортироваться по умолчанию из плагина maven-remote-resources.

person ypanag    schedule 11.12.2019

Основываясь на принятом ответе, я смог заставить это работать, используя только плагин maven-remote-resources. При включенных журналах отладки Maven я заметил, что пакеты удаленных ресурсов не импортируются, даже если они создаются. Это произошло из-за пустого файла remote-resources.xml в каждом из зависимых JAR-файлов.

Этот другой пост указал мне правильное направление, проблема с плагином удаленного ресурса Maven

мне нужно было добавить

<includes>
    <include>**/*.avsc</include>
</includes>

к конфигурации maven-remote-resource-plugin в каждом из зависимых pom.xml.

В pom.xml основного проекта мне нужно было явно импортировать каждую из удаленных схем, чтобы избежать исключения NullPointerException. Я добавил это в конфигурацию плагина Avro в pom.xml

<imports>
    <import>${project.build.directory}/maven-shared-archive-resources/MyAvroSchema.avsc</import>
</imports>
person Jose Vargas    schedule 05.01.2021