Maven从从属jar导入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",

我有两个maven项目,它们使用avro maven插件生成代码。我面临的问题 其中一个项目有一个avro对象,该对象使用对来自的另一个avro对象的引用 第二个maven项目。尽管我将第二个项目生成的jar作为maven依赖项包含在内,但我无法找到为第二个项目生成代码的方法

本质上考虑我的第二个项目有一个AVRO定义,如下面的

{
  "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>