Cómo subir tu librería a Maven Central (Android)

Seguro que en tus aventuras como desarrollador Android te has encontrado con proyectos de GitHub que tienen un apartado en el que explican cómo importar esa super librería en tu proyecto.
Y en ese apartado te ponen algo como

dependencies {
    compile 'com.github.dexafree:materiallist:2.+'
}

Y tú añades esa línea a tu build.gradle y mágicamente tienes la librería disponible.

Este post es una pequeña ayuda para que, cualquiera que haya desarrollado una librería para Android y quiera que los usuarios de la misma puedan tener un acceso fácil a ella, puedan subirla a Maven Central para conseguirlo.

NOTA

Si quieres subir tu librería Java a Maven Central tienes disponible éste post donde explico como hacerlo.
Éste post es específico para librerías Android

Obteniendo un Group Id

Lo primero que se necesita para subir una librería a Maven Central es obtener un groupId.
Esos groupId los asigna la gente de Sonatype, quienes gestionan el repositorio.

Para que nos den uno, deberemos registrarnos en su JIRA y crear un Issue indicando

JIRA

  • Project: Community Support - Open Source Project Repository Hosting
  • Issue Type: New Project
  • Summary: Nombre del proyecto
  • Description: Breve descripción del proyecto
  • Project URL: Dirección del repositorio donde tenemos alojado el código
  • SCM URL: Dirección al repositorio git donde tenemos alojado el código (si está en GitHub, es la URL del repositorio con un .git al final)

Como veis, no he puesto qué teneis que poner en el apartado Group Id.

Qué Group Id solicitar

En caso que tengáis un dominio comprado (por ejemplo, minombre.com), podéis poner com.minombre.

De no ser así, no podríais poner com.minombre, porque se os solicitará que vosotros seáis los dueños del dominio minombre.com (podríais tener problemas si ponéis que lo sois y en realidad no, porque en caso que la empresa que tenga comprado el dominio quiera obtener el Group Id asignado a ese dominio podría obligaros a cambiarlo de todos vuestros proyectos).

Si no tenéis ningún dominio comprado, podéis poner simplemente com.github. seguido de vuestra cuenta de GitHub (por ejemplo, com.github.dexafree).

Para más información: Choosing your coordinates

Una vez tengáis todos los campos rellenados, creáis el issue y esperáis a que os contesten y os asignen el Group Id.

Cuando lo tengáis asignado os pedirán que comentéis en ese mismo ticket después de hacer vuestra primera release.

Subiendo la librería

Una vez tengáis vuestro Group Id, tendréis que hacer 3 cosas más antes de que esté disponible para todo el mundo:

  1. Preparar los archivos de configuración
  2. Generar un par de claves PGP
  3. Subirla

Preparar los archivos de configuración

Proyecto

En la raíz del proyecto de vuestra librería deberéis tener un archivo llamado gradle.properties con el siguiente contenido:

Modificad lo que sea necesario para que se ajuste a vuestro proyecto. Como véis, en el apartado GROUP deberéis poner vuestro Group Id.

Además, en el build.gradle de vuestro proyecto (no del módulo de la librería) deberéis añadir lo siguiente al final:

def isReleaseBuild(){
    return version.contains("SNAPSHOT") == false
}

allprojects {
	version = VERSION_NAME
    group = GROUP

    repositories {
        jcenter()
        mavenCentral()
    }
}

Finalmente, tendréis que copiar el siguiente archivo llamado maven_push.gradle a la raíz de vuestro proyecto: maven_push.gradle.

Librería

Una vez configurado el proyecto, tendréis que añadir la siguiente línea al final del build.gradle del módulo de vuestra librería:

apply from: '../maven_push.gradle'

Una vez hecho esto, solo os faltará crear otro archivo de configuración dentro, ahora sí, del módulo de vuestra librería. Este archivo se llamará, de nuevo, gradle.properties:

POM_NAME=NombreDeLaLibreria
POM_ARTIFACT_ID=nombredelalibreria
POM_PACKAGING=aar

Cuando tengáis todos estos pasos listos, tendréis el proyecto preparado para ser subido a Sonatype.

Ejemplo

Podéis ver un ejemplo de la estructura de ficheros en MaterialList

Creación de claves PGP

Para subir la librería a Maven Central se requiere que cada archivo esté firmado con un par de claves único.
Para generar esas claves se utiliza PGP o su equivalente libre GPG.

Hay programas que funcionan a modo de interfaz gráfica para facilitar el uso de PGP (para OS X existe GPG Keychain Access, y para Windows GPG4Win).

Simplemente tendréis que crear una nueva clave con los valores por defecto (2048bits) y vuestra dirección de correo, que (ahora mismo no recuerdo) debería ser la misma con la que os registrásteis en Sonatype.

Cuando la tengáis creada, deberéis obtener su ID corta

ID

Una vez tengáis esa id, deberéis ir a la carpeta local de gradle

  • En sistemas UNIX/OSX:

    ~/.gradle

  • En sistemas Windows:

    C:\Users\VUESTRO_USUARIO.gradle

Y ahí deberéis tener/crear un archivo llamado gradle.properties con el siguiente contenido:

signing.keyId=IDCORTA
signing.password=CONTRASEÑA CON LA QUE CREÁSTEIS LA CLAVE
signing.secretKeyRingFile=RUTA_GPG

nexusUsername=NOMBRE DE USUARIO DE SONATYPE
nexusPassword=CONTRASEÑA DE SONATYPE

El apartado RUTA_GPG es:

  • En sistemas OSX:

    /Users/VUESTRO_USUARIO/.gnupg/secring.gpg

  • En sistemas Unix: Debería ser similar a la ruta de OS X
  • En sistemas Windows:

    C:\Users\VUESTRO_USUARIO.gnupg\secring.gpg

Cuando tengáis estos archivos listos, solo os queda dar los últimos pasos.

Subir la librería

Con el proyecto configurado, el módulo configurado, el Group Id listo... solo queda dar los últimos pasos para que la librería esté disponible para todo el mundo.

Tendréis que abrir una consola de comandos y navegar hacia la carpeta de vuetro proyecto. Una vez ahí deberéis ejecutar lo siguiente:

  • Sistemas UNIX/OSX:

    ./gradlew uploadArchives

  • Sistemas Windows:

    gradlew.bat uploadArchives

Y deberíais ver cómo se va subiendo todo.

Si el resultado de la compilación es exitoso, deberéis ir al apartado de Staging Repositories.

Una vez ahí, entrad con vuestro usuario y contraseña de sonatype, y en el buscador de la derecha, buscad alguna parte de vuestro group id (en mi caso, dexafree).
Si todo ha ido bien, os aparecerá un elemento representando vuestro proyecto, el cual deberéis seleccionar y pulsar sobre el botón Close.

Una vez haya hecho todas las comprobaciones (tarda unos 30 segundos), os llegará un e-mail avisando de que tenéis el repositorio listo para ser lanzado. Pulsad el botón Refresh y al seleccioanr de nuevo vuestro proyecto, deberíais poder pulsar el botón Release.
De nuevo, al cabo de unos 30 segundos os debería llegar otro e-mail diciendo que el repositorio ha sido publicado correctamente.

Cuando os llegue el e-mail deberéis ir a comentar en el issue que abristeis para solicitar el Group Id que ya habéis publicado la primera versión, y esperar a que os avisen que se ha iniciado la sincronización con Maven Central (se hace manualmente, así que puede tardar unas 24-48h).

A partir de entonces, deberéis esperar un tiempo entre 15 minutos y 2 horas (son los márgenes de tiempo que indican que se debe esperar en condiciones normales), y pasaréis a tener vuestra líbrería públicamente accesible.

Para obtenerla en proyectos basados en gradle, la ruta quedará:

compile 'GROUPID:artifact_id:version'

Donde artifact_id es el que hayáis especificado en el gradle.properties del módulo de la librería.

Y las actualizaciones de la librería?

Como véis es bastante trabajo para andarlo realizando todas las veces que queramos actualizar la librería. Eso no será necesario.

Una vez hayamos publicado por primera vez, las siguientes veces solo tendremos que modificar los archivos de configuración con los cambios necesarios (número de versión), ejecutar de nuevo la tarea de uploadArchives y hacer los pasos de Staging Repositories.

Y si quiero subir otra librería?

Una vez tengáis asignado vuestro Group Id podréis subir tantas librerías como queráis, no tendréis ni que abrir un nuevo issue, ni crear una nueva clave de cifrado ni nada, simplemente configurar el proyecto con los archivos necesarios, ejecutar la tarea de Gradle para subir archivos, y listo.

Espero que este post sirva de ayuda para que más gente se anime a publicar sus librerías en Maven Central, ya que al hacerlo facilita mucho que otras personas puedan incluir su trabajo en sus propios proyectos.