Subir a maven central una librería propia

Ahora que ya acabas de construir una librería interesante en Java, la has hecho pública (en github, por ejemplo) y quieres que todo el mundo la use… Queda una tarea pendiente, subirla a un repositorio maven para ponerla a disposición de los que utilicen este sistema (o gradle, que hoy en día ya son casi todos).

Vamos a verlo con un ejemplo que he subido esta mañana… Hay cosas que todavía no entiendo del todo, pero el resultado ha sido bueno, por lo que, al menos, podremos usar esta receta como guía para próximas veces.

El código que intento subir es una librería simple que tengo alojada en github con su pom.xml básico y que si te descargas el proyecto podrías compilar e instalar en tu maven con mvn install. La dirección es esta:

https://github.com/yoprogramo/nomorepass-java/

Ahora, para que todo el mundo pueda descargárselo como dependencia y no tenga que hacer el mvn install del proyecto, tenemos que subirlo a un repositorio público, podemos ver una guía en esta página: Guide to Public Maven Repositories. Tal como explican en la página, lo más sencillo para publicar en Maven Central es usar el repositorio Sonatype. Dicho y hecho… Lo intentamos por aquí.

Lo primero es crear una cuenta en el Jira de Sonatype aquí. Lo siguiente, y esto es un poco «tricky» es crear un ticket solicitando un nuevo id de grupo en esta dirección. No se puede pedir cualquier id de grupo (en mi caso quería pedir com.nomorepass) y generalmente se pedirá alguna prueba de que el dominio es tuyo. En mi caso este es el ticket que creé: https://issues.sonatype.org/browse/OSSRH-49426, para demostrar que el dominio era mío cambié el DNS e incluí una entrada TXT con el identificador del ticket:

Una vez autorizado (tarda un poco, es un proceso manual) hay que modificar nuestro código y prepararlo para la subida, pero, antes de eso, tenemos que generar nuestras claves gpg para poder firmar el código. eso se hace con este comando:

gpg --gen-key

Una vez generada podremos acceder a la lista de claves con el comando:

gpg --list-keys

Toma nota del id de la clave y recuerda la contraseña que usaste para generarla, porque tendrás que recordarla. Además, tendrás que publicarla en algún servidor de claves públicas para que pueda ser comprobada.

gpg --keyserver hkp://keys.gnupg.net --send-keys <el-id-de-la-clave>

Ahora empezamos a modificar el pom.xml para que cumpla con los requisitos para el repositorio Maven Central. En nuestro caso pusimos esto:

<groupId>com.nomorepass</groupId>
  <artifactId>nomorepass</artifactId>
  <version>1.0</version>
  <packaging>jar</packaging>

  <name>Nomorepass java library</name>
  <description>NoMorePass protocol 2 implemented on Java.</description>
  <url>https://nomorepass.com</url>

  <licenses>
    <license>
      <name>Apache License, Version 2.0</name>
      <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
      <distribution>repo</distribution>
    </license>
  </licenses>

  <developers>
    <developer>
      <name>Jose Antonio Espinosa</name>
      <email>espinosa@yoprogramo.com</email>
      <organization>Nomorepass</organization>
      <organizationUrl>https://nomorepass.com</organizationUrl>
    </developer>
  </developers>

  <scm>
    <connection>scm:git:git://github.com/yoprogramo/nomorepass-java.git</connection>
    <developerConnection>scm:git:ssh://github.com:yoprogramo/nomorepass-java.git</developerConnection>
    <url>https://github.com/yoprogramo/nomorepass-java/tree/master</url>
</scm>

Y, una vez informado de todo esto, hay que incluir los plugins que nos permitirán hacer el despliegue directamente. Yo añadí esto:

<distributionManagement>
    <snapshotRepository>
      <id>ossrh</id>
      <url>https://oss.sonatype.org/content/repositories/snapshots</url>
    </snapshotRepository>
    <repository>
      <id>ossrh</id>
      <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
    </repository>
</distributionManagement>

Y puse en mi directorio de maven settings.xml los datos de mi usuario

<settings>
  <servers>
    <server>
      <id>ossrh</id>
      <username>xxxxxxxxxx</username>
      <password>xxxxxxxxxx</password>
    </server>
  </servers>
</settings>

Por último, toda la sección de build (que no tenía) la sustituí por esto:

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-gpg-plugin</artifactId>
        <executions>
          <execution>
            <id>sign-artifacts</id>
            <phase>verify</phase>
            <goals>
              <goal>sign</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.sonatype.plugins</groupId>
        <artifactId>nexus-staging-maven-plugin</artifactId>
        <version>1.6.7</version>
        <extensions>true</extensions>
        <configuration>
          <serverId>ossrh</serverId>
          <nexusUrl>https://oss.sonatype.org/</nexusUrl>
          <autoReleaseAfterClose>true</autoReleaseAfterClose>
        </configuration>
      </plugin>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-source-plugin</artifactId>
          <version>2.2.1</version>
          <executions>
            <execution>
              <id>attach-sources</id>
              <goals>
                <goal>jar-no-fork</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-javadoc-plugin</artifactId>
          <version>2.9.1</version>
          <executions>
            <execution>
              <id>attach-javadocs</id>
              <goals>
                <goal>jar</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
    </plugins>
</build>

Y ya, finalmente, pude ejecutar el mágico:

mvn clean deploy

Si todo ha ido bien, el artefacto estará subido a un repositorio que tendremos que promocionar a «Release» para que se sincronice con el repositorio central… Pero al final ya lo tendremos disponible para todo el mundo…

Aquí podéis encontrar lo que acabo de subir: https://search.maven.org/artifact/com.nomorepass/nomorepass/1.0/jar

No puedo con la burocracia

Hay cosas en la vida que te persiguen como una mascota con hambre… Y hoy me he dado cuenta que una de las que me ha estado molestando a todas horas es la burocracia. Y no, no estoy hablando solo de la administración pública.

Empecemos por lo más reciente… El sinsentido de no proporcionarte TU información.

El caso es que mi hijo está en un proceso de consultas y pruebas en el hospital y hacía un par de meses que nos dijeron que nos enviarían cita para las pruebas que faltaban. Generalmente te mandan un sms o te llaman por teléfono, pero esta vez no había sido así y cabía la posibilidad de que no se hubiesen pedido las pruebas o que se nos hubiese pasado la fecha sin saberlo… Al intentar usar la app de citas de la comunidad de madrid nos pide un número de cita para consultar sus datos ¿porqué? Ese dato no lo teníamos porque la cita la había pedido el mismo especialista y solo él sabía el número. ¿no sería más sencillo mostrarte la lista de todas tus citas? En fin…

El caso es que decidimos presentarnos en admisiones del hospital y, tras casi dos horas de espera (¿realmente esto no se puede mejorar?), nos dicen que para darnos estos datos necesitamos una autorización por parte de nuestro hijo (que acaba de cumplir los 18) y fotocopias del dni y la tarjeta sanitaria… Evidentemente la tarjeta la teníamos, pero el DNI lo tenía él y parece que una foto en el móvil tiene menos valor que una fotocopia (sigh)… Repito, ¿no sería más sencillo darnos esa información telemáticamente?

El siguiente sin sentido, que está a punto de mandar a pique a mi empresa, es el de la burocracia empresarial «envenenada»…

Cuanto más grande es la empresa, más complejos son los procesos de gestión, eso lo asumimos todos, pero, lo que no es asumible es que los retrasos, ineficiencias o descuidos en los niveles de gestión de la empresa afecten de manera mortal a proveedores o colaboradores como es el caso.

Llevamos trabajando con una gran empresa, colaborando de manera decisiva en uno de sus proyectos más novedosos y estratégicos desde hace año y medio. El primer año tuvimos dos contratos y con la última extensión del contrato se nos indicó que funcionaríamos mediante órdenes de trabajo y facturas contra esas órdenes. Eso es mucho papeleo y, para que os hagáis una idea, de enero a marzo nos genero 17 facturas. En teoría con un plazo de pago de 45 días.

Cuando vencieron las primeras de enero (en marzo) vimos que los pagos no llegaban. Preguntamos y nos dicen que hay un problema «administrativo» y que ya cobraremos en abril. En abril (hemos seguido trabajando para ellos en marzo y abril) nos indican que hay más problemas y que hay que firmar un nuevo contrato para los trabajos nuevos y otro para poder pagar las facturas viejas ¡¡¡¡¡¡¡¡!!!!!!!!! WTF?

Llega finales de abril y tampoco pagan, en mayo no me dan muchas esperanzas (tiene que firmar el CEO y, claro, debe ser que los asuntos de la empresa no le parecen lo suficientemente importantes como para estar disponible)… Y yo, mientras tanto, pagando el IVA, las nóminas, los gastos de estar trabajando para una gran empresa con dinero propio. Si le pido a los bancos ya me han dicho que tengo que avalar con mis bienes (y cualquiera se fia de nadie hoy en día)… Pero para la gran empresa es solo «un problema administrativo interno».

Ninguna empresa puede vivir seis meses sin ingresos, ninguna que no sea una startup y hay recibido financiación para ello. Y menos trabajando y dejándose la piel día a día haciendo lo que mejor sabemos… Si en un mes esto sigue así tendremos que cerrar «por un problema administrativo de una empresa ajena».

Cordova + Android con docker

Si, suena a chino, pero todos los que desarrollamos aplicaciones hibridas para móviles con cordova nos hemos encontrado con este problema tarde o temprano.. Las versiones son una pesadilla, la versión de node, de nmp, de cordova, de cada uno de los plugins… Y como estoy experimentando con docker para algunos de mis servicios pues quiero experimentar también a ver si puedo tener una versión de contenedor para compilar siempre sobre seguro… Estos son mis resultados:

docker pull beevelop/cordova:latest
docker run --name=cordova -v /home/espinosa/code:/mnt -it beevelop/cordova bash

Luego entro a mi proyecto y simplemente, compilo…

cordova platform add android
cordova build android

Y ya está…

Pero tiene algunos «problemillas» como que el usuario que se utiliza para la compilación es root… Y mientras no encuentre una manera de evitarlo (en el contenedor todo está preparado para hacerlo con root) lo que tengo que hacer es cambiar el propietario del directorio en el que estoy (en el host) después de realizar la compilación.

chmod -R espinosa:espinosa .

O, si lo hacemos desde dentro del contendor:

chmod -R 1000:1000 .

Estoy seguro de que puedo utilizar este sistema para automatizar las generaciones de los apk de las apps (ojala pudiera hacerlo igual en ios), pero todavía me faltan algunos detalles… Por cierto, una vez creado el docker, para volver a ejecutarlo solo hace falta escribir esto:

docker start -ai cordova

Terraplanistas

Hoy en día la información nos sale por las orejas, hemos pasado del oscurantismo y del control de la información por unos pocos al extremo opuesto del espectro, ahora hay mucha más información de la que se puede procesar, tanta, que la mayoría no puede calificarse ni de información. Como efecto secundario tenemos un empacho de tantos datos, opiniones y propaganda que somos incapaces de digerirlos.

¿Tierra plana?

Una de las consecuencias más perversas de toda esta abundancia de datos es que se está produciendo un fenómeno muy curioso, a la par de aterrador. El sesgo de confirmación.

El sesgo de confirmación es la tendencia de una persona a favorecer la información que confirma sus suposiciones, ideas preconcebidas o hipótesis, independientemente de que éstas sean verdaderas o no. El otro día encontré un ejemplo evidente de este sesgo en el documental de Netflix, titulado en español «La Tierra es plana» y que termina cuando uno de estas personas intenta demostrar mediante un experimento sencillo que la tierra es plana… Y los resultados no son los que él espera. Aquí podéis ver el vídeo:

Bien, esto es interesante

¿Creeis que esta persona después de haber demostrado mediante un experimento que la tierra no era plana aceptará la evidencia…? Pues NO.

Seguirá, mientras le queden fuerzas, defendiendo lo plana que es la tierra y lo poderosos que son los que intentan ocultarlo. Aunque no se todavía cómo llegó a este estado, si que se que tiene amigos terraplanistas y que, al final, cuando se juntan unos cuantos con la misma opinión esta tiende a ser aceptada como «verdad» al margen de lo que dicte la realidad. Esto, desgraciadamente, está conduciendo a la humanidad en general a defender posiciones indefendibles solo porque su grupo de referencia lo tiene asumido. Pongamos unos ejemplos:

Cambio climático: ya nos lo decía el primo de Rajoy… Ya pueden darse la vuelta las estaciones, asarte en febrero o helarte en agosto que seguirán diciendo que no hay un cambio climático producido por el hombre.

Vacunas: a pesar de siglos de evidencia científica, de miles de millones de personas vacunadas y felices, de la erradicación de enfermedades mortales y de, en suma, crear una inmunidad global en muy poco tiempo, ellos se emperran en suponer que las farmaceuticas han comprado a todos los médicos del mundo para que nos envenenen a propósito. Si este movimiento continúa dentro de poco volveremos a la esperanza de vida de la edad media.

Homeopatía: ummmm, de verdad, de verdad, el agua con «cosas» en muy baja proporcion no cura nada, dejadlo ya.

Política: esta es la última frontera del sesgo de confirmación. Según el bando en que nos encontremos podremos suponer que hay conspiraciones del bando contrario casi en cada suceso cotidiano. Si eres de derechas y alguien te dice que habla catalán, ya estas autorizado a decir que es un indepe golpista e inventarte historias sobre la opresión de los Españoles en Cataluña. Y, lo peor, es que da igual que sea verdad o mentira, que te demuestre que es un firme defensor del castellano en las escuelas o que cree que lo que han hecho los partidos soberanistas es una tomadura de pelo… No pertenece a nuestro círculo y buscaré cualquier manera de demostrar que es mala persona.

Y el tema avanza más rápido de lo que se cree porque ahora es muy sencillo encontrar gente que piense como tu y aislarte del resto. Las redes sociales han conseguido compartimentar tanto las relaciones que ahora parecemos, como en las peĺículas de instituto americano, que tenemos que pertenecer a uno de los grupos cerrados o seremos criticados por tibios o anodinos… En fin, espero que esta tendencia no se extienda a los tecnólogos (AI si, AI, no) o a los cientíticos que son nuestra única protección contra la estupidez congénita que estamos desarrollando.