Generate Java data classes from Avro schemas
Generate Java data classes from Avro schema files (.avsc
) to use with Apache Kafka® producers and consumers. Use the avro-tools
JAR to create Java classes that match your schema structure.
Prerequisites
-
An active Aiven for Apache Kafka® service
-
Karapace Schema Registry enabled
-
Java (JDK 8 or later)
-
Apache Maven installed to manage dependencies
-
avro-tools
JAR file downloaded (such asavro-tools-1.12.0.jar
) -
An Avro schema file with a
.avsc
extensionnoteYou can also use
.json
files if they contain a valid Avro schema. Do not use.avro
files. They include both schema and data and are not compatible withavro-tools
.
Generate the Java classes
Run the following command to generate Java classes from your Avro schema:
Use the latest version of avro-tools
if available.
You can check for newer releases at https://avro.apache.org/releases.html.
java -jar avro-tools-1.12.0.jar compile schema src/main/resources/user-value.avsc src/main/java/
- Replace
user-value.avsc
with your schema file. - Replace
src/main/java/
with your preferred output directory.
The generated class is named based on the name
field in your schema, and it is placed
in a subdirectory matching the namespace
.
Example schema
{
"type": "record",
"name": "User",
"namespace": "io.aiven.example",
"fields": [
{ "name": "id", "type": "int" },
{ "name": "email", "type": "string" }
]
}
This schema produces the following file:
src/main/java/io/aiven/example/User.java
Add Maven dependencies
Add these dependencies to your pom.xml
to compile and use the generated classes for
Avro serialization and deserialization in Kafka producers and consumers.
<dependencies>
<!-- Apache Kafka client dependency -->
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>3.8.1</version>
</dependency>
<!-- Confluent dependencies for Avro serialization and Schema Registry -->
<dependency>
<groupId>io.confluent</groupId>
<artifactId>kafka-avro-serializer</artifactId>
<version>8.0.0</version>
</dependency>
<dependency>
<groupId>io.confluent</groupId>
<artifactId>kafka-schema-registry-client</artifactId>
<version>8.0.0</version>
</dependency>
<!-- Apache Avro dependency -->
<dependency>
<groupId>org.apache.avro</groupId>
<artifactId>avro</artifactId>
<version>1.12.0</version>
</dependency>
</dependencies>
Ensure that the versions of Avro, Kafka, and Confluent dependencies are compatible with each other and with your Kafka setup.
Optional dependencies
You can use additional libraries depending on your schema or Avro usage:
<!-- Jackson support for Java 8 types (used with generated POJOs) -->
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jdk8</artifactId>
<version>2.19.2</version>
</dependency>
<!-- Guava support (used in some Avro-related tooling) -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>33.4.8-jre</version>
</dependency>
These dependencies are optional. Include them only if your generated classes use
features like Optional<T>
fields (Jackson) or ImmutableList
and ImmutableSet
types (Guava).
Related pages