Classification automatique du domaine.
Du code source au modèle architectural.
HexaGlue lit votre code Java et attribue un rôle architectural à chaque classe : agrégat, entité, value object, port, service. Sans annotation, sans configuration obligatoire.
Un compilateur d'architecture
Le résultat : une vision complète et fidèle de votre application. Classes, relations entre elles, arborescence des packages, signatures de méthodes, typage des attributs : HexaGlue sait exactement comment votre code est structuré.
Lombok et annotation processors
Aucune configuration n'est nécessaire : la détection et l'adaptation sont automatiques.
Support Lombok automatique
HexaGlue détecte automatiquement Lombok dans les dépendances Maven et injecte un delombok transparent avant l'analyse. Le code analysé est le code expandé : @Data, @Builder, @Getter sont résolus en champs et méthodes réels.
Mode tolerant pour les annotation processors
Les projets utilisant MapStruct, Immutables ou d'autres processeurs d'annotations sont pris en charge grâce au mode tolerant (noClasspath). Le classpath d'analyse inclut automatiquement les classes compilées et les dépendances.
Zéro configuration
Ces fonctionnalités sont activées automatiquement. Pas de modification du pom.xml, pas de paramètre à ajouter. HexaGlue détecte le contexte du projet et s'adapte.
Le delombok s'exécute dans la phase initialize de Maven, avant l'analyse HexaGlue. Les sources générées sont placées dans un répertoire temporaire puis supprimées après l’analyse. Votre code source n’est jamais modifié.
11 rôles architecturaux identifiés automatiquement
| Couche | Rôle | Convention de détection |
|---|---|---|
| Domaine | Aggregate Root | Classe avec un champ d'identité typé (ex: OrderId) |
| Domaine | Entity | Classe membre d'un agrégat, sans identité propre |
| Domaine | Value Object | Record immuable, comportement sans identité |
| Domaine | Identifier | Record wrappant une valeur primitive (ex: OrderId(Long value)) |
| Domaine | Domain Event | Record avec suffixe Event ou interface marqueur |
| Domaine | Domain Service | Classe stateless dans le domaine, logique transverse |
| Ports | Driving Port | Interface dans un package ports/in/ ou api/ |
| Ports | Driven Port | Interface dans un package ports/out/ ou spi/ |
| Application | Application Service | Classe implémentant un driving port |
| Application | Command Handler | Classe traitant une commande spécifique |
| Application | Query Handler | Classe traitant une requête spécifique |
Chaque classification est traçable : HexaGlue enregistre la règle qui a déclenché la décision et le niveau de confiance. Vous pouvez inspecter chaque choix dans le rapport d'audit ou la living documentation.


Trois niveaux de détection
Conventions de nommage et de packages
La position d'une classe dans l'arborescence des packages et ses suffixes orientent la classification. Une interface dans ports/out/ est un driven port. Un record nommé OrderId est un identifiant.
Heuristiques structurelles
La structure interne de la classe affine la détection. Une classe avec un champ d'identité typé est un agrégat. Un record immuable sans identité est un value object. Une interface avec des méthodes save/findById est un repository.
Configuration explicite
Quand les conventions ne suffisent pas, deux options : les annotations jMolecules directement dans le code, ou la surcharge dans hexaglue.yaml pour les réfractaires aux modèles enrichis (voir ci-dessous).
classification: # Exclure les classes utilitaires et de configuration exclude: - "com.acme.shop.config.*" - "com.acme.shop.util.*"
# Surcharger une classification ambiguë explicit: com.acme.shop.domain.TaskService: DOMAIN_SERVICE com.acme.shop.domain.pricing.PricingEngine: DOMAIN_SERVICEQuand le domaine est mis en défaut
HexaGlue s'adapte aux deux situations :
- Domaine riche : les conventions et heuristiques suffisent, aucune annotation nécessaire
- Domaine anémique : les annotations jMoleculeslèvent l'ambiguïté là où la structure manque
Domaine riche
Le code porte sa propre sémantique. HexaGlue le classifie automatiquement.
- Records pour les value objects et identifiants
- Champs d'identité typés (
OrderId) - Logique métier dans les agrégats, fabriques statiques
- Interfaces dans
ports/in/etports/out/
Domaine anémique
Le code manque de signaux structurels. Les annotations jMolecules expriment l'intention architecturale.
- Types primitifs (
Long,String) au lieu de value objects - Getters/setters sans logique métier
- Classes qui se ressemblent toutes structurellement
@AggregateRoot,@Entity,@ValueObjectpour lever l'ambiguïté
Annotations et interfaces jMolecules supportées
| Couche | Annotation | Interface | Rôle attribué |
|---|---|---|---|
| Domaine | @AggregateRoot | AggregateRoot | Aggregate Root |
| Domaine | @Entity | Entity | Entity |
| Domaine | @ValueObject | ValueObject | Value Object |
| Domaine | @Identity | Identifier | Identifier |
| Événements | @DomainEvent | — | Domain Event |
| Événements | @Externalized | — | Externalized Event |
| Ports | @PrimaryPort | PrimaryPort | Driving Port |
| Ports | @SecondaryPort | SecondaryPort | Driven Port |
| Ports | @Repository | — | Repository (Driven) |
jMolecules est une bibliothèque d'annotations purement sémantiques pour le DDD et l'architecture hexagonale. Contrairement à @Entity (JPA) ou @Service (Spring), les annotations jMolecules n'introduisent aucun couplage technique : pas de comportement au runtime, pas de dépendance vers un framework d'infrastructure. Elles expriment une intention architecturale, pas une contrainte technique.
C'est pourquoi les utiliser dans le domaine ne viole pas les principes de l'architecture hexagonale : le domaine reste pur, indépendant de l'infrastructure, et les annotations ne sont consommées qu'au compile-time par des outils comme HexaGlue.
Vous pouvez les adopter progressivement : annotez seulement les classes ambiguës, HexaGlue classifie le reste automatiquement.
Les zones grises de votre architecture
| Catégorie | Signification | Exemple typique |
|---|---|---|
AMBIGUOUS | Critères évalués, pas de match clair | Classe avec des traits de plusieurs rôles |
CONFLICTING | Plusieurs règles en conflit | Entité qui ressemble aussi à un value object |
UTILITY | Classe utilitaire détectée par suffixe | StringUtils, DateHelper |
TECHNICAL | Classe d'infrastructure annotée | @Configuration, @Component |
OUT_OF_SCOPE | Package de test ou mock | com.acme.shop.test.* |
Les classes non classifiées ne sont pas un problème : elles signalent les zones grises de votre architecture. L'audit les comptabilise et propose des pistes de remédiation. Un projet legacy typique démarre avec 30 à 50% de classes non classifiées : c'est normal.
Voyez la classification en action.
50 classes classifiées au build.
Découvrez comment HexaGlue classifie un projet legacy de 50 classes, étape par étape.