Статьи

Использование Avro для генерации кода из Maven

Avro имеет возможность генерировать код Java из файлов схемы Avro, IDL и протоколов. Avro также имеет плагин, который позволяет генерировать эти источники Java непосредственно из Maven, что является хорошей идеей, поскольку позволяет избежать проблем, которые могут возникнуть, если ваши файлы схемы / протокола отклоняются от проверенного кода, генерирующего эквиваленты.

Сегодня я создал простой проект GitHub под названием avro-maven, потому что мне пришлось немного поиграть, чтобы Avro и Maven играли хорошо. Проект GitHub является автономным, а также имеет README, в котором рассматриваются основы. В этом посте я расскажу, как использовать Maven для генерации кода для файлов схемы, IDL и протоколов.

Обновления pom.xml для поддержки плагина Avro

Файлы схемы Avro определяют только типы, а типы моделей файлов IDL и протоколов, а также семантику RPC, например сообщения. Единственное различие между IDL и файлами протоколов состоит в том, что IDL-файлы являются DSL Avro для указания RPC, в отличие от файлов протоколов в JSON-форме.

Каждый тип файла имеет запись, которую можно использовать в goalsэлементе, как показано ниже. Все три могут быть использованы вместе, или если у вас есть только файлы схемы вы можете безопасно удалить protocolи idl-protocolзаписи (и наоборот).

<plugin>
  <groupId>org.apache.avro</groupId>
  <artifactId>avro-maven-plugin</artifactId>
  <version>${avro.version}</version>
  <executions>
    <execution>
      <phase>generate-sources</phase>
      <goals>
        <goal>schema</goal>
        <goal>protocol</goal>
        <goal>idl-protocol</goal>
      </goals>
    </execution>
  </executions>
</plugin>

...

<dependencies>
  <dependency>
    <groupId>org.apache.avro</groupId>
    <artifactId>avro</artifactId>
    <version>${avro.version}</version>
  </dependency>
  <dependency>
    <groupId>org.apache.avro</groupId>
    <artifactId>avro-maven-plugin</artifactId>
    <version>${avro.version}</version>
  </dependency>
  <dependency>
    <groupId>org.apache.avro</groupId>
    <artifactId>avro-compiler</artifactId>
    <version>${avro.version}</version>
  </dependency>
  <dependency>
    <groupId>org.apache.avro</groupId>
    <artifactId>avro-ipc</artifactId>
    <version>${avro.version}</version>
  </dependency>
</dependencies>

По умолчанию плагин предполагает, что ваши источники Avro находятся в том месте ${basedir}/src/main/avro, и вы хотите, чтобы ваши сгенерированные источники были записаны в том месте ${project.build.directory}/generated-sources/avro, где ${project.build.directory}обычно находится targetкаталог. Продолжайте читать, если вы хотите изменить какие-либо из этих настроек.

Авро конфигурируемый

К счастью, плагин Avro Maven предлагает возможность настраивать различные параметры генерации кода. В следующей таблице приведены настраиваемые параметры, которые можно использовать для любого из генераторов схемы, IDL и кода протокола.

конфигурируемый Значение по умолчанию Описание
Исходный_каталог $ {Имя_базовой_папки} / SRC / Основной / Avro Исходный каталог Avro для файлов схемы, протокола и IDL.
выходной каталог $ {Project.build.directory} / сгенерированные-источники / Avro Каталог, в котором Avro записывает исходные коды.
testSourceDirectory $ {Имя_базовой_папки} / SRC / тест / Avro Входной каталог, содержащий любые файлы Avro, используемые в тестировании.
testOutputDirectory $ {Project.build.directory} / сгенерированные-тест-источники / Avro Выходной каталог, в который Avro записывает сгенерированные кодом файлы для тестирования.
fieldVisibility PUBLIC_DEPRECATED Определяет доступность полей (например, являются ли они открытыми или закрытыми). Должно быть одним из следующих: PUBLIC, PUBLIC_DEPRECATED или PRIVATE. PUBLIC_DEPRECATED просто добавляет устаревшую аннотацию к каждому полю, например, «@Deprecated public long time».

Кроме того, includesи testIncludesconfigurables также может быть использовано для определения альтернативных расширений файлов по умолчанию, которые **/*.avsc, **/*.avprи **/*.avdlдля схемы, протокола и IDL файлов соответственно.

Давайте рассмотрим пример того, как мы можем указать все эти параметры для компиляции схемы.

<plugin>
  <groupId>org.apache.avro</groupId>
  <artifactId>avro-maven-plugin</artifactId>
  <version>${avro.version}</version>
  <executions>
    <execution>
      <phase>generate-sources</phase>
      <goals>
        <goal>schema</goal>
      </goals>
      <configuration>
        <sourceDirectory>${project.basedir}/src/main/myavro/</sourceDirectory>
        <outputDirectory>${project.basedir}/src/main/java/</outputDirectory>
        <testSourceDirectory>${project.basedir}/src/main/myavro/</testSourceDirectory>
        <testOutputDirectory>${project.basedir}/src/test/java/</testOutputDirectory>
        <fieldVisibility>PRIVATE</fieldVisibility>
        <includes>
          <include>**/*.avro</include>
        </includes>
        <testIncludes>
          <testInclude>**/*.test</testInclude>
      </testIncludes>
      </configuration>
    </execution>
  </executions>
</plugin>

Напоминаем, что все, что описано в этой статье блога, можно увидеть в действии в репозитории GitHub по адресу https://github.com/alexholmes/avro-maven .