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
и testIncludes
configurables также может быть использовано для определения альтернативных расширений файлов по умолчанию, которые **/*.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 .