Projet complexe de migration de Ant à Maven - comment gérer des structures de dossiers inhabituelles?

dans mon nouveau projet, je suis confronté à une infrastructure complexe avec plusieurs modules qui se sont développés au fil des ans d'une manière déplaisante et incontrôlée.

pour en venir au fait: le processus de construction est l'horreur. Il existe plus de 40 fichiers Ant différents et complexes, qui sont connectés plusieurs fois et le cadre SOA génère également plusieurs fichiers Ant dynamiques. Il a fallu quelques jours pour vraiment comprendre toutes les dépendances et à construire, finalement, l'ensemble du projet, sans erreur.

Mon plan était de migrer l'ensemble du projet de Fourmi à Maven, depuis les nouveaux composants sont prévues et je voudrais éviter ces problèmes à l'avenir et le bien, parce que c'est juste horrible la façon dont elle est maintenant ;-)

depuis que je suis nouveau dans la migration de projets plus importants, je suis un peu confus au sujet du meilleur flux de travail. Il y a des dizaines de fichiers XML et de scripts impliqués, qui sont distribués dans une structure de répertoire non Maven. Dans l'ensemble, il ya plus de 3000 les fichiers concernés. Un des principaux problèmes est que je ne sais pas si je devrais vraiment essayer de migrer tout dans la structure de répertoire connue Maven et donc risquer l'édition sans fin et le remaniement de chaque fichier. Ou devrais-je garder la structure du dossier telle qu'elle est et gonfler mon pom.des fichiers xml et éventuellement rencontrer des problèmes avec tous les différents impliqués plugins? Honnêtement, les deux ne semblent pas très constructives.

est-il même logique de migrer un projet dans cette dimension à Maven? En particulier lorsque le cadre SOA doit utiliser ses propres fichiers Ant - par conséquent, une combinaison de Ant et Maven serait nécessaire. Quelle serait la meilleure stratégie pour simplifier ce processus?

Merci pour toutes les suggestions.

29
demandé sur martieva 2013-06-21 18:24:06

2 réponses

Voici une réponse simple et rapide à Mavenizing an Ant project:

NE LE FAITES PAS!

il ne s'agit pas d'une chape anti-Maven. J'utilise Maven, et j'aime bien Maven. Il oblige les développeurs à ne pas faire de bêtises. Les développeurs ne savent pas écrire des scripts de construction. Ils veulent faire les choses comme ça et pas comme tout le monde le fait. Maven fait les développeurs configurer leurs projets d'une manière que tout le monde peut comprendre.

le le problème est que Ant permet aux développeurs de faire des choses folles et folles que vous avez à refaire complètement dans Maven. C'est plus que la structure du répertoire. Ant permet la construction de plusieurs artefacts. Maven ne permet qu'un per pom.xml1. Et si votre projet de fourmi produit une demi-douzaine de fichiers jar différents -- et que ces fichiers jar contiennent beaucoup des mêmes classes? Vous aurez nef à créer une demi-douzaine de projets Maven juste pour les pots, puis une autre demi-douzaine pour les fichiers qui sont en commun entre les pots.

je le sais parce que c'est exactement ce que j'ai fait. Le chef de L'Architecture de système a décidé que Maven est nouveau et bon tandis que Ant doit être mauvais et mauvais. Peu importe que les bâtisses aient fonctionné et qu'elles aient été bien structurées. Non, Ant doit partir, et Maven est le chemin.

les développeurs ne voulaient pas faire cela, donc c'est tombé sur moi, le CM. J'ai passé six mois à tout réécrire en Maven. Nous avions le monde, nous avions hiberné, nous Avions divers cadres, et d'une certaine façon, j'avais pour restructurer tout pour que ça marche à Maven. J'ai eu de frayer de nouveaux projets. J'ai dû déplacer des répertoires. J'ai dû trouver de nouvelles façons de faire les choses, le tout sans s'arrêter aux développeurs de faire des quantités massives de développement.

C'était le cercle intérieur de L'enfer.

une des raisons pour lesquelles vos projets Ant sont si complexes est probablement liée à la gestion des dépendances. Si vous êtes comme notre boutique actuelle, un développeur a décidé de hack ensembledévelopper leur propre système de gestion des dépendances. Après avoir vu ce système de gestion des dépendances, je sais maintenant deux choses que les développeurs ne devraient jamais écrire: leurs propres fichiers de compilation et les systèmes de gestion des dépendances.

heureusement, il existe déjà un système de gestion des dépendances pour Ant appelé Ivy. Ce qui est bien avec Ivy, c'est qu'elle fonctionne avec l'architecture Maven actuelle. Vous pouvez utiliser le Maven centralisé de votre site le dépôt, et Ivy peut déployer des pots dans ce dépôt sous forme d'artéfacts Maven.

j'ai créé un projet Ivy qui configure automatiquement tout pour les développeurs. Il contenait la configuration et la configuration nécessaires, ainsi que quelques macros qui pouvaient remplacer quelques tâches Ant standard. J'ai utilisé svn:externals rattacher ce projet Ivy au projet principal.

ajouter le projet dans le système de construction actuel n'était pas trop difficile:

  • j'ai dû ajouter un peu de les lignes dans le build.xml à intégrer ivy.dir projet dans le projet actuel.
  • j'ai dû définir un ivy.xml fichier pour ce projet.
  • j'ai changé toute instance de <jar et </jar><jar.macro et </jar.macro>. Cette macro a fait tout le standard <jar/> tâche a fait, mais il a également intégré le pom.xml dans le bocal comme le font les constructions Maven. (Ivy a une tâche pour convertir le ivy.xml fichier pom.xml).
  • j'ai arraché toute la vieille dépendance des conneries de gestion que l'autre développeur a ajouté. Cela pourrait réduire un build.xml le fichier par une centaine de lignes. J'ai aussi arraché tous les trucs qui ont fait des checkouts et des commits, ou des trucs ftp ou scp. Tout ça était pour leur système de construction Jenkins, mais Jenkins peut gérer ça sans l'aide des fichiers de construction, merci.
  • ajouter quelques lignes pour intégrer Ivy. La façon la plus simple était de supprimer les pots dans le lib répertoire, et puis il suffit de les télécharger via ivy.xml. Tout ensemble, cela peut prendre une dizaine de lignes de code à ajouter ou à modifier dans le build.xml pour ce faire.

j'en suis arrivé au point où je pouvais intégrer Ivy dans un projet en quelques heures -- si le processus de construction lui-même n'était pas trop perturbé. Si j'avais à réécrire le construire.xml à partir de zéro, il pourrait me prendre deux ou trois jours.

en utilisant Ivy nettoyé notre processus de construction de fourmis et nous a permis beaucoup des avantages que nous aurions dans Maven sans avoir à prendre un complet restructuration.

Par le moyen, l'outil le plus utile pour ce processus est Au-Delà De Comparer. Cela m'a permis de vérifier rapidement que le nouveau processus de construction a été compatible avec l'ancienne.


on passe à Maven de toute façon...

ce qui est drôle, c'est qu'une fois que vous avez intégré vos projets de fourmi avec Ivy, les transformer en projets de Maven n'est pas si difficile:

  • Nettoyer la logique dans votre build.xml. Vous il faudra peut-être le réécrire à partir de zéro, mais sans la plupart des déchets de la gestion des dépendances, ce n'est pas si difficile.
  • une fois le build.xml est nettoyé, commencez à déplacer les répertoires jusqu'à ce qu'ils correspondent à la structure de Maven.
  • modifier la source pour qu'elle corresponde à la nouvelle structure du répertoire. Vous pouvez avoir une guerre qui contient des fichiers *css dans un emplacement non standard, et le code est câblé pour attendre ces fichiers dans ce répertoire. Vous devrez peut-être modifier votre code Java pour correspondre la nouvelle structure de répertoire.
  • divisez les projets de fourmi qui construisent plusieurs projets en projets de fourmi distincts qui construisent chacun un seul artefact.
  • Ajouter un pom.xml et supprimer le build.xml.

1 Oui, je sais que ce n'est pas tout à fait vrai. Il y a des projets Maven avec des sous-projets et super poms. Mais, vous n'aurez jamais un projet Maven qui construit quatre jarres différentes sans rapport alors que c'est assez courant à Ant.

53
répondu David W. 2013-06-21 16:00:42

j'ai fait une migration similaire dans le passé, et j'avais les mêmes doutes que vous aviez; cependant, j'ai choisi la méthode "garder la structure du dossier intacte et spécifier les chemins dans les fichiers POM" et j'ai remarqué que ce n'était pas aussi mauvais que je le pensais.

ce que j'avais à faire en fait, c'était de régler le <sourceDirectory> et <outputDirectory> et peut-être ajouter des filtres d'inclusion et d'exclusion, mais à la fin je dirais que même si la façon de Maven est vraiment convention-over-configuration-ish et fait votre vie plus facile si vous suivez ses directives sur l'endroit où placer les fichiers, il ne fait pas vraiment beaucoup plus difficile si vous ne le faites pas.

en outre, quelque chose qui m'a vraiment aidé lors de la migration était la possibilité de diviser le projet Maven en modules, que j'ai d'abord utilisé pour répliquer la structure de fourmi (i.e. j'ai eu un module Maven pour chaque construction.xml file) rendant la première étape de la migration plus simple, et puis j'ai changé l'agrégation du module pour le rendre plus significatif et plus De type Maven.

Je ne suis pas sûr que cela ait vraiment un sens pour vous, puisque je n'ai pas eu de fichiers Ant générés que je recon puisse être le plus grand problème pour vous, mais je serais certainement suivre cette route à nouveau au lieu de refactoring et de déplacer des fichiers partout pour Mavenize ma structure de projet.

8
répondu Raibaz 2013-06-21 14:34:34