···11+---
22+date: 2026-02-10
33+title: Apache Avro et JSpecify
44+draft: true
55+---
66+77+La majorité des projets Java utilisant des communications Kafka s'appuie sur le format Avro.
88+99+Ce format est très pratique, puisqu'il permet de bien définir la structure des échanges avec un schéma de données partagé, peut assurer la compatibilité (ascendante ou descendante) des consommateurs, et est plutôt efficace sur les échanges avec la sérialisation en binaire.
1010+1111+Le plugin Maven Avro (qui n'est pas très bien documenté) permet de générer les classes Java à partir d'un schéma.
1212+1313+Les classes peuvent ensuite être utilisées dans le code applicatif.
1414+1515+## Configurer le plugin Maven Avro pour JSpecify
1616+1717+Le guide [Getting Started (Java)](https://avro.apache.org/docs/1.12.0/getting-started-java/) propose la configuration minimale suivante :
1818+1919+```xml
2020+<plugin>
2121+ <groupId>org.apache.avro</groupId>
2222+ <artifactId>avro-maven-plugin</artifactId>
2323+ <version>1.12.0</version>
2424+ <configuration>
2525+ <sourceDirectory>${project.basedir}/src/main/avro/</sourceDirectory>
2626+ <outputDirectory>${project.basedir}/src/main/java/</outputDirectory>
2727+ </configuration>
2828+ <executions>
2929+ <execution>
3030+ <phase>generate-sources</phase>
3131+ <goals>
3232+ <goal>schema</goal>
3333+ </goals>
3434+ </execution>
3535+ </executions>
3636+</plugin>
3737+```
3838+3939+Le goal `schema` est donc invoqué lors de la phase `generate-sources` de Maven (avant la compilation du code).
4040+4141+Pour activer le support des annotations JSpecify, il faut ajouter 3 paramètres de configuration :
4242+4343+* `createNullSafeAnnotations` pour activer la génération des annotations (annotations JetBrains par défaut)
4444+* `nullSafeAnnotationNullable` pour indiquer quelle annotation `@Nullable` doit être utilisée
4545+* `nullSafeAnnotationNotNull` pour indiquer quelle annotation `@NonNull` doit être utilisée
4646+4747+Ce qui donne le paramétrage complet suivant :
4848+4949+```xml
5050+<plugin>
5151+ <groupId>org.apache.avro</groupId>
5252+ <artifactId>avro-maven-plugin</artifactId>
5353+ <version>1.12.0</version>
5454+ <configuration>
5555+ <sourceDirectory>${project.basedir}/src/main/avro/</sourceDirectory>
5656+ <outputDirectory>${project.basedir}/src/main/java/</outputDirectory>
5757+ <!-- JSpecify support -->
5858+ <createNullSafeAnnotations>true</createNullSafeAnnotations>
5959+ <nullSafeAnnotationNullable>org.jspecify.annotations.Nullable</nullSafeAnnotationNullable>
6060+ <nullSafeAnnotationNotNull>org.jspecify.annotations.NonNull</nullSafeAnnotationNotNull>
6161+ </configuration>
6262+ <executions>
6363+ <execution>
6464+ <phase>generate-sources</phase>
6565+ <goals>
6666+ <goal>schema</goal>
6767+ </goals>
6868+ </execution>
6969+ </executions>
7070+</plugin>
7171+```
7272+7373+7474+7575+## Liens et références
7676+7777+* Guide officiel de démarrage Avro pour Java : [Getting Started (Java)](https://avro.apache.org/docs/1.12.0/getting-started-java/)
7878+* Le [commit sur GitHub](https://github.com/apache/avro/commit/067c44024c3db832e731c051ba0178f0c4f18a04) qui a apporté le support des annotations null-safe
7979+* La javadoc du plugin Maven Avro : https://avro.apache.org/docs/1.12.0/api/java/org/apache/avro/mojo/AbstractAvroMojo.html