Обрабатывать общую схему в avro при генерации кода с помощью плагина avro maven
Я использую плагин Avro Maven для генерации Java-кода для файла схемы AVRO. AVSC, у меня есть одна общая схема, которая используется в нескольких местах в качестве отдельной записи, когда я даю разные пространства имен в каждом месте, он может генерировать Java-код, но сгенерированный код находится в разных папках, хотя код для обоих классов одинаков
Есть ли способ генерировать только один класс для общей ссылки, как указано выше Schenario... Вот мой avsc
{
"namespace": "exmaple.avro",
"type": "record",
"name": "TopRecord",
"fields": [{
"name": "id",
"type": "string"
},
{
"name": "amount",
"type": "double"
},
{
"name": "AC",
"type": {
"type": "record",
"name": "AC_SCHEMA",
"fields": [{
"name": "id",
"type": "string"
},
{
"name": "amount",
"type": "double"
},
{
"name": "InnerCommon",
"type": {
"type": "record",
"name": "InnerSchema",
"fields": [{
"name": "id",
"type": "string"
}]
}
}
]
}
}, {
"name": "BC",
"type": {
"type": "record",
"name": "BC_SCHEMA",
"fields": [{
"name": "id",
"type": "string"
},
{
"name": "amount",
"type": "double"
},
{
"name": "InnerCommon",
"type": {
"type": "record",
"name": "InnerSchema",
"fields": [{
"name": "id",
"type": "string"
}]
}
}
]
}
}
]
}
Если я даю разные пространства имен для схемы InnerCommon в обоих помещениях, он может генерировать код, но с классами в 2 папках с одинаковым кодом:(
Здесь работает AVSC с пространством имен
{
"namespace": "exmaple.avro",
"type": "record",
"name": "TopRecord",
"fields": [{
"name": "id",
"type": "string"
},
{
"name": "amount",
"type": "double"
},
{
"name": "AC",
"type": {
"type": "record",
"name": "AC_SCHEMA",
"fields": [{
"name": "id",
"type": "string"
},
{
"name": "amount",
"type": "double"
},
{
"name": "InnerCommon",
"type": {
"type": "record",
"name": "InnerSchema",
"namespace": "inner1",
"fields": [{
"name": "id",
"type": "string"
}]
}
}
]
}
}, {
"name": "BC",
"type": {
"type": "record",
"name": "BC_SCHEMA",
"fields": [{
"name": "id",
"type": "string"
},
{
"name": "amount",
"type": "double"
},
{
"name": "InnerCommon",
"type": {
"type": "record",
"name": "InnerSchema",
"namespace": "inner2",
"fields": [{
"name": "id",
"type": "string"
}]
}
}
]
}
}
]
}
Вот сгенерированная структура папок
Есть ли способ, как я могу поместить все общие сгенерированные вещи в одну папку и иметь одинаковое пространство имен для удаления дублирования?
РЕДАКТИРОВАТЬ 1: Мне нужно зарегистрировать его в реестре схемы и проверить эволюцию, мне было интересно, есть ли способ сказать плагину не переопределять сгенерированный код и поставить только один класс
1 ответ
Вы можете переместить общие определения в их собственные файлы avsc, а затем импортировать общие файлы в спецификации pom.xml для avro-maven-plugin:
<plugins>
<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>${avro.schema.dir}</sourceDirectory>
<imports>
<import>${my.common.dir}/my_common_type_1.avsc</import>
<import>${my.common.dir}/my_common_type_2.avsc</import>
</imports>
</configuration>
</execution>
</executions>
</plugin>