2015-01-01 5 views
1

우리는 큰 Java 프로젝트에서 Avro를 직렬화 엔진으로 사용합니다.다른 패키지의 Avro 스키마 사용

Avro 스키마의 클래스를 자동 생성하는 데 maven 플러그인을 사용합니다 (우리는 avsc 만 사용하고 IDL은 사용하지 않습니다). 우리는 교차 패키지 참조를하기 전에는 모두 훌륭하게 작동합니다.

플러그인에는 가져 오기 태그를 사용하여 스키마 파일을 가져 오는 옵션이 있습니다.이 태그는 패키지 내에서 제대로 작동하지만 패키지 외부의 스키마를 참조하려고하면 잘되지 않습니다.

플러그인 설정입니다 : 레코드가 schema2라고 포함

<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를 참조하는 다른 모든 스키마는 유효합니다.

schema1.avsc는 기록이 SCHEMA1라는 포함되어 있으며, 다른 패키지에 있으므로이있는 스키마를 받는다는 구축 할 때 실패에 참조 된 패키지 : 골 조직을 실행하지 못했습니다

[ERROR]를 선택합니다. apache.avro : avro-maven-plugin : 1.7.7 : schema (default) on 프로젝트 매칭 - 공통 : 목표의 실행 기본값 org.apache.avro : avro-maven-plugin : 1.7.7 : 스키마 실패 : "Schema1 "는 정의 된 이름이 아닙니다. "schema1"필드의 유형은 정의 된 이름이거나 { "type": ...} 표현식이어야합니다.

뭔가 빠졌습니까?

다른 패키지의 스키마를 사용하는 방법이 있습니까?

답변

1

아래처럼 sourceDirectories에 SomeOtherPackagePath을 추가하십시오 :

<sourceDirectories> 
<sourceDirectory>${project.basedir}/src/main/resources/</sourceDirectory> 
<sourceDirectory>${project.parent.basedir}/SomeOtherPackagePath/</sourceDirectory> 
</sourceDirectories> 
관련 문제