Cómo publicar artefactos Maven

Publicado

Registrate en central.sonatype.com, también puedes iniciar sesión con tu cuenta de Github. Una vez dentro, en el menú de tu cuenta aparece una opción llamada namespaces, necesitas uno para poder publicar tu proyecto.

Si iniciaste sesión con tu cuenta de Github, en automático puedes utilizar el namespace de tu usuario (ejemplo io.github.vjdv). Si como en mi caso registras tu dominio como espacio (ejemplo net.vjdv) este debe ser verificado. Al registrar tu espacio te dará un código de verificación el cuál se debe agregar como registro TXT a tu dominio. Una vez agregado solicita la confirmación y en unos minutos aparecerá como verificado.

Generé un nuevo proyecto Maven con IntelliJ con la configuración de quickstart. Para la publicación elegí hacerlo con el plugin central-publishing-maven-plugin para que se construya y publique automáticamente con Github actions. Se agrega al pom.xml:

<build>
    <plugins>
        <plugin>
          <groupId>org.sonatype.central</groupId>
          <artifactId>central-publishing-maven-plugin</artifactId>
          <version>0.7.0</version>
          <extensions>true</extensions>
          <configuration>
            <publishingServerId>central</publishingServerId>
            <autoPublish>true</autoPublish>
          </configuration>
        </plugin>
    </plugins>
</build>

También necesitarás un token de acceso, se puede generar en la opción View Account de Sonatype. Ese será necesario para poblar el archivo settings.xml y que el jar se suba correctamente a Maven Central. También hay requerimientos básico que debe tener el empaquetado:

Detalles adicionales de la librería

Estos se colocan en el pom.xml, adjunto un ejemplo donde seleccioné la licencia Apache y el ejemplo de un repositorio Github:

<name>${project.groupId}:${project.artifactId}</name>
<description>Example description</description>
<url>http://www.example.com/example-application</url>
<licenses>
  <license>
    <name>The Apache License, Version 2.0</name>
    <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
  </license>
</licenses>
<developers>
  <developer>
    <name>Manfred Moser</name>
    <email>manfred@sonatype.com</email>
    <organization>Sonatype</organization>
    <organizationUrl>http://www.sonatype.com</organizationUrl>
  </developer>
</developers>
<scm>
  <connection>scm:git:git://github.com/simpligility/ossrh-demo.git</connection>
  <developerConnection>scm:git:ssh://github.com:simpligility/ossrh-demo.git</developerConnection>
  <url>http://github.com/simpligility/ossrh-demo/tree/master</url>
</scm>

Documentación y código fuente

Se consigue fácilmente con estos dos plugins, no necesitan configuración adicional:

  <plugins>
    <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>

Firma GPG

Para firmar el jar se requiere generar una llave gpg, en mi caso utilizaré la misma que hice para firmar mis commits. La llave pública se debe exportar y publicar a un repositorio de llaves público para que maven pueda verificar el jar con esa llave.

Este plugin se encarga del firmado gpg:

    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-gpg-plugin</artifactId>
      <version>1.5</version>
      <executions>
        <execution>
          <id>sign-artifacts</id>
          <phase>verify</phase>
          <goals>
            <goal>sign</goal>
          </goals>
        </execution>
      </executions>
    </plugin>

El archivo settings.xml deberá llevar una configuración como la siguiente:

<settings>
  <servers>
    <server>
      <id>central</id>
      <username><!-- your token username --></username>
      <password><!-- your token password --></password>
    </server>
  </servers>
  <profiles>
    <profile>
      <id>ossrh</id>
      <activation>
        <activeByDefault>true</activeByDefault>
      </activation>
      <properties>
        <gpg.executable>gpg2</gpg.executable>
        <gpg.passphrase>the_pass_phrase</gpg.passphrase>
      </properties>
    </profile>
  </profiles>
</settings>

Dependiendo de tu instalación, debes ajustar el nombre del ejecutable como gpg o gpg2, the_pass_phrase es la frase que desbloquea la llave privada que hayas generado. En la configuración del servidor central debes colocar el usuario y contraseña del token generado en central.

Solo falta publicar la llave pública para que maven pueda verificarla.

gpg --keyserver keyserver.ubuntu.com --send-keys TU_LLAVE

Al ejecutar la tarea deploy de maven, se comenzará con todo el proceso de compilación, generación del jar, su firmado, empaquetado de documentación y código fuente, para finalizar con la publicación. Cuando termine debes entrar nuevamente a tu cuenta de maven y darle en "Publicar" (publish) a tu paquete subido, después de ese momento como a los 10 o 30 minutos podrás utilizar tu paquete como dependencia.

Puedes basarte en mi pequeña librería quickquery que ya está disponible en maven.