web-dev-qa-db-fra.com

Publication d'un projet multi-module Maven avec Git

J'essaie de publier un projet Maven multi-modules qui utilise git en tant que SCM, et l'un des premiers problèmes que j'ai rencontrés concerne la manière dont le plug-in de publication Maven construit le fichier release.properties scm.url. Mon parent POM ressemble à ceci:

<packaging>pom</packaging>
<groupId>org.project</groupId>
<artifactId>project-parent</artifactId>
<version>1.0.0-SNAPSHOT</version>

<scm>
    <connection>scm:git:git://github.com/username/project.git</connection>
    <developerConnection>scm:git:[email protected]:username/project.git</developerConnection>
    <url>http://github.com/username/project</url>
</scm>

<modules>
    <module>api</module>
    <module>spi</module>
</modules>

Et les modules POM sont simples:

<parent>
    <groupId>org.project</groupId>
    <artifactId>project-parent</artifactId>
    <version>1.0.0-SNAPSHOT</version>
</parent>
<artifactId>api</artifactId>
<version>0.2.2</version>

Mon objectif est de pouvoir publier des modules individuels, car ils ont des versions différentes et que je ne souhaite pas incrémenter toutes les versions ensemble à chaque fois que je publie une version.

Lorsque je passe dans le répertoire api et que je fais un mvn release:clean release:prepare, je rencontre le résultat suivant:

[INFO] Executing: cmd.exe /X /C "git Push [email protected]:username/project.git/api master:master"
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Unable to commit files
Provider message:
The git-Push command failed.
Command output:
ERROR: Repository not found.

Il semble que le plugin maven release ait créé le fichier scm.url en ajoutant le nom du module à la variable developerConnection, ce qui n’est finalement pas un référentiel valide sur github. Je ne suis pas sûr de la bonne façon de mettre cela en place. Il se peut que Maven + git + libérant un module enfant individuel ne fonctionne tout simplement pas? Toute entrée est appréciée.

29
Josh Stone

Pour voir comment cela fonctionne, regardez un exemple de travail, tel que:

https://github.com/sonatype/sonatype-aether

Cependant, cela ne vous aidera pas si vous souhaitez libérer les morceaux individuels. Dans ce cas, il suffit de copier les éléments <scm> dans tous les poms.

C’est un sujet de discussion actif sur la liste de développeurs Maven, mais ne retenez pas votre souffle pour une solution à partir de là; c'est une grosse affaire.

14
bmargulies

J'ai trouvé cette question avec une recherche sur "échec de la commande git-Push". J'ai une configuration similaire où j'ai un maître-pom, puis des sous-modules que je publie comme leurs propres paquets maven.

Pour que cela fonctionne, je devais accorder la section scm du pom.xml à quelque chose comme ce qui suit. Les connexions devaient être spécifiquement réglées pour fonctionner correctement. Aucun de ceux de github n'a fonctionné du tout.

<scm>
    <url>https://github.com/XXX/YYY</url>
    <connection>scm:git:ssh://[email protected]/XXX/YYY.git</connection>
    <developerConnection>scm:git:ssh://[email protected]/XXX/YYY.git</developerConnection>
</scm>

La XXX dans l'exemple ci-dessus est votre nom d'utilisateur github. Vous ne pouvez pas utiliser le format :XXX ([email protected]:XXX/...) car la valeur après le : est interprétée comme un numéro de port. YYY est évidemment votre nom de référentiel sous le compte XXX.

Je viens de publier les 3 sous-modules un par un en utilisant ce modèle avec succès.

12
Gray

Pour tous ceux qui abordent cette question à la recherche d'une bonne solution comme celle que j'ai faite, voici ce que j'ai trouvé qui fonctionne pour moi:

http://blog.avisi.nl/2012/02/15/maven-release-plugin-setup-guide-for-git/

Vous devez toujours "baliser" le tronc entier car c'est comme ça que git fonctionne, mais cela vous permet uniquement de construire/version/déployer le sous-module que vous voulez.

1
Wysawyg

J'essayais de faire la même chose depuis longtemps, et je n'ai jamais trouvé de bonne solution, alors j'ai écrit mon propre plugin de publication pour git. Il ne publie que les modules modifiés, vous n'avez besoin d'aucune configuration scm, il utilise des balises basées sur les noms de modules et les dépendances entre composants fonctionnent.

Documentation: http://danielflower.github.io/multi-module-maven-release-plugin/index.html

Blog d'introduction: http://danielflower.github.io/2015/03/08/The-Multi-Module-Maven-Release-Plugin-for-Git.html

1
Daniel Flower

Je sais qu’il est tard pour une réponse, mais j’ai rencontré le même problème et la seule solution permettant de réaliser à la fois un projet multi-modules multi-modules et des versions indépendantes pour chaque module consiste à:

  1. Pour le projet multi-module maven, configurez un projet GIT
  2. Pour chaque module maven dans (1) ajouter un sous-module GIT dans (1)
  3. Reliez chaque sous-module GIT (2) à un projet GIT spécifique

Dans le cadre de git, chaque module maven existera comme un projet à part. Il y aura un projet git séparé pour le projet parent maven mais il ne contiendra pas les modules réels, mais uniquement des liens de sous-modules git vers l'emplacement git où les projets réels sont stockés.

0
sshekhar1980

Une manière simple, ce qui a fonctionné pour moi est d’utiliser les propriétés parent dans les modules pom.xml comme suit dans la balise scm comme suit:

<!--module pom.xml-->
<scm>
    <connection>${project.parent.scm.connection}</connection>
    <developerConnection>${project.parent.scm.developerConnection}</developerConnection>
</scm>
0
toschneck