comment déplacer des projets multi-modules vers maven

Nous essayons de déplacer plusieurs applications multi-modules vers maven et avons quelques problèmes.

Chaque module est stocké indépendamment dans cvs. Nous avons des fichiers de manifeste pour chaque application, qui répertorient les modules requirejs pour cette application (et éventuellement la version). Tous les modules ne sont pas en version maven.

Donc, l’application ‘customer_care’ a le manifeste suivant:

    

De même, l’application ‘core batch’ a un manifeste comme celui-ci:

       

J’ai commencé à «mavenising» notre code, donc le projet MY_api a un pom.xml avec des dépendances définies, y compris une sur un autre module de code interne, ‘central_config’. J’ai spécifié la version RELEASE.

Le problème

Tout cela fonctionne bien jusqu’à ce que je crée un manifeste figé. Je peux spécifier une version pour chaque module:

       

MAIS cette construction n’est pas reproductible, car la version de la dépendance ‘centralconfig’ dans MY_api est ‘RELEASE’. Donc, si quelqu’un publie une nouvelle version de ‘centralconfig’, alors la prochaine fois que nous construirons ce manifeste figé, il sera différent.

Alors, pourquoi n’utilisons-nous pas des versions codées en dur de dépendances telles que central-config? Parce qu’alors, nous devrions peut-être mettre à jour 10 ou 20 fichiers pom chaque fois que quelqu’un met à jour centralconfig vers une nouvelle version. Tout ce qui dépend de la configuration centrale, et tout ce qui en dépend, nécessiterait la mise à jour de son fichier pom.xml et sa nouvelle publication. Non seulement cela représente beaucoup de travail, mais je ne sais pas comment je pourrais identifier par programmation et de manière fiable chaque module qui déclare une dépendance à la configuration centrale.

Une solution possible?

Pourrais-je définir «version centrale» à un endroit, puis le référencer dans tous mes modules? Si oui, où devrais-je faire cela? Je ne connais pas grand-chose aux parents poms, mais j’ai le sentiment qu’ils pourraient apporter une solution.

Mettre à jour

Il semble que l’utilisation d’un pom parent est la voie à suivre. Mais selon cette question: les projets Maven peuvent-ils avoir plusieurs parents? , il n’est pas possible pour un projet maven child d’avoir plusieurs parents.

Dans ce cas, comment le module MY_api peut-il être un enfant de custcare_webapp et de core_batch?

Mettre à jour

J’ai conclu que Maven ne répondait pas à mes exigences et nous avons recommencé à utiliser notre solution maison développée depuis 12 ans à l’aide de ant et de CVS.

Une autre option qui est souvent préférable à une structure parente pour gérer les versions consiste à importer des dépendances.

Pour illustrer comment cela fonctionne, vous créez un projet qui ne contient qu’un pom spécifiant les versions à utiliser pour tous vos modules:

  4.0.0 test module-versions pom 1.0    test a 1.1   foo bar 2     

Ensuite, dans tous vos projets nécessitant des dépendances, vous devez importer des versions codées en dur pour ce projet de la manière suivante:

     test module-versions 1.0 pom import    

De cette façon, il vous suffit de modifier le projet de module-versions chaque fois que vous publiez une nouvelle version de tout ce dont vous dépendez.

De cette façon, vous pouvez avoir plusieurs projets “versions de modules” pour diviser un peu les choses.

Bien sûr, vous rencontrez toujours le problème suivant: tous les projets qui souhaitent utiliser la nouvelle version doivent également être publiés à leur tour, mais c’est le coût d’utilisation des dépendances publiées dans Maven.

Je pense que vous avez besoin d’un parent POM. Il s’agit d’un pom.xml niveau pom.xml qui est uniquement un module POM et n’a pas de code associé. Vous construisez l’intégralité du projet en exécutant la commande mvn sur ce pom.xml .

Le POM doit être dans le répertoire au-dessus de tous les répertoires du module. Autrement dit, chacun de vos modules sera dans un sous-répertoire du répertoire qui contient le maître pom.xml

Le type ce POM sera pom . Cela signifie que c’est un projet uniquement POM sans code propre. Il aura également une contenant un élément pour chacun de vos modules. Ainsi, lorsque vous exécuterez la commande mvn , Maven saura également construire chacun de ces modules. Un échantillon décent de parent POM est ici .

Définissez toutes vos dépendances dans ce POM à l’aide de la standard . Les modules POM en hériteront. ( Mise à jour : voir les commentaires ci-dessous, vaut certainement la peine d’explorer la pour le POM parent).

Enfin, chacun de vos POM de module devrait renvoyer au POM maître. Ainsi, si vous exécutez mvn dans l’un des répertoires du module (c’est-à-dire que vous ne construisez qu’un module), le parent trouvera des dépendances. Vous faites cela avec une , qui contiendra les et du POM maître. Voici un bon exemple de , ainsi qu’une bonne parsing globale de projets multi-modules.