maven - Maven 从依赖 jar 导入 avro 定义
问题描述
我有两个使用 avro-maven-plugin 进行代码生成的 maven 项目。我面临的问题是其中一个项目有一个 avro 对象,该对象使用对来自第二个 maven 项目的另一个 avro 对象的引用。尽管我将第二个项目生成的 jar 包含为 maven 依赖项,但我无法找到为第二个项目生成代码的方法。
本质上考虑我的第二个项目具有如下所示的 avro 定义的情况
{
"namespace": "my.second.project.avro",
"name": "listNode",
"type": "record",
"fields":[
{
"name":"eventList",
"type":{
"type": "array",
"items": "my.first.project.AvroDefinition.avsc"
}
}
]
}
在此定义中,它指的是 AvroDefinition.avsc ,它包含在一个依赖项 jar 中,但我找不到任何方法来提取 AvroDefinition.avsc 并将其用于第二个项目中的代码生成。顺便说一句,avro-maven-plugin 已设置如下:
<plugin>
<groupId>org.apache.avro</groupId>
<artifactId>avro-maven-plugin</artifactId>
<version>1.9.1</version>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>schema</goal>
<goal>protocol</goal>
<goal>idl-protocol</goal>
</goals>
<configuration>
<imports>
<import>${project.basedir}/src/main/avro/include/</import>
</imports>
<sourceDirectory>${project.basedir}/src/main/avro/</sourceDirectory>
<outputDirectory>${project.basedir}/src/main/java/</outputDirectory>
<stringType>String</stringType>
</configuration>
</execution>
</executions>
</plugin>
我得到的错误如下:
Execution default of goal org.apache.avro:avro-maven-plugin:1.9.1:schema failed:
Undefined name: "my.first.project.AvroDefinition.avsc"
无论如何,我希望我可以使用 maven 远程资源插件,但我无法让它工作,所以我的问题是这怎么可能?如何从依赖 jar 导入 avro 定义以生成我的代码?
解决方案
我终于找到了一个解决方案,更多的是一种解决方法,使用两个 maven 插件(maven-resources-plugin)和(maven-remote-resources-plugin)。
本质上,第一个插件(maven-resources-plugin)只是用于将 avsc 文件复制到项目的资源目录中,因此如果您已经在指定目录中有文件,则可以省略此步骤
实际工作是通过 (maven-remote-resources-plugin) 完成的,它需要在 src/main/resources 目录中找到要包含在 jar 中的文件(顺便说一下,由于某种原因,我无法使用插件上的选项)(因此上面的步骤)
<plugin>
<artifactId>maven-remote-resources-plugin</artifactId>
<version>1.6.0</version>
<executions>
<execution>
<goals>
<goal>bundle</goal>
</goals>
</execution>
</executions>
<configuration>
<includes>
<include>**/*.avsc</include>
</includes>
</configuration>
</plugin>
这样做可确保 avsc 文件包含在 jar 中,然后在您的第二个项目/模块中,您需要从插件中执行此目标(见下文)以提取 avsc 文件并生成代码
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-remote-resources-plugin</artifactId>
<version>1.6.0</version>
<configuration>
<resourceBundles>
<resourceBundle>{groupId}:{artifactId}:{version}</resourceBundle>
</resourceBundles>
</configuration>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>process</goal>
</goals>
</execution>
</executions>
</plugin>
请注意两件事,首先在 resourceBundles 选项中包含依赖项 jar,其次将执行阶段设置为 generate-sources 而不是默认的 generate-resources 否则它将无法工作,因为 avro-maven-plugin 确实在 generate-源生命周期,到那时它应该有 avsc 文件。
最后一点,您还应该在 avro-maven-plugin 的导入部分中包含以下行
<import>${project.build.directory}/maven-shared-archive-resources/</import>
这基本上是默认情况下从 maven-remote-resources-plugin 导出 avsc 文件的目录
推荐阅读
- c# - 我的连接字符串在自己生成的连接字符串上出错。我将如何解决这个问题?
- mongoose - 尝试在猫鼬中创建关系时出错
- javascript - 将第二个参数传递给自动接受第一个参数的函数
- angular - 角度形式的意外 EOF 字符错误,为什么?
- scala - Scala如何在调用者堆栈中应用函数
- android - react-native run-android 有错误,如何解决?
- android - 内置 apk 扩展类型显示 MobogenieAPK ?我不知道为什么
- android - 无法解析 com.facebook.react:react-native:0.32.0
- netsuite - SuiteScript 2 首先加载库
- assembly - 零/符号扩展是无操作的,为什么每种尺寸类型的说明?