Publicar librerías aar en un repositorio maven en Github

Desde que Android Studio nos lanzó al mundillo de Gradle cada vez da más rabia encontrar librerías que no podemos incluir en nuestro proyecto con un simple compile. Así que, va siendo hora de tener un método fácil de publicar nuestras librerías sin tener que pasar todo el proceso de publicación de Maven Central, que es bastante pesadito.

La idea es tener un repositorio de Github que actue como un repositorio de Maven. En este ejemplo utilizo Github, pero en realidad funciona para cualquier sistema con capacidad de compartir archivos, como por ejemplo BitBucket o incluso un servidor web propio.

Crear el repositorio local

Lo primero que necesitamos es una carpeta local donde establecer el repositorio. Por ejemplo, D:\m2-repo. Aquí en realidad alojaremos dos repositorios, uno para artefactos release y otro para artefactos snapshot. Simplemente tendremos dos subcarpetas con esos nombres. El sistema que seguimos ya las creará cuando las necesite.

En esta carpeta creamos un repositorio Git y lo enlazamos con nuestro repositorio Github. Si quieres utilizar otro sistema de publicación pues aquí es donde toca configurarlo.

Crear y configurar el proyecto de Android con la librería

Para simplificar, damos por supuesto que tenemos dos módulos, uno con la librería y otro módulo de aplicación que utilizamos para pruebas o samples.

Ahora toca aplicar el script de Gradle para publicar en Maven. Incluimos la siguiente referencia al final del fichero build.gradle de la librería:

Este es un script de Gradle que he creado a partir del script de Chris Bane. La gran diferencia es que el suyo está pensado para publicar en servidores Maven, por lo que aquí he quitado todo lo relativo a credenciales, ya que el repositorio Maven destino es una carpeta local del disco. También he modificado un par de cosas que fallaban con la última versión de Gradle.

Si lo prefieres, puedes sustituir esta linea por el contenido del script para tenerlo todo localmente. Up to you.

Las instrucciones de configuración están en el proyecto de Github: gradle-local-mvn-push. No las reproduzco aquí por no hacer este post eterno.

Generar y publicar

Una vez lo tenemos todo configurado, sólo tenemos que invocar las tareas de Gradle necesarias desde la raíz del proyecto:

Si usamos el wrapper desde Windows, hay que cambiar gradle por gradlew.

Esto generará los artefactos necesarios y los copiará en la carpeta del repositorio Maven, con sus sources, su javadoc y todo lo necesario.

Ahora sólo hay que subir el repositorio Maven a Github y nuestra librería estará lista para ser utilizada con un simple compile.

Primero añadimos nuestro repositorio como

y luego incluimos la librería deseada

¡Y listos!

Ya no dependemos de Maven Central y podemos publicar nuestras librerías donde queramos.

Este post va dedicado. Para DG que es la fan número 1 de este blog.

2 Comments

  1. Adrià Bergé · January 24, 2015 Reply

    Buenas Sergi,

    fantástico el bloc y lo sencillo que parece publicar así en Maven, pero me ha surgido un error el cual no encuentro la solución y quería mirar tu repositorio como lo habías echo para generar todo y he visto que no lo tienes publicado el repositorio con este método, solo el repositorio final.

    Mi problema es que me da un error al querer generar el javadoc, cuando tengo todos los métodos comentados y clases también.

    He buscado un poco de info y he visto que hay un wizar que te genera todo el javadoc en html y demás en el propio android studio, aun que no me ha parecido que tenga que generarlo de ese método.

    Que podrías echarme un poco de luz al problema?

    C:/***/***/**/MaterialNavigationDrawer>gradlew clean build uploadArchives
    :MaterialNavigationDrawerLib:clean UP-TO-DATE
    :app:clean UP-TO-DATE
    :MaterialNavigationDrawerLib:androidJavadocs

    FAILURE: Build failed with an exception.

    * What went wrong:
    Cannot convert the provided notation to a File or URI: [src/main/java].
    The following types/formats are supported:
    – A String or CharSequence path, e.g ‘src/main/java’ or ‘/usr/include’
    – A String or CharSequence URI, e.g ‘file:/usr/include’
    – A File instance.
    – A URI or URL instance.

    * Try:
    Run with –stacktrace option to get the stack trace. Run with –info or –debug option to get more log output.

    Muchísimas gracias por adelantado.

    • sergi · January 26, 2015 Reply

      También me encontré este problema en un caso. Como no lo quería, lo que hice fue desabilitar la generación de Javadoc. No se muy bien como debería arreglarse de verdad.

Leave a Reply