Maven从从属jar导入avro定义
我有两个maven项目,它们使用avro maven插件生成代码。我面临的问题 其中一个项目有一个avro对象,该对象使用对来自的另一个avro对象的引用 第二个maven项目。尽管我将第二个项目生成的jar作为maven依赖项包含在内,但我无法找到为第二个项目生成代码的方法 本质上考虑我的第二个项目有一个AVRO定义,如下面的Maven从从属jar导入avro定义,maven,avro,avro-tools,Maven,Avro,Avro Tools,我有两个maven项目,它们使用avro maven插件生成代码。我面临的问题 其中一个项目有一个avro对象,该对象使用对来自的另一个avro对象的引用 第二个maven项目。尽管我将第二个项目生成的jar作为maven依赖项包含在内,但我无法找到为第二个项目生成代码的方法 本质上考虑我的第二个项目有一个AVRO定义,如下面的 { "namespace": "my.second.project.avro", "name": "listNode", "type": "record",
{
"namespace": "my.second.project.avro",
"name": "listNode",
"type": "record",
"fields":[
{
"name":"eventList",
"type":{
"type": "array",
"items": "my.first.project.AvroDefinition.avsc"
}
}
]
}
在这个定义中,它指的是一个依赖项jar中包含的AvroDefinition.avsc,
但是我找不到任何方法来提取AvroDefinition.avsc并将其用于
第二个项目。
顺便说一句,avro maven插件的设置如下:
<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>
无论如何,我希望我可以使用maven远程资源插件,但我无法让它工作,所以我的问题是这怎么可能?如何从从属jar导入avro定义以生成代码 我最终找到了一个解决方案,不过更多的是一种变通方法,使用了两个maven插件(maven resources插件)和(maven remote resources插件) 实际上,第一个插件(maven resources插件)只是用来将avsc文件复制到项目的resources目录中,因此,如果指定目录中已经有文件,则可以省略此步骤 实际的工作是通过(maven remote resources plugin)完成的,它需要在src/main/resources目录中找到要包含在jar中的文件(顺便说一句,由于某种原因,我无法使用plugin上的选项)(因此上面的步骤)
maven远程资源插件
1.6.0
捆
**/*.avsc
这样做可以确保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>
org.apache.maven.plugins
maven远程资源插件
1.6.0
{groupId}:{artifactId}:{version}
生成源
过程
请注意两件事,首先在resourceBundles选项中包含依赖项jar,然后将执行阶段设置为生成源,而不是默认的生成资源,否则它将无法工作,因为avro maven插件确实在生成源生命周期中执行,并且到那时它应该具有avsc文件
最后,您还应该在AvroMaven插件的导入部分包括以下内容
<import>${project.build.directory}/maven-shared-archive-resources/</import>
${project.build.directory}/maven共享归档资源/
这基本上就是默认情况下从maven remote resources插件导出avsc文件的目录基于接受的答案,我仅使用maven remote resources插件就可以实现这一点。打开Maven调试日志后,我注意到没有导入远程资源包,即使它们正在创建。这是由于每个依赖JAR中都有一个空的
remote resources.xml
文件
另一个帖子为我指明了正确的方向
我需要补充一点
<includes>
<include>**/*.avsc</include>
</includes>
我以前做过,但只使用AVDL。。。Avsc文件无法为信息导入其他hanks,我终于找到了一个解决方法,通过maven remote resources插件,并遵循此线程进行操作。请随意回答您自己的问题,并提供有效的解决方案
<import>${project.build.directory}/maven-shared-archive-resources/</import>
<includes>
<include>**/*.avsc</include>
</includes>
<imports>
<import>${project.build.directory}/maven-shared-archive-resources/MyAvroSchema.avsc</import>
</imports>