Checklist complète pour migrer vers Spring Boot 4 sans douleur
Migrer vers Spring Boot 4 demande de la méthode. Une migration mal préparée peut bloquer votre équipe pendant des jours. Cette checklist vous guide étape par étape pour une migration maîtrisée et sans mauvaise surprise.
Phase 1 : Prérequis et préparation
Environnement Java
- ☐ Installer Java 21 LTS sur tous les postes de développement
- ☐ Mettre à jour les IDE (IntelliJ 2024.1+, Eclipse 2024-03+, VS Code avec Extension Pack for Java récent)
- ☐ Configurer JAVA_HOME pour pointer vers Java 21
- ☐ Vérifier la compatibilité CI/CD (GitHub Actions, GitLab CI, Jenkins)
java -version
echo $JAVA_HOMEAudit des dépendances
- ☐ Lister toutes les dépendances avec leurs versions actuelles
- ☐ Identifier les dépendances critiques (ORM, Security, Messaging)
- ☐ Vérifier la compatibilité Java 21 pour chaque dépendance
- ☐ Repérer les dépendances sans maintenance (risque de blocage)
./mvnw versions:display-dependency-updates
./gradlew dependencyUpdatesSauvegarde et branche
- ☐ Créer une branche dédiée
feature/spring-boot-4-migration - ☐ Taguer la version stable actuelle pour rollback facile
- ☐ Documenter l'état actuel (versions, configuration, comportements)
git checkout -b feature/spring-boot-4-migration
git tag -a v3.3-stable -m "Dernière version stable avant migration SB4"Phase 2 : Migration du POM/Build
Mise à jour Spring Boot
- ☐ Changer la version parent Spring Boot
<!-- pom.xml : Avant -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.x</version>
</parent>
<!-- pom.xml : Après -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>4.0.0</version>
</parent>- ☐ Mettre à jour la version Java
<properties>
<java.version>21</java.version>
</properties>Dépendances à mettre à jour
- ☐ Hibernate : vérifier la compatibilité (7.x inclus dans SB4)
- ☐ Spring Security : 7.x inclus automatiquement
- ☐ Spring Cloud : passer à la version 2024.x
- ☐ Lombok : version 1.18.34+
- ☐ MapStruct : version 1.6.x
- ☐ Flyway : version 10.x uniquement
<!-- Exemple : Spring Cloud compatible -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2024.0.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>Starters modifiés
- ☐ Vérifier les starters supprimés (Jetty standalone)
- ☐ Ajouter le nouveau starter observabilité si besoin
<!-- Nouveau starter unifié observabilité -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-observability</artifactId>
</dependency>Phase 3 : Migration du code
Spring Security
- ☐ Remplacer
authorizeRequests()parauthorizeHttpRequests() - ☐ Remplacer
antMatchers()parrequestMatchers() - ☐ Configurer CSRF explicitement pour les APIs REST
- ☐ Vérifier la configuration CORS
// AVANT (erreur en SB4)
http.authorizeRequests()
.antMatchers("/api/**").authenticated();
// APRÈS (obligatoire)
http.authorizeHttpRequests(auth -> auth
.requestMatchers("/api/**").authenticated()
);
// CSRF pour API REST stateless
http.csrf(csrf -> csrf.disable());Hibernate et JPA
- ☐ Vérifier les
@ManyToOne: maintenant LAZY par défaut - ☐ Migrer les Criteria legacy vers JPA Criteria API
- ☐ Tester les requêtes N+1 qui peuvent apparaître
// ATTENTION : comportement modifié
@ManyToOne // Était EAGER, maintenant LAZY par défaut
private Customer customer;
// Si EAGER nécessaire, expliciter :
@ManyToOne(fetch = FetchType.EAGER)
private Customer customer;- ☐ Supprimer les APIs Hibernate dépréciées
// SUPPRIMÉ en Hibernate 7
Criteria criteria = session.createCriteria(User.class);
// REMPLACER PAR
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<User> query = cb.createQuery(User.class);
Root<User> root = query.from(User.class);Servlet API
- ☐ Vérifier
getRequestURL(): retourne StringBuilder (non StringBuffer)
// Avant (potentiel warning)
StringBuffer url = request.getRequestURL();
// Après (compatible et propre)
String url = request.getRequestURL().toString();Métriques et observabilité
- ☐ Migrer l'API Micrometer vers la nouvelle syntaxe
// AVANT (Micrometer 1.x)
Metrics.counter("api.requests", "endpoint", "/users").increment();
// APRÈS (Micrometer 2.x)
Metrics.counter("api.requests", Tags.of("endpoint", "/users")).increment();- ☐ Adopter l'API Observations pour les nouvelles métriques
@Observed(name = "user.service", contextualName = "get-user")
public User getUser(Long id) {
return userRepository.findById(id).orElseThrow();
}Phase 4 : Migration de la configuration
Propriétés application.yml
- ☐ Scanner les propriétés dépréciées
grep -r "spring.datasource.initialization-mode" src/
grep -r "use-new-id-generator-mappings" src/
grep -r "management.metrics.tags" src/- ☐ Renommer les propriétés
| Ancienne | Nouvelle |
|---|---|
spring.datasource.initialization-mode |
spring.sql.init.mode |
management.metrics.tags.* |
management.observations.key-values.* |
- ☐ Configurer les nouvelles valeurs par défaut sécurité
spring:
security:
# Désactiver CSRF pour API REST si nécessaire
csrf:
enabled: false
management:
observations:
key-values:
application: ${spring.application.name}
environment: ${ENVIRONMENT:dev}Logging structuré
- ☐ Activer le logging JSON si environnement cloud
logging:
structured:
format:
console: ecs # Elastic Common Schema
file: jsonPhase 5 : Tests et validation
Tests unitaires
- ☐ Exécuter tous les tests unitaires
- ☐ Corriger les tests en échec liés aux changements d'API
- ☐ Vérifier les mocks Spring Security (API modifiée)
./mvnw testTests d'intégration
- ☐ Exécuter les tests d'intégration
- ☐ Vérifier les tests @DataJpaTest (changement Hibernate)
- ☐ Tester les endpoints sécurisés
./mvnw verifyTests de régression
- ☐ Tester manuellement les parcours critiques
- ☐ Vérifier les comportements de lazy loading
- ☐ Valider les réponses API (format, codes HTTP)
Tests de performance
- ☐ Mesurer le temps de démarrage
- ☐ Comparer la consommation mémoire
- ☐ Exécuter un test de charge léger
time java -jar target/app.jar --spring.main.banner-mode=off &
jcmd <pid> VM.native_memory summaryPhase 6 : Infrastructure
Images Docker
- ☐ Mettre à jour l'image de base
FROM eclipse-temurin:17-jre
FROM eclipse-temurin:21-jre- ☐ Reconstruire et tester l'image
docker build -t myapp:sb4 .
docker run -p 8080:8080 myapp:sb4CI/CD
- ☐ Mettre à jour les pipelines avec Java 21
- ☐ Vérifier les caches Maven/Gradle
- ☐ Tester le build complet en CI
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/setup-java@v4
with:
java-version: '21'
distribution: 'temurin'Environnements
- ☐ Déployer en environnement de dev
- ☐ Valider en staging avec données réalistes
- ☐ Préparer le rollback en cas de problème
Phase 7 : Déploiement production
Checklist pré-déploiement
- ☐ Tous les tests passent (unitaires, intégration, performance)
- ☐ Documentation mise à jour (README, runbook)
- ☐ Équipe informée du déploiement
- ☐ Monitoring prêt à détecter les anomalies
- ☐ Plan de rollback documenté
Déploiement
- ☐ Déployer en heures creuses si possible
- ☐ Surveiller les logs pendant 30 minutes
- ☐ Vérifier les métriques (latence, erreurs, mémoire)
- ☐ Valider les parcours critiques en production
Post-déploiement
- ☐ Garder l'ancienne version disponible 48h minimum
- ☐ Documenter les problèmes rencontrés
- ☐ Partager le retour d'expérience avec l'équipe
Scripts utilitaires
Script de vérification des prérequis
#!/bin/bash
echo "=== Vérification prérequis Spring Boot 4 ==="
java_version=$(java -version 2>&1 | head -n 1 | cut -d'"' -f2 | cut -d'.' -f1)
if [ "$java_version" -ge 21 ]; then
echo "✅ Java $java_version (21+ requis)"
else
echo "❌ Java $java_version (21+ requis)"
fi
mvn_version=$(mvn -v 2>&1 | head -n 1 | cut -d' ' -f3)
echo "ℹ️ Maven $mvn_version"
echo ""
echo "=== Propriétés dépréciées détectées ==="
grep -r "spring.datasource.initialization-mode" src/ 2>/dev/null && echo "⚠️ initialization-mode trouvé"
grep -r "use-new-id-generator-mappings" src/ 2>/dev/null && echo "⚠️ use-new-id-generator-mappings trouvé"
echo ""
echo "=== Patterns Security dépréciés ==="
grep -r "authorizeRequests()" src/ 2>/dev/null && echo "⚠️ authorizeRequests() trouvé"
grep -r "antMatchers(" src/ 2>/dev/null && echo "⚠️ antMatchers() trouvé"Script de migration des imports
#!/bin/bash
echo "=== Fichiers à modifier ==="
echo ""
echo "--- Security ---"
grep -rl "authorizeRequests()" src/main/java/
echo ""
echo "--- Hibernate Criteria legacy ---"
grep -rl "session.createCriteria" src/main/java/
echo ""
echo "--- Micrometer 1.x syntax ---"
grep -rl 'counter.*".*",.*"' src/main/java/Temps estimé par phase
| Phase | Projet petit | Projet moyen | Projet large |
|---|---|---|---|
| Prérequis | 2h | 4h | 1 jour |
| Build/POM | 1h | 2h | 4h |
| Code | 2h | 1 jour | 3 jours |
| Configuration | 1h | 2h | 4h |
| Tests | 2h | 1 jour | 2 jours |
| Infrastructure | 1h | 2h | 4h |
| Déploiement | 1h | 2h | 4h |
| Total | 1 jour | 3-4 jours | 1-2 semaines |
Ressources complémentaires
Pour comprendre en détail chaque breaking change, consultez notre article : Spring Boot 4 : breaking changes à connaître avant de migrer
Pour comparer objectivement les deux versions : Spring Boot 3 vs Spring Boot 4 : comparatif technique et performance
Pour une vision stratégique : Spring Boot 4 : faut-il migrer maintenant ?
Cette checklist couvre les cas les plus courants. Adaptez-la à votre contexte : certaines étapes peuvent être non applicables selon votre stack. L'essentiel est de procéder méthodiquement et de valider chaque phase avant de passer à la suivante.