julianpeeters / sbt-avrohugger   2.8.0

Apache License 2.0 GitHub

sbt plugin for generating Scala sources for Apache Avro schemas and protocols.

Scala versions: 2.12 2.10
sbt plugins: 1.0 0.13


sbt plugin for generating Scala case classes and ADTs from Apache Avro schemas, datafiles, and protocols.

Install the plugin (compatible with sbt 1.3+)

Add the following lines to the file myproject/project/plugins.sbt in your project directory:

addSbtPlugin("com.julianpeeters" % "sbt-avrohugger" % "2.8.0")


The following tasks and settings are automatically imported to your build:


Name Description
avroScalaGenerate Compiles the Avro files into Scala case classes.
avroScalaGenerateSpecific Compiles the Avro files into Scala case classes implementing SpecificRecord.


Wire the tasks into compile in your build.sbt:

e.g.: Compile / sourceGenerators += (Compile / avroScalaGenerate).taskValue

By default, the plugin looks Avro files in src/main/avro and generates Scala files in $sourceManaged, e.g., target/scala-3.3.1/src_managed/main/compiled_avro/ (to choose different locations, please see Changing Settings).


And/Or wire the tasks into the Test config, putting Avro files in src/test/avro:

e.g.: Test / sourceGenerators += (Test / avroScalaGenerate).taskValue


To run the tasks manually, please see Changing Settings or the sbt docs in order to ensure the compiler will be able to find the generated files.

Watch Avro Files

To enable file-watching for avro files, e.g. in ~compile, use:

e.g.: watchSources ++= ((Compile / avroSourceDirectory).value ** "*.avdl").get


Standard Settings

Name Default Description
avroSourceDirectories Seq("src/main/avro") List of paths containing *.avsc, *.avdl, and/or *.avro files.
avroScalaSource $sourceManaged/main/compiled_avro Path for the generated *.scala or *.java files.
avroScalaCustomTypes Standard.defaultTypes Customizable Type Mapping.
avroScalaCustomNamespace Map.empty[String, String] Map for reassigning namespaces.

SpecificRecord Settings

Name Default Description
avroSpecificSourceDirectories Seq("src/main/avro") Path containing *.avsc, *.avdl, and/or *.avro files.
avroSpecificScalaSource $sourceManaged/main/compiled_avro Path for the generated *.scala or *.java files.
avroScalaSpecificCustomTypes SpecificRecord.defaultTypes Customizable Type Mapping.
avroScalaSpecificCustomNamespace Map.empty[String, String] Map for reassigning namespaces.

Changing Settings

Settings for each format's task can be extended/overridden by adding lines to your build.sbt file.

E.g., to change how classes of SpecificRecords format are generated, use:

Compile / avroSpecificSourceDirectories += (Compile / sourceDirectory).value / "myavro"

Compile / avroSpecificScalaSource := new java.io.File("myScalaSource")

Compile / avroScalaSpecificCustomNamespace := Map("my.example"->"my.overridden.ex", "test.*" -> "wildcarded")

Compile / avroScalaSpecificCustomTypes := {
    array = avrohugger.types.ScalaVector)
  • record can be assigned to ScalaCaseClass and ScalaCaseClassWithSchema (with schema in a companion object)
  • array can be assigned to ScalaSeq, ScalaArray, ScalaList, and ScalaVector
  • enum can be assigned to JavaEnum, ScalaCaseObjectEnum, EnumAsScalaString, and ScalaEnumeration
  • fixed can be assigned to , ScalaCaseClassWrapper and ScalaCaseClassWrapperWithSchema(with schema in a companion object)
  • union can be assigned to OptionEitherShapelessCoproduct and OptionalShapelessCoproduct
  • int, long, float, double can be assigned to ScalaInt, ScalaLong, ScalaFloat, ScalaDouble
  • date logical type can be assigned to JavaTimeLocalDate and JavaSqlDate
  • timestamp-millis logical type can be assigned to JavaTimeInstant and JavaSqlTimestamp
  • uuid logical type can be assigned to UUID
  • decimal can be assigned to e.g. ScalaBigDecimal(Some(BigDecimal.RoundingMode.HALF_EVEN)) and ScalaBigDecimalWithPrecision(None) (via Shapeless Tagged Types)
  • protocol can be assigned to ScalaADT and NoTypeGenerated (see Protocol Support)


Supports generating case classes with arbitrary fields of the following datatypes: see avrohugger docs - supported datatypes


Please run unit tests in src/test/scala with ^ test, and integration tests in src/sbt-test with ^ scripted sbt-avrohugger/*, or, e.g. scripted sbt-avrohugger/specific.


sbt-avrohugger is based on sbt-avro originally developed by Juan Manuel Caicedo, and depends on avrohugger.


Marius Soutier
Vince Tse
Raúl Raja Martínez
Marco Stefani
Sacha Barber
Alexandre Bertails
Alexander Khotyanov
Brennan Saeta
Jerome Wacongne
Jon Morra
Paul Snively
Diego E. Alonso Blas
Andrew Gustafson
Jonas Grabber
Daniel Lundin
Ryan Koval
Simonas Gelazevicius
Zach Cox
Chris Albright
Fede Fernández
Angel Sanadinov

Fork away, just make sure the tests pass before you send a pull request.

Criticism is appreciated.