en android, libreria

Como publicar librerías Android en Maven Central/Sonatype

Después de probar jitpack, escogí maven central, por dos limitantes principales:
– Demoro mas de 1 día en publicar una librería
– No soporta subdominios en el paquete
– Permite mas personalización

Nota:
En esta entrada se usa un grupoid con un dominio personalizado, y un servidor propio, por tenerlo a mano y ser práctico, no explore la opción con solo tener github, pero estimo que los pasos de registro deben diferir, y los pasos de publicarlo deben ser los mismos.( revisar en referencias, esta al documentación de como comprobar que es su repositorio)

Primero preparare la ficha de registro, ya que la revisión puede demorar.

Crear una cuenta en issues.sonatype.org
https://issues.sonatype.org/secure/Signup!default.jspa

Crear un nuevo proyecto desde el link https://issues.sonatype.org/secure/CreateIssue.jspa?issuetype=21&pid=10134

*Mientras revisan la solicitud, creamos el repositorio.

Llegará un correo indicando la actualización de la incidencia, en este caso, nos dice que debemos registrar una entrada al DNS de tipo TXT para comprobar que soy dueño del dominio

Dependiendo del servidor propio o publico ( en publico como github.com u otros varía el método de comprobación, ver REFERENCIAS e INICIO DE LA ENTRADA)

Demora unos minutos en propagar el cambio, para comprobar si esta listo puede usar los siguientes comandos

% host -t txt javiersolis.dev
% dig javiersolis.dev txt 

Si esta ok, debe aparecer la respuesta algo como

javiersolis.dev descriptive text "OSSRH-77466"

Ir a la incidencia y comentar para reabrir el tycket, cambiara a estado “ABIERTO”

Luego esperar, si todo va bien, confirmara que se comprobó el dominio

Configuración de la Librería

Creamos la aplicación android, y la librería como siempre.
A tener en cuenta, si la librería es com.domain.lib, al registrar la aplicación indicar el paquete como com.domain.lib.example para poder diferenciarlos.

Siguiendo los pasos del plugin https://github.com/vanniktech/gradle-maven-publish-plugin.

Agregar el classpath en build.gradle de app

classpath 'com.vanniktech:gradle-maven-publish-plugin:0.18.0' // NEW

Agregar el plugin en build.gradle en el modulo de la librería

apply plugin: 'com.vanniktech.maven.publish' // NEW

Cuando el proyecto sea aprobado el link al gestor de repositorio asignado podría tener un subdomio: https://s01.oss.sonatype.org/, para que el plugin lo suba en esa dirección, se puede configurar , agregando en build.gradle del modulo de librería

allprojects {
    plugins.withId("com.vanniktech.maven.publish") {
        mavenPublish {
            sonatypeHost = "S01"
        }
    }
}

En settings.gradle modificamos el repositoriesMode

repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS)

En setting.gradle editar los datos

GROUP=com.test.mylibrary
POM_ARTIFACT_ID=mylibrary-runtime
VERSION_NAME=3.0.5

POM_NAME=My Library
POM_DESCRIPTION=A description of what my library does.
POM_INCEPTION_YEAR=2020
POM_URL=https://github.com/username/mylibrary/

POM_LICENSE_NAME=The Apache Software License, Version 2.0
POM_LICENSE_URL=https://www.apache.org/licenses/LICENSE-2.0.txt
POM_LICENSE_DIST=repo

POM_SCM_URL=https://github.com/username/mylibrary/
POM_SCM_CONNECTION=scm:git:git://github.com/username/mylibrary.git
POM_SCM_DEV_CONNECTION=scm:git:ssh://git@github.com/username/mylibrary.git

POM_DEVELOPER_ID=username
POM_DEVELOPER_NAME=User Name
POM_DEVELOPER_URL=https://github.com/username/

Se requiere tener las credenciales al maven central y una llave gpg

Instalar gpg , https://blog.ghostinthemachines.com/2015/03/01/how-to-use-gpg-command-line/
en MAC:

brew install gnupg

Una vez creada la llave necesitara subirla a los servidores, para eso instalar el gpg suite, descargar desde https://gpgtools.org/

Abrir el programa y dar click en “nueva”

Cuando termine , click, en subir clave publica, si no se hace, en el ultimo paso saldrá un error por no poder validar la clave

ir a la carpeta y exportar la clave secreta, pedira la frase/contraseña, llenar y darle en OK

cd ~/.gnupg/openpgp-revocs.d/
gpg --export-secret-keys -o secring.gpg

Con esto terminado podemos configurar la firma, como indica el repositorio del plugin de publicación ( https://github.com/vanniktech/gradle-maven-publish-plugin#signing) podemos tener un gradle generico, pero si tengo diferentes proyectos podría ser un problema, por eso agregare el archivo gradle.propertis a nivel de la librería, no se subira al repo porque estar en gitignore

signing.keyId=<últimos 8 caracteres>
signing.password=<clave de la llave>
signing.secretKeyRingFile=<ruta al archivo secreto exportado>.gpg

Con esto debería estar terminado la configuración de la aplicación, si termino el registro del dominio ya podemos usar el comando para publicarlo

./gradlew publish --no-daemon --no-parallel  --stacktrace

Publicar

Correr el comando de publicación, debe terminar con un BUILD SUCCESSFUL

% ./gradlew publish --no-daemon --no-parallel  --stacktrace
To honour the JVM settings for this build a single-use Daemon process will be forked. See https://docs.gradle.org/7.0.2/userguide/gradle_daemon.html#sec:disabling_the_daemon.
Daemon will be stopped at the end of the build 

Deprecated Gradle features were used in this build, making it incompatible with Gradle 8.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/7.0.2/userguide/command_line_interface.html#sec:command_line_warnings

BUILD SUCCESSFUL in 29s

Iniciar sesión en https://s01.oss.sonatype.org/#welcome, según el comentario en la incidencia

En el menu, click en staging repositories , luego seleccionar el repositorio que se subio y click en close

Luego click en confirmar

En la parte inferior hay un tab “Activity”, donde debemos ir consultando para poder ver el avance, hasta que confirme con Repository Closed

Entonces podemos hacer click en release para terminar de publicar

Luego click en confirmar

Si refrescamos veremos que el repositorio ya no aparece, ya podemos intentar usarlo en algún proyecto ( luego de 10-15 min) , para mi repositorio de ejemplo, sería

implementation 'dev.javiersolis.android:architecture-application:0.0.1'

también podemos intentar buscarlo en search maven https://search.maven.org/search?q=dev.javiersolis , aunque para aparecer ahi puede demorar un poco mas ( 4 horas), estos avisas se ven el el tycket de solicitud y se envía actualizaciones al corren con el cual se registro

Y listo.
No olvidar revisar las referencias, extraje solo la información que necesite y los problemas que ocurrió, pero hay mas detalles.

Referencias

Variables de entorno
https://phoenixnap.com/kb/set-environment-variable-mac

Entrada de referencia, pero falta actualizar y algunos pasos
https://www.waseefakhtar.com/android/publishing-your-first-android-library-to-mavencentral/

Porque aparece la fecha de expiración de licencia
https://issues.sonatype.org/browse/OSSRH-63222

2da entrada de referencia
https://getstream.io/blog/publishing-libraries-to-mavencentral-2021/

Para ver un commit en especifico se puede armar la ruta <github>/user/project/commit/revision number
https://github.com/javiersolis/android-architecture-application/commit/9008f0f2c0d469da0f6d427a2539003ec5d4d4fc

Los datos del repositorio a subir debe ser el mismo que se registro en la solicitud
https://issues.sonatype.org/browse/OSSRH-68283

Directorio de archivos de repositorios maven
https://repo1.maven.org/maven2/

Ticket ejemplo de nuevo proyecto
https://issues.sonatype.org/browse/OSSRH-77374

Buscador de repositorios
https://search.maven.org/search

Instalar GPG para las llaves de firma
https://blog.ghostinthemachines.com/2015/03/01/how-to-use-gpg-command-line/

Arreglar el error prefer settings

Caused by: org.gradle.api.InvalidUserCodeException: Build was configured to prefer settings repositories over project repositories but repository 'maven' was added by build file 'build.gradle'

Agregando en settings.gradle

repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS)

https://stackoverflow.com/a/69951831

No usar el comando “UploadArchives”, se cambio por “publish” según el changelog
https://github.com/vanniktech/gradle-maven-publish-plugin/blob/3b0d49a9a94ad58af74f0427c8ed618d04dd6b10/CHANGELOG.md#version-0170-2021-07-04

Plugin de publicación en maven
https://github.com/vanniktech/gradle-maven-publish-plugin

Maven local
(~/.m2/repository) publishToMavenLocal.

(*) En caso usar un repositorio gratuito, la forma de comprobar que le pertenece el repositorio, puede seguir los pasos indicados en
https://central.sonatype.org/publish/requirements/coordinates/

Escriba un comentario

Comentario