2025-11-07
Jakarta EE (anciennement Java EE / J2EE) est une plateforme standardisée pour le développement d’applications d’entreprise Java.
Web & Services
Données & Persistance
@Embeddable, @IdClass)java.time.Instant et java.time.YearEntityManager injectable avec scope CDIInfrastructure & Services
Sécurité & Validation
Formats & Messaging
📚 Documentation complète : Jakarta EE 11 Specifications | 🎓 Tutorial
Ère J2EE (1999-2006)
Ère Java EE (2006-2017)
Ère Jakarta EE (2017-présent)
javax.* → jakarta.*)L’Émergence Cloud-Native (2015-2020)
Évolution clé : De J2EE complexe → Spring simple → Jakarta EE modernisé → Quarkus cloud-native
Plateformes Standards Jakarta EE
Écosystèmes Alternatifs
Liste complète des serveurs certifiés : Jakarta EE Compatibility
Spring Framework & Spring Boot
Jakarta EE avec Quarkus
| Critère | Spring Boot | Quarkus | Jakarta EE (Payara/Liberty) |
|---|---|---|---|
| Standards | Propriétaire Spring | Spécifications Jakarta EE + MicroProfile | Jakarta EE Full Profile |
| Certification | Non certifié | Non certifié (utilise des specs individuelles) | Certifié Jakarta EE |
| Injection | Spring DI | CDI (Jakarta) | CDI (Jakarta) |
| REST | Spring MVC | JAX-RS (RESTEasy) | JAX-RS |
| Persistence | Spring Data JPA | JPA (Hibernate Panache) | JPA (EclipseLink/Hibernate) |
| Configuration | application.yml/properties | application.properties | server.xml/domain.xml |
| Packaging | JAR exécutable | JAR/Native binary | WAR/EAR |
| Démarrage | ~3-5s | <0.1s (natif) / ~1s (JVM) | ~8-10s |
| Mémoire | ~100-150 MB | ~20 MB (natif) / ~70 MB (JVM) | ~150-200 MB |
| Hot Reload | Spring DevTools | Dev Mode (instantané) | Redéploiement |
| Popularité | ⭐⭐⭐⭐⭐ (87%) | ⭐⭐⭐ (8%) | ⭐⭐ (5%) |
| Use Cases | Tout type | Microservices, Cloud, Serverless | Enterprise traditionnelle |
Migration : Les concepts (IoC, REST, JPA) sont transférables entre Spring et Jakarta EE
Quarkus représente l’évolution moderne de Jakarta EE vers le cloud-native, en implémentant et supportant les spécifications Jakarta EE (les APIs standard fonctionnent), tout en ajoutant des extensions et optimisations spécifiques
Prérequis
Vérification
Mode Développement (Dev Mode)
Mode Production
Ports par défaut
Ou via https://code.quarkus.io avec les extensions : - RESTEasy Reactive Jackson - Hibernate ORM with Panache - JDBC Driver - H2
message-app/
├── src/main/java/
│ └── com/example/
│ ├── entity/
│ │ └── Message.java # Entité JPA Panache
│ ├── repository/
│ │ └── MessageRepository.java # Repository Panache
│ └── resource/
│ └── MessageResource.java # Ressource REST
├── src/main/resources/
│ ├── application.properties # Configuration centralisée
│ └── import.sql # Données de test (optionnel)
└── pom.xml
package com.example.entity;
import io.quarkus.hibernate.orm.panache.PanacheEntity;
import jakarta.persistence.*;
import java.time.LocalDateTime;
@Entity
@Table(name = "messages")
public class Message extends PanacheEntity {
// 'id' hérité de PanacheEntity
@Column(nullable = false, length = 500)
public String content;
@Column(name = "created_at")
public LocalDateTime createdAt;
public Message() {}
public Message(String content) {
this.content = content;
this.createdAt = LocalDateTime.now();
}
}Note Panache : Pas de getters/setters nécessaires ! Les champs publics sont transformés en propriétés.
package com.example.repository;
import com.example.entity.Message;
import io.quarkus.hibernate.orm.panache.PanacheRepository;
import jakarta.enterprise.context.ApplicationScoped;
import java.util.List;
@ApplicationScoped // CDI Bean
public class MessageRepository implements PanacheRepository<Message> {
// Méthodes héritées : persist(), delete(), findById(), listAll()
public List<Message> findRecent(int limit) {
return list("ORDER BY createdAt DESC", limit);
}
public List<Message> searchByContent(String keyword) {
return list("LOWER(content) LIKE LOWER(?1)", "%" + keyword + "%");
}
}package com.example.resource;
import com.example.entity.Message;
import com.example.repository.MessageRepository;
import jakarta.inject.Inject;
import jakarta.transaction.Transactional;
import jakarta.ws.rs.*;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;
import java.util.List;
@Path("/messages")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class MessageResource {
@Inject
MessageRepository messageRepository;
@GET
public List<Message> getAllMessages() {
return messageRepository.listAll();
}
@GET
@Path("/{id}")
public Response getMessageById(@PathParam("id") Long id) {
Message message = messageRepository.findById(id);
if (message == null) {
return Response.status(Response.Status.NOT_FOUND).build();
}
return Response.ok(message).build();
}
@POST
@Transactional
public Response createMessage(Message message) {
messageRepository.persist(message);
return Response.status(Response.Status.CREATED)
.entity(message)
.build();
}
@DELETE
@Path("/{id}")
@Transactional
public Response deleteMessage(@PathParam("id") Long id) {
boolean deleted = messageRepository.deleteById(id);
if (!deleted) {
return Response.status(Response.Status.NOT_FOUND).build();
}
return Response.noContent().build();
}
}# Configuration DataSource H2 (dev)
quarkus.datasource.db-kind=h2
quarkus.datasource.jdbc.url=jdbc:h2:mem:testdb
quarkus.hibernate-orm.database.generation=drop-and-create
quarkus.hibernate-orm.log.sql=true
# Configuration HTTP
quarkus.http.port=8080
# Swagger UI (disponible en dev)
quarkus.swagger-ui.always-include=true# Démarrer en mode dev
quarkus dev
# Créer un message
curl -X POST http://localhost:8080/messages \
-H "Content-Type: application/json" \
-d '{"content":"Hello Quarkus!"}'
# Récupérer tous les messages
curl http://localhost:8080/messages
# Dev UI : http://localhost:8080/q/dev
# Swagger UI : http://localhost:8080/q/swagger-ui| Aspect | Jakarta EE Classique | Quarkus + Panache |
|---|---|---|
| Entité JPA | Getters/setters obligatoires | Champs publics suffisent |
| DAO/Repository | EntityManager manuel | PanacheRepository automatique |
| Queries | JPQL verbeux | API fluide simplifiée |
| Configuration | persistence.xml + web.xml | application.properties unique |
| CDI | beans.xml requis | Activé par défaut |
| Démarrage | ~10s | <1s en mode dev |
Le Dev UI (http://localhost:8080/q/dev) offre :
@TransactionalRepository GitHub : https://github.com/quarkusio/quarkus-quickstarts/tree/main/hibernate-orm-panache-quickstart
E. Bruno - JEE: Introduction à Jakarta Enterprise Edition