Bonjour à toutes et à tous.

Je travaille sur un gros projet international qui utilise Maven.
Pour mon malheur je travaille de manière "transversale" (j'interviens sur tous les codes) et je ne connais rien à Maven.
C'est l'enfer: je passe un tiers de mon temps à essayer de régler des problèmes de dépendances. Mon IDE préféré (IntelliJ) se plante glorieusement dès qu'il y a des anomalies et Netbeans (qui se reporte complètement sur Maven) me reserve parfois des surprises. Genre de gag: vous débuggez un programme et le debuggger vous donne les sources de la version 1.2-SNAPSHOT mais utilise le binaire 1.1, etc...!

J'ai des tonnes de problèmes mais dans ce message je vais commencer par le problème des versions (releases).

Soit un module "utilitaires" dans lequel sont définies les méthodes f() et g(). J'ai deux autres modules qui dépendent de lui: "noyau" (qui utilise f()) et "app" qui utilise g(). Sauf que .... "app" dépend aussi de "noyau"!

Situation de départ:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
APP-1.0-SNAPSHOT -> NOYAU-1.0-SNAPSHOT -> UTILITAIRES-1.0-SNAPSHOT
 
APP-1.0-SNAPSHOT -> UTILITAIRES-1.0-SNAPSHOT
Les questions:
- faut'il faire deux dépendances vers "utilitaires" ou une dépendance transitive (app->noyau->utilitaires)? D'un point de vue fonctionnel ce serait deux dépendances (mais alors bonjour les dégats lors de l'évolution des releases)
- comment faire évoluer les releases?

Exemple: on veut faire la release de "noyau". Donc il faut faire la release de utilitaires. En fin d'opération on aura
NOYAU-1.1-SNAPSHOT--> UTILITAIRES-1.1

Maintenant je fais évoluer le code de utilitaires (donc celui de UTILITAIRES-1.1-SNAPSHOT)

Première hypothèse: je fais évoluer g() et cette modification intéresse APP.
- si j'ai deux dépendances j'ai une anomalie : APP dépend du code de UTILITAIRES-1.1-SNAPSHOT et de UTILITAIRES-1.1 (en passant par NOYAU). En pratique
cette anomalie n'est pas hyper-grave car NOYAU n'utilise pas la nouvelle version de g()
- si j'ai une dépendances transitive je suis obligé de forcer NOYAU-1.1-SNAPSHOT à dépendre de UTILITAIRES-1.1-SNAPSHOT. et là on se demande pourquoi on fait une release!

deuxième hypothèse: je fais évoluer une méthode h() qui concerne APP et NOYAU:
- je peux pas faire évoluer APP indépendamment de NOYAU...

Si je comprends bien les utilitaires Maven ont une règle: quand on fait une release d'un module tous les modules en aval (ceux dont dépend le module courant) doivent être releaser (oops pardon pour l'anglicisme).

Mais en pratique je me demande s'il ne faut pas rajouter ceci: quand on modifie une version releasée alors tous les modules en amont (ceux qui dépendent du module courant) doivent d'abord évoluer au niveau des dépendances.... Mais alors à quoi servent les releases?

Si vous ne me croyez pas essayez de faire joujou avec les évolutions de ce schéma (hyper-courant dans mon appli):

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
 CODE_GENERALISTE -> MODULE_A -> UTILITAIRES
 
 
 CODE_GENERALISTE -> MODULE_B -> UTILITAIRES
j'en pleure!