首页 文章

使用来自不同包的Avro架构

提问于
浏览
1

我们在大型Java项目中使用Avro作为序列化引擎 .

我们使用maven插件从Avro架构中自动生成类(我们只使用avsc,没有IDL) . 一切都很好,直到我们来交叉包装参考 .

该插件可以选择使用import标签导入模式文件,这在包中可以正常工作,但是当我们尝试引用包外的模式时,它不会很好 .

这是插件设置:

<build>
<plugins>
  <plugin>
    <groupId>org.apache.avro</groupId>
    <artifactId>avro-maven-plugin</artifactId>
    <version>1.7.7</version>
    <configuration>
      <stringType>String</stringType>
    </configuration>
      <executions>
        <execution>
          <phase>generate-sources</phase>
          <goals>
            <goal>schema</goal>
          </goals>
          <configuration>
            <sourceDirectory>${project.basedir}/src/main/resources/</sourceDirectory>
            <outputDirectory>${project.basedir}/src/main/java/</outputDirectory>
            <fieldVisibility>PRIVATE</fieldVisibility>
              <imports>
                <import>${project.parent.basedir}/SomeOtherPackagePath/schema1.avsc</import>
                <import>${project.basedir}/src/main/resources/schema2.avsc</import>
              </imports>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
</build>

schema2.avsc 包含一个名为 schema2 的记录,并且已正确导入,并且引用schema2的所有其他模式均有效 .

schema1.avsc 包含一个名为 schema1 的记录,并且位于另一个包中,因此在构建maven时,此包中引用它的模式会失败:

[错误]无法执行目标org.apache.avro:avro-maven-plugin:1.7.7:schema(默认)on project matching-common:目标执行默认值org.apache.avro:avro-maven-plugin:1.7 .7:架构失败:“Schema1”不是已定义的名称 . “schema1”字段的类型必须是已定义的名称或{“type”:...}表达式 .

我们错过了什么吗?

有没有办法从其他包中使用模式?

1 回答

  • 1

    请在sourceDirectories中添加SomeOtherPackagePath,如下所示:

    <sourceDirectories>
     <sourceDirectory>${project.basedir}/src/main/resources/</sourceDirectory>
     <sourceDirectory>${project.parent.basedir}/SomeOtherPackagePath/</sourceDirectory>
    </sourceDirectories>
    

相关问题