2010-09-07 8 views
6

Mon projet est composé de 5 sous-projets. L'un est une guerre, et les 4 autres sont des pots. Fondamentalement, le projet de guerre a besoin de tous les 4 projets de jar et de leurs dépendances. Je peux supprimer les dépendances pour avoir quelque chose comme war-> A-> B-> C-> D. Chaque sous-projet ajoute sa part de dépendances externes (spring, struts, hibernate) pour qu'à la fin la guerre obtienne tout ce qu'il faut pour fonctionner.Comment gérer les dépendances de sous-projets dans Maven

Cela semble assez bien organisé et carré, mais alors je me demande si c'est très pratique pour faire des changements. Imaginez que je doive changer une ligne de code dans le projet D, sans rien changer à ses dépendances Maven. Je devrais rééditer le projet D évidemment, mais ensuite je dois relancer les projets C, B, A et la guerre juste pour refléter ce changement dans leurs fichiers pom. Cela peut être long et gênant, surtout si vous devez rapidement sortir une nouvelle version pour réparer quelque chose en production.

Je pourrais faire en sorte que la guerre dépende de tous les 4 projets, alors je dois juste changer le numéro de version du projet D dans le fichier war pom. Mais j'ai alors le projet A qui dépend indirectement du projet D 1.0 et du projet de spécification de guerre D 1.1. Je pense que la dépendance directe de la guerre l'emporterait dans ce cas, n'est-ce pas? Cela rendrait la nouvelle version de la guerre plus rapide, mais elle gâcherait également mes dépendances de sous-projets, car elles seraient obsolètes.

Quelle serait une façon acceptable de gérer cette situation?

Répondre

3

Il n'y a pas de réponse simple à votre problème.

Si vous avez en effet une chaîne de dépendances transitives (A-> B-> C-> D), relâcher indépendamment chaque module de la chaîne n'est pas une mauvaise option. Il est fort probable que vos dépendances imbriquées soient de simples lib lib et que vous ne verriez pas les changements trop souvent, espérons que vous ne serez pas obligé de passer par ce processus fréquemment, comme si log4j était mis à jour et que tous vos modu les fichiers devaient également être mis à jour.

Une autre chose à considérer est les dépendances de votre WAR. Oui, Maven tire automatiquement les dépendances pour vous, mais il est souvent recommandé de déclarer explicitement vos dépendances connues afin de pouvoir spécifier vous-même un numéro de version pour chaque module. Cela signifierait que A dépend directement de D et des autres. Malheureusement, si vous avez des numéros de version conflictuels, comme vous l'avez décrit, vous recherchez des problèmes sur votre chemin de classe. Si vous avez vraiment besoin de le faire si, Maven ne vous permet d'exclure les dépendances transitif explicitement:

<project> 
    ... 
    <dependencies> 
    <dependency> 
     <groupId>my.project</groupId> 
     <artifactId>module-B</artifactId> 
     <version>1.0</version> 
     <exclusions> 
     <exclusion> 
      <groupId>my.project</groupId> 
      <artifactId>module-C</artifactId> 
     </exclusion> 
     <exclusion> 
      <groupId>my.project</groupId> 
      <artifactId>module-D</artifactId> 
     </exclusion> 
     </exclusions> 
    </dependency> 
    <dependency> 
     <groupId>my.project</groupId> 
     <artifactId>module-C</artifactId> 
     <version>1.0</version> 
     <exclusions> 
     <exclusion> 
      <groupId>my.project</groupId> 
      <artifactId>module-D</artifactId> 
     </exclusion> 
     </exclusions> 
    </dependency> 
    <dependency> 
     <groupId>my.project</groupId> 
     <artifactId>module-D</artifactId> 
     <version>1.0</version> 
    </dependency> 
    </dependencies> 
    ... 
</project> 

Voici le documentation décrivant ces dépendances optionnelles et exclusions.

Avez-vous réellement besoin de libérer B, C et D indépendamment? Si ce n'est pas le cas, pensez à utiliser un fichier pom.xml Aggregator à la racine de vos modules. Cela vous permettra d'utiliser des versions de SNAPSHOT dans vos modules, puis de relâcher le paquet en une fois.C'est ainsi que notre équipe gère notre projet multi-module. L'utilisation de dépendances SNAPSHOT vous permet d'utiliser la version qui a été créée lorsque ces artefacts sont nécessaires.

+0

Salut Gweebz. Merci pour la réponse détaillée. Je n'ai pas besoin d'avoir chaque sous-projet publié individuellement, donc je vais donner un bon aperçu de ce concept d'agrégateur que je ne connaissais pas. Les modules contiennent tous les codes de gestion et de données et sont susceptibles de changer régulièrement. Une autre solution serait d'exclure les dépendances transitives comme vous l'avez dit, je n'y ai pas pensé. Merci pour la lumière à ce sujet. – IceGras

+0

Sans obligation de libérer chaque module indépendamment, je suggère fortement d'utiliser la solution Aggregator. C'est le modèle qui convient parfaitement à votre scénario. Heureux d'avoir pu aider :) –

1

Est-ce que vous libérez réellement l'un des projets A à D indépendamment, sans le WAR? Sinon, je ne vois aucun problème avec votre configuration actuelle. Vous devez absolument utiliser la même version de n'importe quel module tout au long du projet. Sinon, vous ouvrez la porte à l'enfer classLoader - croyez-moi, vous ne voulez pas arriver :-(

Pour les versions plus facile, le maven-release-plugin peut vous aider à

+0

Bonjour Péter. Les projets A à D sont spécifiques au WAR, mais je dois les libérer individuellement pour que les autres développeurs puissent construire le WAR et que le plugin Maven libère les dépendances. Peut-être que ces versions ne sont pas nécessaires? – IceGras

+0

@IceGras, en augmentant le numéro de version chaque fois que vous effectuez un changement peut être vraiment exagéré. Dans notre projet, nous sommes satisfaits des versions de SNAPSHOT pendant le développement, et nous créons une nouvelle version concrète uniquement pour les versions officielles (candidates). –

+0

Travailler avec des snapshots pendant le temps de développement semble la meilleure solution en effet, mais j'ai cette question: Si vous libérez RC1 avec tous les modules dans la version 1.0, et vous avez juste besoin de changer le module C. version pour rien alors? Ma principale préoccupation concerne également le changement de production. Si ma version doit être changée, je devrai augmenter le nombre de versions pour refléter transitivement le changement. – IceGras

1

La meilleure réponse ces jours-ci est maintenant utiliser gradle qui est le meilleur de fourmi et de maven. Je n'ai jamais vraiment aimé maven mais gradle a pris beaucoup de concepts communs mais l'a fait plus comme fourmi en ce sens qu'il est flexible de sorte qu'il n'y a pas de réponse facile à votre question en graduelle;).

Questions connexes