Alojamiento de un repositorio Maven en github


Tengo una bifurcación de una pequeña biblioteca de código abierto en la que estoy trabajando en github. Me gustaría ponerlo a disposición de otros desarrolladores a través de maven, pero no quiero ejecutar mi propio servidor Nexus, y debido a que es una bifurcación no puedo implementarlo fácilmente oss.sonatype.org.

Lo que me gustaría hacer es implementarlo en github para que otros puedan acceder a él usando maven. ¿Cuál es la mejor manera de hacer esto?

Author: MozenRath, 2012-12-23

6 answers

La mejor solución que he podido encontrar consiste en estos pasos:

  1. Crea una rama llamada mvn-repo para alojar tus artefactos maven.
  2. Usa el github site-maven-plugin para enviar tus artefactos a github.
  3. Configure maven para usar su mvn-repo remoto como repositorio maven.

Hay varios beneficios al usar este enfoque:

  • Los artefactos Maven se mantienen separados de su fuente en una rama separada llamada mvn-repo, al igual que las páginas de github, se mantienen en una rama separada llamada gh-pages (si usas páginas de github)
  • A diferencia de otras soluciones propuestas, no entra en conflicto con su gh-pages si las está usando.
  • Se vincula naturalmente con el destino deploy, por lo que no hay nuevos comandos maven que aprender. Simplemente use mvn deploy como lo haría normalmente

La forma típica de implementar artefactos en un repositorio maven remoto es usar mvn deploy, así que vamos a parchear en ese mecanismo para esto solución.

Primero, dile a maven que despliegue artefactos en una ubicación temporal dentro del directorio de destino. Añade esto a tu 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>

Ahora intenta ejecutar mvn clean deploy. Verá que desplegó su repositorio maven en target/mvn-repo. El siguiente paso es conseguir que suba ese directorio a GitHub.

Agregue su información de autenticación a ~/.m2/settings.xml para que github site-maven-plugin pueda enviar a 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>

(Como se ha indicado, asegúrese de chmod 700 settings.xml para asegurarse de que nadie puede leer su contraseña en el archivo. Si alguien sabe cómo hacer que site-maven-plugin solicite una contraseña en lugar de requerirla en un archivo de configuración, házmelo saber.)

Luego dile al GitHub site-maven-plugin sobre el nuevo servidor que acabas de configurar agregando lo siguiente a tu pom:

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

Finalmente, configura el site-maven-plugin para cargar desde tu repositorio provisional temporal a tu rama mvn-repo en 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>

La rama mvn-repo no necesita existir, se creará para usted.

Ahora ejecute mvn clean deploy de nuevo. Debería ver maven-deploy-plugin "subir" los archivos a su repositorio local en el directorio de destino, luego site-maven-plugin confirmando esos archivos y enviándolos al servidor.

[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] ------------------------------------------------------------------------

Visita github.com en su navegador, seleccione la rama mvn-repo y verifique que todos sus binarios estén ahora allí.

introduzca la descripción de la imagen aquí

Felicitaciones!

Ahora puede desplegar sus artefactos maven al público de un hombre pobre repo simplemente ejecutando mvn clean deploy.

Hay un paso más que querrá tomar, que es configurar cualquier poms que dependa de su pom para saber dónde está su repositorio. Agregue el siguiente fragmento de código al pom de cualquier proyecto que dependa de su proyecto:

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

Ahora cualquier proyecto que requiera tus archivos jar los descargará automáticamente desde tu repositorio github maven.

Editar: para evitar el problema mencionado en los comentarios ('Error creating commit: Invalid request. Para 'properties / name', nil no es una cadena.'), asegúrate de indicar un nombre en tu perfil en github.

 446
Author: emmby,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-13 14:49:03

No uses GitHub como repositorio Maven.

Editar: Esta opción recibe muchos votos negativos, pero no hay comentarios sobre por qué. Esta es la opción correcta independientemente de las capacidades técnicas para hospedar realmente en GitHub. El alojamiento en GitHub es incorrecto por todas las razones que se describen a continuación y sin comentarios no puedo mejorar la respuesta para aclarar sus problemas.

Mejor Opción-Colaborar con el Proyecto Original

La mejor opción es convencer el proyecto original para incluir sus cambios y seguir con el original.

Alternativa-Mantenga su propia Bifurcación

Dado que ha bifurcado una biblioteca de código abierto, y su bifurcación también es de código abierto, puede cargar su bifurcación en Maven Central (lea Guía para cargar artefactos en el Repositorio Central) dándole un nuevo groupId y tal vez un nuevo artifactId.

Solo considere esta opción si está dispuesto a mantener esta bifurcación hasta que los cambios sean incorporado en el proyecto original y luego debe abandonar este.

Realmente considere difícil si una bifurcación es la opción correcta. Lea los innumerables resultados de Google para 'por qué no bifurcar'

Razonamiento

Inflar tu repositorio con jars aumenta el tamaño de descarga sin ningún beneficio

Un jar es un output de tu proyecto, se puede regenerar en cualquier momento desde su inputs, y tu repositorio de GitHub debe contener solo inputs.

No ¿me crees? Luego revisa los resultados de Google para 'no almacenar binarios en git'.

La ayuda de GitHub Trabajando con archivos grandes te dirá lo mismo. Es cierto que los jar no son grandes, pero son más grandes que el código fuente y una vez que un jar ha sido creado por una versión, no tienen ninguna razón para ser versionados, para eso es una nueva versión.

Definir múltiples repositorios en tu pom.xml ralentiza su compilación por Número de repositorios por Número de Artefactos

Stephen Connolly dice :

Si alguien agrega tu repositorio, impactará en su rendimiento de compilación ya que ahora tienen otro repositorio contra el que verificar los artefactos... No es un gran problema si solo tienes que añadir un repo... Pero el problema crece y el siguiente lo que sabes es que tu compilación maven está comprobando 50 repositorios por cada artefacto y construir el tiempo es un perro.

¡Así es! Maven necesita comprobar cada artefacto (y sus dependencias) definido en tu pom.xml contra cada repositorio que haya definido, ya que una versión más reciente podría estar disponible en cualquiera de esos repositorios.

Pruébelo usted mismo y sentirá el dolor de una constitución lenta.

El mejor lugar para los artefactos es Maven Central, ya que es el lugar central para los frascos, y esto significa que su construcción solo revisará un lugar.

Puede leer más sobre los repositorios en la documentación de Maven en Introducción a Repositorios

 109
Author: Bae,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-28 01:59:05

Puedes usar JitPack para exponer tu repositorio GitHub como un artefacto Maven. Es muy fácil. Sus usuarios tendrían que añadir esto a su pom.xml:

  1. Añadir repositorio:
<repository>
    <id>jitpack.io</id>
    <url>https://jitpack.io</url>
</repository>
  1. Añadir dependencia:
<dependency>
    <groupId>com.github.User</groupId>
    <artifactId>Repo name</artifactId>
    <version>Release tag</version>
</dependency>

Como se respondió en otro lugar la idea es que JitPack construirá tu repositorio de GitHub y servirá los frascos. El requisito es que tengas un archivo de compilación y una versión de GitHub.

Lo bueno es que no tienes que manejar implementación y cargas. Dado que no quería mantener su propio repositorio de artefactos es una buena combinación para sus necesidades.

 36
Author: Andrejs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:31:38

Otra alternativa es utilizar cualquier alojamiento web con soporte webdav. Necesitará algo de espacio para esto en algún lugar, por supuesto, pero es sencillo de configurar y una buena alternativa para ejecutar un servidor nexus completo.

Añade esto a tu sección de compilación

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

Agregue algo como esto a su sección de Gestión de distribución

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

Finalmente asegúrese de configurar el acceso al repositorio en su configuración.xml

Añada esto a sus servidores sección

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

Y una definición para su sección de repositorios

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

Finalmente, si tiene algún alojamiento php estándar, puede usar algo como sabredav para agregar capacidades de webdav.

Ventajas: tienes tu propio repositorio maven Desventajas: no tiene ninguna de las capacidades de administración en nexus; necesita alguna configuración de webdav en algún lugar

 8
Author: Jilles van Gurp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-27 13:49:10

Como alternativa, Bintray proporciona alojamiento gratuito de repositorios maven. Esa es probablemente una buena alternativa a Sonatype OSS y Maven Central si no desea cambiar el nombre del groupId. Pero por favor, al menos haga un esfuerzo para integrar sus cambios en el flujo ascendente o renombrar y publicar en Central. Hace que sea mucho más fácil para otros usar su tenedor.

 7
Author: Guillaume,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-24 13:00:26

Si solo tiene el archivo aar o jar, o simplemente no quiere usar complementos, he creado un simple script de shell. Puedes lograr lo mismo con él: publicar tus artefactos en Github y usarlo como repositorio público de Maven.

 0
Author: Orest Savchak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-10-09 20:58:41