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
相关产品推荐
相关产品推荐

