You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

org.apache.avro:avro-compiler引用Schema生成错误问题求助

解决Avro Schema生成Java类时保留引用而非内嵌的问题

当使用Maven Avro Compiler处理互相引用的Schema时,要让生成的Java类中SCHEMA$保留原始引用形式,而非内嵌依赖Schema,可以通过以下方法实现:

方法1:调整Maven Avro插件的Schema加载顺序

Avro编译器的Schema解析器会在遇到未预先加载的Schema时自动内嵌其定义,因此我们需要确保在解析Schema B之前先加载Schema A。在Maven插件配置中,通过指定includes的顺序来控制Schema的加载优先级:

<plugin>
  <groupId>org.apache.avro</groupId>
  <artifactId>avro-maven-plugin</artifactId>
  <version>你的Avro版本</version>
  <executions>
    <execution>
      <phase>generate-sources</phase>
      <goals>
        <goal>schema</goal>
      </goals>
      <configuration>
        <sourceDirectory>${project.basedir}/src/main/avro</sourceDirectory>
        <outputDirectory>${project.build.directory}/generated-sources/avro</outputDirectory>
        <!-- 先加载Schema A,再加载Schema B -->
        <includes>
          <include>io/test/A.avsc</include>
          <include>io/test/B.avsc</include>
        </includes>
      </configuration>
    </execution>
  </executions>
</plugin>

方法2:使用Schema文件的import语句(可选)

如果你的Schema文件分开存放,可以在Schema B中显式导入Schema A:

在B.avsc顶部添加:

{"import": "io/test/A.avsc"}

配合Maven插件的正确配置,解析器会优先加载被导入的Schema,同样能实现保留引用的效果。

验证效果

配置完成后重新执行mvn generate-sources,生成的B类SCHEMA$会保留对A的引用,而非内嵌完整结构:

public static final org.apache.avro.Schema SCHEMA$ = new org.apache.avro.Schema.Parser().parse("{\"type\":\"record\",\"name\":\"B\",\"namespace\":\"io.test\",\"fields\":[{\"name\":\"a1\",\"type\":[\"null\",\"A\"],\"doc\":\"ref 1\"},{\"name\":\"a2\",\"type\":[\"null\",\"A\"],\"doc\":\"ref 2\"}]}");

内容的提问来源于stack exchange,提问作者klemen kobau

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 11:47:16