Обрабатывать общую схему в 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>
Другие вопросы по тегам