SFIO CRACHO - stock.adobe.com

Spring, Quarkus, Jakarta EE… Comment choisir son framework Java

Le choix d’un framework Java ne consiste pas à déterminer lequel est le meilleur, mais à accepter les compromis en matière de stabilité, de flexibilité et de complexité. Voici comment évaluer chaque framework en fonction de vos besoins.

La première décision prise lors du lancement d’un nouveau projet Java semble généralement facile à prendre : « Commençons par Spring Boot, c’est partout. »

Quelques jours plus tard, quelqu’un murmure que Quarkus démarre plus rapidement et économise de la mémoire. Puis un collègue de la vieille école demande pourquoi nous avons abandonné Jakarta EE alors que ses spécifications sont éprouvées et soutenues par les fournisseurs. Un DevOps met en garde contre le gonflement des conteneurs. Un ingénieur brandit le drapeau du système de modules de la plateforme Java Platform Module System (JPMS) pour l’hygiène de la compilation.

Soudain, l’équipe est plongée dans le débat sur les compromis.

Chaque option sur la table – Spring Boot, Quarkus, Jakarta EE, JPMS, Open Service Gateway Initiative (OSGi), ou même confier la plomberie à une boîte à outils EIP telle que Camel – gagne sa place en résolvant un vrai problème. Malheureusement, chacune d’entre elles apporte également son lot de nouveaux bagages : API incompatibles, maux de tête liés aux mises à jour, pipelines de construction plus abrupts ou frais généraux opérationnels qui ne disparaîtront pas avant que votre service ne prenne sa retraite.

Facteurs de choix d’un framework Java

Il ne s’agit pas de couronner une seule et unique « meilleure » architecture. Il s’agit d’identifier les inconvénients que votre équipe peut absorber sans bloquer la livraison deux ans plus tard.

  • Jakarta EE offre la stabilité, mais est grevé par l’existant et la lenteur de l’innovation.
  • Spring est flexible et puissant, mais vaste au point d’être submergeant.
  • Quarkus est rapide et léger, mais son écosystème n’a pas encore rattrapé son retard.
  • OSGi résout des problèmes de niche que la plupart des équipes n’ont pas.
  • JPMS améliore la structure, mais ce n’est pas un cadre.
  • Tous déplacent la complexité, mais aucun ne l’élimine.

En gardant tout cela à l’esprit, examinons comment choisir parmi les différents frameworks Java, chacun ayant ses avantages et ses inconvénients.

Jakarta EE

Jakarta EE – anciennement Java EE et avant cela J2EE – est généralement considéré comme le moyen standard de définir des services d’entreprise pour l’écosystème Java. Son large éventail de spécifications comprend l’injection de dépendances, la gestion des ressources, les services web, la messagerie, les transactions et bien d’autres choses encore.

Jakarta EE fait généralement référence à la fois aux spécifications et aux conteneurs qui les mettent en œuvre (tels que WildFly et GlassFish). Ces serveurs d’application constituent l’environnement dans lequel les développeurs déploient leur code.

Au fil du temps, Jakarta EE a tenté de s’adapter aux nouveaux modèles de développement, notamment ceux popularisés par Spring. Bien qu’il soit aujourd’hui plus convivial pour les développeurs, J2EE est toujours défini par son modèle de conteneur et par la transition de l’espace de noms javax à jakarta, résultat de la division de la marque entre Oracle et la Fondation Eclipse. Cette scission de l’espace de noms a fracturé la compatibilité et la documentation, et a sapé la cohérence de l’écosystème.

Résumé : Jakarta EE est stable, mature et axé sur les spécifications, mais au détriment de l’agilité et de la prise en charge de bibliothèques modernes.

Microservices : le multiplicateur de coûts caché

Diviser un système en dizaines de microservices Spring ou Quarkus peut sembler élégant, jusqu’à ce que chaque JVM réclame des centaines de mégaoctets de mémoire rien que pour tourner au ralenti. Multipliez cela par des dizaines de services et vous dépasserez votre budget cloud ou submergerez votre infrastructure sur site.

L’augmentation du nombre de services entraîne une augmentation de la coordination, de la journalisation, de la surcharge TLS et de la complexité de la surveillance. Quarkus aide quelque peu avec les constructions natives, mais même dans ce cas, chaque binaire entraîne des coûts de déploiement et d’exécution.

Une règle empirique commune : commencer par un monolithe modulaire. N’intégrez des microservices que si leur valeur dépasse les frais généraux.

Si 90 % de votre code consiste à transmettre des messages, un outil comme Apache Camel peut vous décharger du câblage. Il fonctionne avec Spring, Quarkus ou Apache Karaf, et élimine la nécessité d’écrire des dizaines d’adaptateurs personnalisés. L’inconvénient est qu’il s’agit d’un autre DSL et qu’il nécessite la prise en charge de la réflexion pour les images natives.

Spring

Spring est né d’une rébellion contre le modèle J2EE, considéré comme trop imposant. Plutôt que de s’appuyer sur un conteneur pour la recherche de ressources, Spring a donné aux développeurs des outils pour l’injection de dépendances, la testabilité et la configuration légère. Au fil du temps, Spring a évolué pour devenir une plateforme complète avec Spring Boot, qui vous permet de créer des applications autonomes et déployables avec des valeurs par défaut basées sur l’opinion et des intégrations étendues.

Spring a massivement influencé la façon dont les applications Java modernes sont développées. Il est productif et puissant. Mais il est aussi tentaculaire, avec souvent plus d’une façon de faire quelque chose, ce qui crée de la confusion au sein des équipes de développement. Il n’est pas non plus à l’abri des changements radicaux. Par exemple, Spring Boot 3 requiert Java 17 et introduit des changements de comportement dans Spring Security qui peuvent casser les applications plus anciennes à moins d’être configurées manuellement. De fait, les porteurs du projet ont dû s’adapter aux évolutions de l’OpenJDK.

Résumé : Spring est puissant, mais sa grande flexibilité s’accompagne d’une certaine complexité.

Quarkus

Quarkus est une alternative plus récente qui met l’accent sur la vitesse, la frugalité et le support des images natives. Contrairement à la configuration d’exécution de Spring, Quarkus s’appuie fortement sur la configuration au moment de la compilation, ce qui conduit à un démarrage plus rapide et à des empreintes mémoires plus petites. Il est particulièrement intéressant pour les environnements Kubernetes et serverless.

Par défaut, les applications Quarkus ont tendance à utiliser beaucoup moins de mémoire que les applications Spring comparables. L’expérience du développeur est également un point important, avec des rechargements rapides et des boucles de rétroaction rapides. Cependant, l’écosystème Quarkus est plus petit, et sa prise en charge limitée des bibliothèques à forte réflexion peut constituer un défi lorsqu’il s’agit de cibler des images natives.

En résumé : Quarkus est rapide et léger, mais son écosystème est à la traîne par rapport à d’autres frameworks Java majeurs.

OSGi : Une vraie modularité que peu utilisent en réalité

L’OSGi était la réponse de Java à la modularité d’exécution. Chaque bundle dispose de son propre classloader afin d’éliminer les conflits de versions et de permettre les échanges à chaud. Dans les démonstrations, c’est extraordinaire. En production, moins.

Les défis à relever sont les suivants :

  • Une courbe d’apprentissage abrupte et un soutien minimal de la part de la communauté.
  • Une adoption limitée de l’écosystème en dehors d’Eclipse et de Karaf.
  • Une complexité qui l’emporte souvent sur les avantages de la modularité.

Résumé : à moins que votre projet n’exige un code remplaçable à chaud, comme dans l’IoT industriel, OSGi est plus théorique que pratique.

JPMS : la ceinture de sécurité à la compilation

Le JPMS est souvent confondu avec un framework applicatif. Il n’en est pas un.

Le JPMS aide à la compilation en faisant respecter les limites des modules, en cachant les paquets internes et en réduisant les problèmes liés au chemin d’accès (classpath). Cependant, il n’aide pas à l’injection de dépendances, au chargement dynamique ou à l’orchestration de services.

Résumé : JPMS est idéal pour les grands monolithes à déploiement unique qui veulent nettoyer leur structure interne. Il ne remplace pas Spring ou Quarkus. Utilisez-le pour l’hygiène, pas pour l’architecture.

La bonne approche

Le choix d’un framework Java ne consiste pas à trouver le « meilleur ». Il s’agit de comprendre les compromis et de choisir ce que votre équipe peut prendre en charge.

La clé du succès à long terme de votre nouveau projet Java est de documenter vos choix architecturaux, de définir les inconvénients que vous êtes prêt à tolérer et de garder les choses suffisamment modulaires pour pouvoir vous adapter au fur et à mesure de l’évolution de vos besoins.

Pour approfondir sur Langages