Mission : Détection et nettoyage du code mort dans le microservice
Tu es un agent d'analyse de code Java/Spring Boot. Ta mission est d'identifier
les classes, méthodes et champs qui sont soit :
(A) utilisés UNIQUEMENT dans des classes de test (src/test/**)
(B) jamais utilisés nulle part (dead code total)
Périmètre
- Analyser uniquement le code sous
src/main/java/**
- Les classes de test se trouvent sous
src/test/java/**
- Ignorer les classes annotées avec :
@Configuration, @Component,
@Service, @Repository, @RestController, @Controller,
@ControllerAdvice, @RestControllerAdvice, @Entity, @SpringBootApplication,
@ConfigurationProperties, @Aspect, @EventListener
→ elles peuvent être instanciées par réflexion/Spring.
- Ignorer aussi les classes implémentant des interfaces Spring
(Filter, HandlerInterceptor, WebMvcConfigurer, etc.)
- Ignorer les DTO/records utilisés dans la sérialisation JSON des contrôleurs
(vérifier les signatures des méthodes @RequestMapping, @PostMapping, etc.)
Méthodologie (étape par étape)
Étape 1 : Inventaire
Liste toutes les classes publiques de src/main/java/** avec leur FQN.
Étape 2 : Analyse des références
Pour CHAQUE classe de src/main, compte les références dans :
src/main/java/** (références "prod")
src/test/java/** (références "test")
Une référence = import, instanciation, héritage, paramètre, type de retour,
annotation, ou utilisation dans du code.
Étape 3 : Classification
Classe chaque élément dans l'une de ces catégories :
[DEAD] → 0 référence prod ET 0 référence test
[TEST_ONLY] → 0 référence prod ET >=1 référence test
[PROD_USED] → >=1 référence prod (à ignorer du rapport)
Applique la même logique au niveau :
- Classes
- Méthodes publiques/package-private (ignorer les privées ici)
- Champs publics/package-private
Étape 4 : Vérifications de sécurité AVANT de proposer une suppression
Pour chaque candidat à la suppression, vérifie :
☐ Aucune utilisation par réflexion (chercher Class.forName,
getMethod, getDeclaredField avec le nom concerné)
☐ Non référencé dans application.yml, application.properties,
bootstrap.yml (pour les @ConfigurationProperties)
☐ Non référencé dans les fichiers XML sous src/main/resources/**
☐ Non exposé dans une API publique (OpenAPI/Swagger)
☐ Pas une classe de type *Exception, *Event, *Dto utilisée dans un
contrat d'API (à signaler même si TEST_ONLY, mais avec un warning)
☐ Pour les mocks spécifiquement : vérifier que ce n'est pas un stub
volontaire (ex : FakeXxxClient, InMemoryXxxRepository) — dans ce
cas, signaler mais ne PAS proposer la suppression sans validation
Étape 5 : Rapport
Produis un fichier dead-code-report.md structuré ainsi :
1. Code mort total [DEAD]
Pour chaque élément :
- FQN complet
- Type (classe / méthode / champ)
- Fichier + ligne
- Raison (ex : "Classe publique jamais importée")
- ⚠️ Risques résiduels (réflexion possible, etc.)
- ✅ Action recommandée : supprimer
2. Utilisé uniquement dans les tests [TEST_ONLY]
Pour chaque élément :
- FQN complet
- Fichiers de test qui l'utilisent
- Analyse :
→ Si c'est un utilitaire de test → déplacer vers src/test/java/**
→ Si c'est du code prod testé "pour tester" → supprimer code prod + tests
→ Si c'est un builder/fixture → déplacer vers un package *.testsupport
dans src/test
3. Zone grise (à faire valider par un humain)
- Classes exposées via API (DTOs, Exceptions) mais non utilisées en prod
- Éléments potentiellement chargés par Spring/réflexion
- Stratégie proposée pour chaque
4. Statistiques
- Nombre total de classes analysées
- Nombre [DEAD] / [TEST_ONLY] / [PROD_USED]
- Lignes de code potentiellement supprimables
Contraintes
- Ne supprime RIEN automatiquement. Produis uniquement le rapport.
- Sois conservateur : en cas de doute, classe en "Zone grise".
- Justifie chaque conclusion avec des chemins de fichiers précis.
- Si tu utilises des outils (grep, ast-grep, IntelliJ inspection,
mvn dependency:analyze), mentionne-les.
Commandes utiles à exécuter
# Références d'une classe (hors elle-même)
grep -rn "NomClasse" src/ --include="*.java" | grep -v "NomClasse.java"
# Références séparées prod vs test
grep -rn "NomClasse" src/main --include="*.java"
grep -rn "NomClasse" src/test --include="*.java"
# Imports inutilisés (via Maven)
mvn compile -Dmaven.compiler.showWarnings=true
# Analyse statique
mvn org.pitest:pitest-maven:mutationCoverage # optionnel
Mission : Détection et nettoyage du code mort dans le microservice
Tu es un agent d'analyse de code Java/Spring Boot. Ta mission est d'identifier
les classes, méthodes et champs qui sont soit :
(A) utilisés UNIQUEMENT dans des classes de test (src/test/**)
(B) jamais utilisés nulle part (dead code total)
Périmètre
src/main/java/**src/test/java/**@Configuration,@Component,@Service,@Repository,@RestController,@Controller,@ControllerAdvice,@RestControllerAdvice,@Entity,@SpringBootApplication,@ConfigurationProperties,@Aspect,@EventListener→ elles peuvent être instanciées par réflexion/Spring.
(
Filter,HandlerInterceptor,WebMvcConfigurer, etc.)(vérifier les signatures des méthodes
@RequestMapping,@PostMapping, etc.)Méthodologie (étape par étape)
Étape 1 : Inventaire
Liste toutes les classes publiques de
src/main/java/**avec leur FQN.Étape 2 : Analyse des références
Pour CHAQUE classe de
src/main, compte les références dans :src/main/java/**(références "prod")src/test/java/**(références "test")Une référence = import, instanciation, héritage, paramètre, type de retour,
annotation, ou utilisation dans du code.
Étape 3 : Classification
Classe chaque élément dans l'une de ces catégories :
[DEAD] → 0 référence prod ET 0 référence test
[TEST_ONLY] → 0 référence prod ET >=1 référence test
[PROD_USED] → >=1 référence prod (à ignorer du rapport)
Applique la même logique au niveau :
Étape 4 : Vérifications de sécurité AVANT de proposer une suppression
Pour chaque candidat à la suppression, vérifie :
☐ Aucune utilisation par réflexion (chercher
Class.forName,getMethod,getDeclaredFieldavec le nom concerné)☐ Non référencé dans
application.yml,application.properties,bootstrap.yml(pour les@ConfigurationProperties)☐ Non référencé dans les fichiers XML sous
src/main/resources/**☐ Non exposé dans une API publique (OpenAPI/Swagger)
☐ Pas une classe de type
*Exception,*Event,*Dtoutilisée dans uncontrat d'API (à signaler même si TEST_ONLY, mais avec un warning)
☐ Pour les mocks spécifiquement : vérifier que ce n'est pas un stub
volontaire (ex :
FakeXxxClient,InMemoryXxxRepository) — dans cecas, signaler mais ne PAS proposer la suppression sans validation
Étape 5 : Rapport
Produis un fichier
dead-code-report.mdstructuré ainsi :1. Code mort total [DEAD]
Pour chaque élément :
2. Utilisé uniquement dans les tests [TEST_ONLY]
Pour chaque élément :
→ Si c'est un utilitaire de test → déplacer vers
src/test/java/**→ Si c'est du code prod testé "pour tester" → supprimer code prod + tests
→ Si c'est un builder/fixture → déplacer vers un package
*.testsupportdans
src/test3. Zone grise (à faire valider par un humain)
4. Statistiques
Contraintes
mvn dependency:analyze), mentionne-les.Commandes utiles à exécuter