Maven plugin for generating Scala case classes and ADTs from Apache Avro schemas, datafiles, and protocols.
The plugin currently supports one goal:
- generate-scala-sources: This generates the Scala sources for the Avro schema
<plugin>
<groupId>at.makubi.maven.plugin</groupId>
<artifactId>avrohugger-maven-plugin</artifactId>
<version>1.7</version>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>generate-scala-sources</goal>
</goals>
</execution>
</executions>
</plugin>
This plugin can be used in conjunction with the scala-maven-plugin to add the generated Scala sources to your Scala build.
<plugins>
<plugin>
<groupId>at.makubi.maven.plugin</groupId>
<artifactId>avrohugger-maven-plugin</artifactId>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>generate-scala-sources</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<executions>
<execution>
<id>add-generated-sources</id>
<phase>generate-sources</phase>
<goals>
<goal>add-source</goal>
</goals>
<configuration>
<sourceDir>${project.build.directory}/generated-sources/avro</sourceDir>
</configuration>
</execution>
<execution>
<goals>
<goal>compile</goal>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
...
</plugin>
</plugins>
You can override the following variables in the plugin configuration:
- Path to the directory containing the Avro schema files
- Defaults to ${basedir}/src/main/avro
- Path to the output directory for the generated Scala sources
- Defaults to ${project.build.directory}/generated-sources/avro
- Boolean to allow recursion over the specified sourceDirectory
- Defaults to false
- Boolean to restrict case class generation for compatibility with scala 2.10
- Defaults to false
- Format for source code generation
- Possible values are SCAVRO, SPECIFIC_RECORD and STANDARD
- Defaults to SPECIFIC_RECORD
- Map namespace in Avro files to custom package name in generated scala files
- Defaults to Empty List (Namespace is not modified)
- List of paths to be included in generation
- fileInclude elements consist of
- path: The path to be included
- matchSyntax: STRING, GLOB or REGEX
- Paths are relative to the sourceDirectory
- An empty list is overwritten with the default setting
- For GLOB see https://docs.oracle.com/javase/7/docs/api/java/nio/file/FileSystem.html#getPathMatcher(java.lang.String)
- Defaults to FileInclude("**", GLOB) which includes all files
- Override for types for generation
- Possible elements
- Complex
- arrayType
- enumType
- fixedType
- mapType
- protocolType
- recordType
- unionType
- Primitive
- booleanType
- bytesType
- doubleType
- floatType
- intType
- longType
- nullType
- stringType
- Logical
- timestampMillisType - possible values are
JavaTimeInstant
orJavaSqlTimestamp
- timestampMillisType - possible values are
- Complex
- Defaults to no overrides
To override the sourceDirectory and outputDirectory, use
<plugins>
<plugin>
<groupId>at.makubi.maven.plugin</groupId>
<artifactId>avrohugger-maven-plugin</artifactId>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>generate-scala-sources</goal>
</goals>
</execution>
</executions>
<configuration>
<sourceDirectory>src/main/resources/avro</sourceDirectory>
<outputDirectory>target/generated-sources</outputDirectory>
</configuration>
</plugin>
</plugins>
To override the sourceDirectory, outputDirectory, recurse over sourceDirectory, and restrict generated class fields to be compatible with Scala 2.10 use
<plugins>
<plugin>
<groupId>at.makubi.maven.plugin</groupId>
<artifactId>avrohugger-maven-plugin</artifactId>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>generate-scala-sources</goal>
</goals>
</execution>
</executions>
<configuration>
<sourceDirectory>src/main/resources/avro</sourceDirectory>
<outputDirectory>target/generated-sources</outputDirectory>
<recursive>true</recursive>
<limitedNumberOfFieldsInCaseClasses>true</limitedNumberOfFieldsInCaseClasses>>
</configuration>
</plugin>
</plugins>
To override the namespaceMapping of Avro protocols under the com.example.packagename
namespace to com.example.packagenamechanged
and include all files in a subdirectory and its subdirectories named subdir, use
<plugins>
<plugin>
<groupId>at.makubi.maven.plugin</groupId>
<artifactId>avrohugger-maven-plugin</artifactId>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>generate-scala-sources</goal>
</goals>
</execution>
</executions>
<configuration>
<namespaceMapping>
<mapping>
<from>com.example.packagename</from>
<to>com.example.packagenamenew.subchange</to>
</mapping>
</namespaceMapping>
<fileIncludes>
<fileInclude>
<path>subdir/**</path>
<matchSyntax>GLOB</matchSyntax>
</fileInclude>
</fileIncludes>
</configuration>
</plugin>
</plugins>
This plugin heavily relies on Avrohugger to generate Scala code.
The Avrohugger Maven Plugin is released under version 2.0 of the Apache License.