26 janvier 2009

Développement : visualiser les dépendances entre projets Maven

Mon projet global est constitué d'une bonne centaine de projets Maven. Cette structure est assez pratique pour l'intégration continue (voir le tableau de bord Continuum 1.0.3) et pour vérifier que tout fonctionne sur différentes plates-formes, pratique pour les releases, pratique pour construire morceau par morceau et intégrer de même. Par exemple on peut segmenter la difficulté d'intégrer des Web Services en isolant les responsabilités suivantes dans des projets différents :
  • logique applicative,
  • liens avec la base de données,
  • interopérabilité,
  • distribution,
  • sécurité.
Cependant au fil des développements les projets évoluent, et les liens entre eux. On se retrouve avec une sorte de plat de spaghettis dont il nous manque une vue d'ensemble. Pour cela je n'ai pas trouvé mon bonheur dans des outils comme le Maven Dependency Plugin, plugin certes très utile, mais cantonné à des analyses projet par projet.

À défaut d'avoir trouvé un outil qui réponde exactement à mon besoin, j'en ai développé un moi-même. Ce n'est certes pas mon métier de faire ça, je ne vais donc pas aller plus loin pour cet outil que la bête réponse, non intrusive, au besoin initial.

C'est un programme qui scanne les fichiers pom.xml de mon espace de travail, et produit un diagramme UML.

Dépendances entre mes projets Maven.

Pour les détails :
  • le programme est en Java (le scan et la concaténation étaient au départ une tâche Ant),
  • le diagramme UML final est un fichier XML au format du logiciel StarUML,
  • le temps d'exécution (scan, analyse, génération) est de 10 secondes pour 113 projets.
Quelques différences de principe avec le Maven Dependency Plugin :
  • je m'appuie sur les sources des fichiers POM, et non sur les artifacts déjà installés dans le repository local - je peux donc aussi analyser les POMs de projets qui sont en erreur,
  • l'analyse porte sur l'espace de travail complet,
  • le rendu est graphique.
Je traduis ainsi en UML les liens entre projets Maven :
  • <parent> : héritage UML
  • <dependency> : association UML
  • <module> : agrégation UML
  • <plugin> : dépendance UML
Certes, le diagramme UML produit par défaut est illisible parce que surchargé. L'intérêt d'avoir un résultat lisible par un logiciel tiers, StarUML en l'occurrence, est qu'on peut ensuite y déplacer à la main des éléments et en supprimer, afin d'en extraire des sous-diagrammes orientés par domaine.

Voici par exemple un extrait du diagramme ci-dessus, limité à une vingtaine de projets, pour une couche applicative sur laquelle je bosse en ce moment.


Ce genre de petite documentation extraite des fichiers sources est bien utile. La cohérence est importante entre la documentation et le développement.

Pour en revenir à Maven, cette vue permet entre autres de visualiser les dépendances inutiles (quand A dépend de B qui depend de C, A ne devrait pas avoir à déclarer qu'il dépend de C), ou les incohérences entre les versions des bibliothèques.

Si quelqu'un connaît des outils plus évolués pour faire la même chose je suis preneur...

9 commentaires:

fred a dit…
Ce commentaire a été supprimé par l'auteur.
fred a dit…

Ça m'intéresse, puis-je avoir le programme ?

David Andriana a dit…

OK fred je regarde ce que je peux faire simplement.

fred a dit…

J'ai bien hâte de voir David ce que ton programme va donner sur mes projets ! Comment veux-tu me le transmettre ? @+

David Andriana a dit…

Alors justement sur tes projets, une question : combien as-tu de projets Maven à scanner ? Tes retours sur l'utilisation de l'outil m'intéresseront.

Pour te le transmettre, je suis en train de passer les sources sur mon repository Subversion public, puis je ferai une release du JAR sur un repository Maven que j'héberge et que je viens de rendre public : http://snurl.com/ayi6o (vide pour l'instant)

David Andriana a dit…

Voilà fred c'est bon, c'est dans le blog.

fred a dit…

J'ai un petit ennui, le port est bloqué par notre proxy. Bon, ça se contourne (e.g. http://www.boomproxy.com/)... Autre chose, comment l'utiliser ? Y a-t-il une classe de test ou une méthode main() ? Il y a plusieurs jars... Donne-moi un petit aperçu stp. @+ fred

fred a dit…

Oups, tout semble sur le blog ! Désolé, j'avais enregistré l'adresse de l'article et je n'étais plus allé sur la page principale :-)

David Andriana a dit…

Bonne remarque, le coup du port bloqué. Du coup j'ai ouvert l'accès également sur le port 80 et modifié les articles du blog dans ce sens.