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 .