337 votes

Héberger un dépôt Maven sur github

J'ai un fork d'une petite bibliothèque open source sur laquelle je travaille sur github. J'aimerais la mettre à disposition d'autres développeurs via maven, mais je ne veux pas faire tourner mon propre serveur Nexus, et comme il s'agit d'un fork, je ne peux pas facilement la déployer sur oss.sonatype.org.

Ce que j'aimerais faire, c'est le déployer sur github pour que d'autres puissent y accéder en utilisant maven. Quelle est la meilleure façon de le faire ?

5 votes

Quels sont les problèmes de licence auxquels vous êtes confrontés avec OSS Sonatype ? Je suis simplement curieux car je l'utilise moi-même.

5 votes

Il existe un outil qui vous permet d'exposer votre dépôt GitHub via maven directement. jitpack.io stackoverflow.com/a/28483461/3975649

1 votes

Github a également annoncé un registre de paquets qui prend en charge maven. Actuellement en version bêta publique : github.com/features/package-registry

512voto

emmby Points 35359

La meilleure solution que j'ai trouvée consiste en ces étapes :

  1. Créer une branche appelée mvn-repo pour héberger vos artefacts maven.
  2. Utiliser le site github site-maven-plugin pour pousser vos artefacts sur github.
  3. Configurer maven pour qu'il utilise votre serveur distant mvn-repo en tant que dépôt maven.

Cette approche présente plusieurs avantages :

  • Les artefacts Maven sont conservés séparément de votre source dans une branche distincte appelée mvn-repo tout comme les pages github sont conservées dans une branche séparée appelée gh-pages (si vous utilisez les pages github)
  • Contrairement à d'autres solutions proposées, elle n'entre pas en conflit avec votre gh-pages si vous les utilisez.
  • Il s'articule naturellement avec la cible de déploiement, de sorte qu'il n'y a pas de nouvelles commandes maven à apprendre. Il suffit d'utiliser mvn deploy comme vous le feriez normalement

La manière habituelle de déployer des artefacts vers un repo maven distant est d'utiliser l'option mvn deploy Nous allons donc utiliser ce mécanisme pour cette solution.

Tout d'abord, demandez à maven de déployer les artefacts dans un emplacement temporaire (staging location) à l'intérieur de votre répertoire cible. Ajoutez ceci à votre pom.xml :

<distributionManagement>
    <repository>
        <id>internal.repo</id>
        <name>Temporary Staging Repository</name>
        <url>file://${project.build.directory}/mvn-repo</url>
    </repository>
</distributionManagement>

<plugins>
    <plugin>
        <artifactId>maven-deploy-plugin</artifactId>
        <version>2.8.1</version>
        <configuration>
            <altDeploymentRepository>internal.repo::default::file://${project.build.directory}/mvn-repo</altDeploymentRepository>
        </configuration>
    </plugin>
</plugins>

Essayez maintenant d'exécuter mvn clean deploy . Vous verrez qu'il a déployé votre dépôt maven vers target/mvn-repo . L'étape suivante consiste à télécharger ce répertoire sur GitHub.

Ajoutez vos informations d'authentification à ~/.m2/settings.xml afin que le site github site-maven-plugin peut pousser vers GitHub :

<!-- NOTE: MAKE SURE THAT settings.xml IS NOT WORLD READABLE! -->
<settings>
  <servers>
    <server>
      <id>github</id>
      <username>YOUR-USERNAME</username>
      <password>YOUR-PASSWORD</password>
    </server>
  </servers>
</settings>

(Comme indiqué, veillez à chmod 700 settings.xml pour s'assurer que personne ne puisse lire votre mot de passe dans le fichier. Si quelqu'un sait comment faire pour que site-maven-plugin demande un mot de passe au lieu de l'exiger dans un fichier de configuration, qu'il me le fasse savoir).

Indiquez ensuite à l'interface GitHub site-maven-plugin sur le nouveau serveur que vous venez de configurer en ajoutant ce qui suit à votre pom :

<properties>
    <!-- github server corresponds to entry in ~/.m2/settings.xml -->
    <github.global.server>github</github.global.server>
</properties>

Enfin, configurez le site-maven-plugin pour télécharger depuis votre repo temporaire de mise en scène vers votre mvn-repo sur Github :

<build>
    <plugins>
        <plugin>
            <groupId>com.github.github</groupId>
            <artifactId>site-maven-plugin</artifactId>
            <version>0.11</version>
            <configuration>
                <message>Maven artifacts for ${project.version}</message>  <!-- git commit message -->
                <noJekyll>true</noJekyll>                                  <!-- disable webpage processing -->
                <outputDirectory>${project.build.directory}/mvn-repo</outputDirectory> <!-- matches distribution management repository url above -->
                <branch>refs/heads/mvn-repo</branch>                       <!-- remote branch name -->
                <includes><include>**/*</include></includes>
                <repositoryName>YOUR-REPOSITORY-NAME</repositoryName>      <!-- github repo name -->
                <repositoryOwner>YOUR-GITHUB-USERNAME</repositoryOwner>    <!-- github username  -->
            </configuration>
            <executions>
              <!-- run site-maven-plugin's 'site' target as part of the build's normal 'deploy' phase -->
              <execution>
                <goals>
                  <goal>site</goal>
                </goals>
                <phase>deploy</phase>
              </execution>
            </executions>
        </plugin>
    </plugins>
</build>

En mvn-repo n'a pas besoin d'exister, elle sera créée pour vous.

Exécuter maintenant mvn clean deploy encore une fois. Vous devriez voir maven-deploy-plugin "télécharger" les fichiers dans votre dépôt local dans le répertoire cible, puis site-maven-plugin valider ces fichiers et les pousser sur le serveur.

[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building DaoCore 1.3-SNAPSHOT
[INFO] ------------------------------------------------------------------------
...
[INFO] --- maven-deploy-plugin:2.5:deploy (default-deploy) @ greendao ---
Uploaded: file:///Users/mike/Projects/greendao-emmby/DaoCore/target/mvn-repo/com/greendao-orm/greendao/1.3-SNAPSHOT/greendao-1.3-20121223.182256-3.jar (77 KB at 2936.9 KB/sec)
Uploaded: file:///Users/mike/Projects/greendao-emmby/DaoCore/target/mvn-repo/com/greendao-orm/greendao/1.3-SNAPSHOT/greendao-1.3-20121223.182256-3.pom (3 KB at 1402.3 KB/sec)
Uploaded: file:///Users/mike/Projects/greendao-emmby/DaoCore/target/mvn-repo/com/greendao-orm/greendao/1.3-SNAPSHOT/maven-metadata.xml (768 B at 150.0 KB/sec)
Uploaded: file:///Users/mike/Projects/greendao-emmby/DaoCore/target/mvn-repo/com/greendao-orm/greendao/maven-metadata.xml (282 B at 91.8 KB/sec)
[INFO] 
[INFO] --- site-maven-plugin:0.7:site (default) @ greendao ---
[INFO] Creating 24 blobs
[INFO] Creating tree with 25 blob entries
[INFO] Creating commit with SHA-1: 0b8444e487a8acf9caabe7ec18a4e9cff4964809
[INFO] Updating reference refs/heads/mvn-repo from ab7afb9a228bf33d9e04db39d178f96a7a225593 to 0b8444e487a8acf9caabe7ec18a4e9cff4964809
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 8.595s
[INFO] Finished at: Sun Dec 23 11:23:03 MST 2012
[INFO] Final Memory: 9M/81M
[INFO] ------------------------------------------------------------------------

Visitez le site github.com dans votre navigateur, sélectionnez l'onglet mvn-repo et vérifiez que tous vos binaires s'y trouvent.

enter image description here

Félicitations !

Vous pouvez maintenant déployer vos artefacts maven vers un repo public du pauvre en lançant simplement mvn clean deploy .

Il y a encore une étape à franchir, qui est de configurer toutes les poms qui dépendent de votre pom pour qu'elles sachent où se trouve votre dépôt. Ajoutez l'extrait suivant à tous les projets pom qui dépendent de votre projet :

<repositories>
    <repository>
        <id>YOUR-PROJECT-NAME-mvn-repo</id>
        <url>https://github.com/YOUR-USERNAME/YOUR-PROJECT-NAME/raw/mvn-repo/</url>
        <snapshots>
            <enabled>true</enabled>
            <updatePolicy>always</updatePolicy>
        </snapshots>
    </repository>
</repositories>

Désormais, tout projet nécessitant vos fichiers jar les téléchargera automatiquement depuis votre dépôt maven github.

Edit : pour éviter le problème mentionné dans les commentaires ('Error creating commit : Demande invalide. For 'properties/name', nil is not a string.'), assurez-vous d'indiquer un nom dans votre profil sur github.

2 votes

(Notez que la manière préférée d'héberger les artefacts maven est toujours d'utiliser un serveur nexus. Cependant, l'utilisation de github peut être une alternative légère lorsqu'un serveur existant ou l'hébergement de votre propre serveur n'est pas une option facile. Notez également que vous ne pourrez pas naviguer directement dans votre dépôt maven. Github ne vous permet pas de parcourir les structures de répertoire lorsque vous utilisez raw. Cependant, vous pouvez toujours parcourir le dépôt en allant sur votre page Github et en parcourant le répertoire mvn-repo (voir le tableau ci-dessous).

28 votes

Notez également que cette solution écrasera vos artefacts précédents à chaque fois que vous les déployez. Ceci est approprié pour les dépôts d'instantanés, mais pas pour les artefacts publiés. Pour désactiver ce comportement, définissez <merge>true</merge> dans la configuration de votre site-maven-plugin. Si vous faites cela, cependant, je pense que vous devrez créer manuellement la branche mvn-repo dans github et supprimer tous ses fichiers la première fois.

13 votes

+1 intelligent et bien présenté. Ma seule critique est que vous n'avez pas inclus un lien vers le site des plugins Maven : github.com/github/maven-plugins . J'étais à la recherche d'un moyen de publier mon site Maven sur github !

129voto

Bae Points 1381

N'utilisez pas GitHub comme dépôt Maven.

Edit : Cette option reçoit beaucoup de votes négatifs, mais aucun commentaire n'explique pourquoi. C'est la bonne option, quelles que soient les capacités techniques pour héberger sur GitHub. L'hébergement sur GitHub est une erreur pour toutes les raisons exposées ci-dessous et sans commentaires, je ne peux pas améliorer la réponse pour clarifier vos problèmes.

Meilleure option - Collaborer avec le projet d'origine

La meilleure solution est de convaincre le projet original d'inclure vos modifications et de s'en tenir à l'original.

Alternative - Maintenir sa propre fourche

Puisque vous avez forké une bibliothèque open source, et que votre fork est également open source, vous pouvez télécharger votre fork vers Maven Central (lire Guide pour le téléchargement d'artefacts dans le dépôt central ) en lui attribuant un nouveau groupId et peut-être un nouveau artifactId .

Ne considérez cette option que si vous êtes prêt à maintenir cette fourche jusqu'à ce que les changements soient incorporés dans le projet original, après quoi vous devriez abandonner cette fourche.

Réfléchissez bien à la question de savoir si une fourche est la bonne option. Lisez les innombrables résultats de Google pour Pourquoi ne pas fourcher ?

Raisonnement

Le fait de gonfler votre référentiel avec des jars augmente la taille des téléchargements sans aucun bénéfice.

Une jarre est un output de votre projet, il peut être régénéré à tout moment à partir de son inputs et votre répertoire GitHub ne doit contenir que les éléments suivants inputs .

Vous ne me croyez pas ? Consultez les résultats de Google pour 'ne pas stocker les binaires dans git' .

Aide de GitHub Travailler avec des fichiers volumineux vous diront la même chose. Certes, les jar ne sont pas volumineux, mais ils le sont plus que le code source et, une fois qu'un jar a été créé par une version, il n'a aucune raison d'être versionné - c'est la raison d'être d'une nouvelle version.

Définir plusieurs dépôts dans votre pom.xml ralentit votre compilation par le nombre de dépôts multiplié par le nombre d'artefacts.

Stephen Connolly dit :

Si quelqu'un ajoute votre dépôt, cela a un impact sur la performance de leur construction car ils ont maintenant un autre repo pour vérifier les artefacts... Ce n'est pas un gros problème si vous n'avez à ajouter qu'un seul repo... Mais le problème prend de l'ampleur et la prochaine vous savez que votre build maven vérifie 50 repo pour chaque artefact et le temps de construction est un chien.

C'est vrai ! Maven a besoin de vérifier chaque artefact (et ses dépendances) défini dans votre pom.xml par rapport à chaque référentiel que vous avez défini. car une version plus récente pourrait être disponible dans l'un de ces dépôts.

Essayez-le vous-même et vous ressentirez la douleur d'une construction lente.

Le meilleur endroit pour les artefacts est Maven Central, car c'est l'endroit central pour les jarres, et cela signifie que votre build ne vérifiera jamais que un lieu.

Pour en savoir plus sur les dépôts, consultez la documentation de Maven sur le site Introduction aux référentiels

3 votes

Tout à fait d'accord, et c'est tout à fait logique pour les fourches que l'on veut garder pendant un certain temps. Mais cela peut représenter beaucoup de frais généraux pour un simple petit correctif à un projet existant.

0 votes

Si cela ne dure pas longtemps, demandez-leur de le construire eux-mêmes. Vous serez toujours confrontés à des compromis de ce type.

6 votes

Je doute que Github ait un problème avec cela, car ils ont écrit le plugin qui permet cette capacité. Je suis d'accord que c'est moins qu'une idée, mais c'est la vie.

52voto

Andrejs Points 4235

Vous pouvez utiliser JitPack (gratuit pour les dépôts Git publics) pour exposer votre dépôt GitHub en tant qu'artefact Maven. C'est très simple. Vos utilisateurs devront l'ajouter à leur pom.xml :

  1. Ajouter un dépôt :

    <repository> <id>jitpack.io</id> <url>https://jitpack.io</url> </repository>

  2. Ajouter une dépendance :

    <dependency> <groupId>com.github.User</groupId> <artifactId>Repo name</artifactId> <version>Release tag</version> </dependency>

Comme répondu ailleurs L'idée est que JitPack construise votre dépôt GitHub et serve les bocaux. L'exigence est que vous ayez un fichier de construction et une version GitHub.

L'avantage est que vous n'avez pas à vous occuper du déploiement et des téléchargements. Puisque vous ne voulez pas maintenir votre propre dépôt d'artefacts, c'est une bonne solution pour vos besoins.

24voto

Ruslan López Points 2798

Depuis 2019, vous pouvez utiliser la nouvelle fonctionnalité appelée Registre des paquets Github .

En gros, le processus est le suivant :

  • générer un nouveau jeton d'accès personnel à partir des paramètres de github
  • ajoutez les informations sur le dépôt et le jeton dans votre settings.xml
  • déployer en utilisant

    mvn deploy -Dregistry=https://maven.pkg.github.com/yourusername -Dtoken=yor_token

9voto

Jilles van Gurp Points 1596

Une autre solution consiste à utiliser n'importe quel hébergement web prenant en charge webdav. Vous aurez bien sûr besoin d'espace pour cela, mais c'est une solution simple à mettre en place et une bonne alternative à l'utilisation d'un serveur Nexus complet.

ajoutez ceci à votre section de construction

     <extensions>
        <extension>
        <artifactId>wagon-webdav-jackrabbit</artifactId>
        <groupId>org.apache.maven.wagon</groupId>
        <version>2.2</version>
        </extension>
    </extensions>

Ajoutez quelque chose comme ceci à votre section distributionManagement

<repository>
    <id>release.repo</id>
    <url>dav:http://repo.jillesvangurp.com/releases/</url>
</repository>

Enfin, assurez-vous de configurer l'accès au dépôt dans votre fichier settings.xml.

ajoutez ceci à votre section serveurs

    <server>
        <id>release.repo</id>
        <username>xxxx</username>
        <password>xxxx</password>
    </server>

et une définition de votre section sur les dépôts

            <repository>
                <id>release.repo</id>
                <url>http://repo.jillesvangurp.com/releases</url>
                <releases>
                    <enabled>true</enabled>
                </releases>
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
            </repository>

Enfin, si vous disposez d'un hébergement php standard, vous pouvez utiliser quelque chose comme sabredav pour ajouter des fonctionnalités webdav.

Avantages : vous disposez de votre propre dépôt maven Inconvénients : vous ne disposez d'aucune des fonctionnalités de gestion de nexus ; vous avez besoin d'une configuration webdav quelque part.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X