Meilleure façon de structurer un référentiel Git pour Maven

19

J'ai besoin de quelques conseils pour structurer nos projets dans Git. Nous utilisons Java et Maven est notre outil de construction. Maven suppose un peu que tous vos projets ont finalement un ancêtre commun. Maven peut également être une véritable reine du drame lorsque les choses ne sont pas configurées exactement comme la fondation Apache configure ses projets (toute personne utilisant le plugin de publication sait probablement de quoi je parle).

Nous voulons un pom parent de haut niveau qui contrôle les versions des plugins et la configuration de la construction (configuration du référentiel, quels artefacts à construire, conventions de dénomination, versions des plugins, etc.). Maven voudrait que tous nos projets informatiques soient dans les sous-dossiers de ce projet principal. Cela implique un repo Git massif pour l'organisation.

Cela créera un environnement très bruyant. S'il y a deux équipes travaillant sur des projets non liés, elles devront constamment retirer les fusions de l'autre équipe. Idéalement, j'aimerais avoir un dépôt par projet.

Mais ce genre de conflit avec le modèle extrêmement hiérarchique de Maven, qui exige que les sous-projets soient des sous-dossiers.

J'ai besoin de conseils sur la façon dont les gens ont concilié ces deux modèles ... merci!

Jonathan S. Fisher
la source

Réponses:

19

Vous avez 2 options:
1. par git way: utilisez des sous-modules. Voici une documentation sur la gestion des sous-modules par git . Personnellement, je ne l'ai pas utilisé, mais cela semble correspondre à votre problème.
2. par voie maven: dans maven il n'est pas obligatoire que votre projet racine (configuration) soit hiérarchiquement le répertoire parent de tous vos projets. Vous pouvez avoir une structure comme ça:

configuration
 +-- pom.xml (configuration:XXX)
project1
 +-- pom.xml (project1:1.0-SNAPSHOT)
 !
 +-- module11 
 !     +-- pom.xml (1.0-SNAPSHOT)
 +-- module12
       +-- pom.xml (1.0-SNAPSHOT)
project2
 +-- pom.xml (project2:2.0-SNAPSHOT)
 !
 +-- module21 
 !     +-- pom.xml (2.0-SNAPSHOT)
 +-- module22
       +-- pom.xml (2.0-SNAPSHOT)

configuration, project1 et project2 sont au même niveau de répertoire et chacun pourrait être un référentiel git. Lorsque vous générez projet1 ou projet2, vous exécutez la commande maven à partir du niveau projet1 ou projet2 et maven essaiera de récupérer le parent (configuration) du référentiel maven et non du répertoire parent. Vous devez faire attention aux versions. Je recommanderais dans project1 ou project2 de conserver une référence à un parent (configuration) avec une version finale. Pour créer une version, vous devez le faire en 2 étapes: libérer la configuration en premier et libérer le projet en second. Project1 et project2 peuvent évoluer indépendamment et n'ont pas besoin d'avoir la même version de configuration qu'un parent.

Juste pour des cas particuliers lorsque vous souhaitez avoir à la fois la configuration et les projets en tant que versions d'instantané, dans project1 ou project2, vous pouvez utiliser la <relativePath>balise inside <parent>tag pour pointer vers votre chemin de configuration local. Je ne le recommande pas car cela créera des problèmes sur l'environnement de développement (au moins pour moi dans Eclipse)

Je m'excuse pour mon anglais.

catta
la source
3

Maven voudrait que tous nos projets informatiques soient dans les sous-dossiers de ce projet principal

Non, Maven veut simplement pouvoir récupérer les artefacts dont il a besoin. La meilleure façon de procéder consiste à utiliser un référentiel d'artefacts, tel que Nexus ou Artifactory . Chaque projet peut avoir son propre référentiel Git.

Nous voulons un pom parent de haut niveau qui contrôle les versions des plugins et la configuration de la construction (configuration du référentiel, quels artefacts à construire , conventions de dénomination, versions des plugins, etc.

Voilà votre vrai problème. Il est logique d'utiliser un POM parent pour appliquer la configuration, mais il n'y a aucune raison de combiner la configuration avec le contrôle de génération. En fait, sauf pour un projet autonome à plusieurs modules, je dirais que c'est une très mauvaise idée, pour les seules raisons que vous énoncez (plus le fait que vous auriez à construire tous vos projets, tous le temps).

parsifal
la source
Je connais intimement le fonctionnement de maven. Et non, je ne veux pas que mes équipes construisent l'intégralité de la base de code. En règle générale, vous sélectionnez un petit nombre de projets et les retirez du contrôle des sources. Nous avons un serveur Nexus pour héberger les artefacts finis, il n'y a donc aucune raison de construire la base de code entière. Et une fois que votre organisation a une certaine taille, le fonctionnement sur une infrastructure partagée permet d'économiser de l'argent. Avoir une configuration centrale pour le faire est le seul moyen de s'assurer que cela fonctionne, à chaque fois.
Jonathan S. Fisher
Cher @parsifal, veuillez jeter un coup d'œil à ma question sur la création d'une application multicouche java stackoverflow.com/questions/49562268/…
Hosein Aqajani