我们在大型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:schema failed:“Schema1”不是已定义的名称。 “schema1”字段的类型必须是已定义的名称或{“type”:...}表达式。
我们错过了什么吗?
有没有办法从其他软件包中使用模式?
答案 0 :(得分:1)
请在sourceDirectories中添加SomeOtherPackagePath,如下所示:
<sourceDirectories>
<sourceDirectory>${project.basedir}/src/main/resources/</sourceDirectory>
<sourceDirectory>${project.parent.basedir}/SomeOtherPackagePath/</sourceDirectory>
</sourceDirectories>