如何从包含Avro schema的公共库直接生成Java .class文件而不生成源码?
Avro Schema公共库直接生成Class文件解决方案
官方原生avro-maven-plugin的schema目标仅支持生成Java源码,本身没有直接输出.class文件的能力,你可以通过以下两种方案实现需求:
方案1:调整现有插件配置(最简便,适配90%以上场景)
你之前的配置把输出目录设为了源码目录src/main/java,才会留下可感知的中间.java文件。仅需修改输出目录为Maven构建的临时生成目录,即可实现代码仓库无中间Java文件,构建时自动生成、自动编译进最终jar包,全程不需要人工处理中间文件:
<plugin> <groupId>org.apache.avro</groupId> <artifactId>avro-maven-plugin</artifactId> <version>${avro-maven-plugin.version}</version> <executions> <execution> <phase>generate-sources</phase> <goals> <goal>schema</goal> </goals> <configuration> <sourceDirectory>${project.basedir}/src/main/schemas/</sourceDirectory> <!-- 输出到构建临时目录,默认被.gitignore忽略,不会提交到代码库,构建完成后随target目录自动清理 --> <outputDirectory>${project.build.directory}/generated-sources/avro</outputDirectory> </configuration> </execution> </executions> </plugin>
Maven会自动识别${project.build.directory}/generated-sources下的路径为编译源路径,后续compile阶段会自动把生成的.java编译为.class打进最终jar包。如果需要依赖该公共库的其他项目也能读取到原始.avsc文件,可以添加资源目录配置,把schema文件也打进jar包:
<build> <resources> <resource> <directory>src/main/schemas</directory> <includes> <include>**/*.avsc</include> </includes> </resource> </resources> </build>
方案2:完全不生成中间.java文件(适合强约束场景)
如果要求构建过程中也不产生任何.java文件,可以直接调用Avro Compiler的API实现字节码直接生成:
- 引入
org.apache.avro:avro-compiler依赖 - 调用
org.apache.avro.compiler.specific.SpecificCompiler的相关编译方法,直接输出字节码到${project.build.directory}/classes目录 - 可以通过
gmavenplus-plugin执行Groovy脚本实现该逻辑,也可以自行开发简易的Maven插件完成。
内容的提问来源于stack exchange,提问作者Omegaspard
相关产品推荐
相关产品推荐

