13 - Publicacion de artefactos

Objetivo del tema

Aprenderas a empaquetar artefactos con Gradle y publicarlos en repositorios corporativos o publicos como Maven Central.

Al finalizar, podras generar JAR/WAR, configurar publicacion, manejar versionado/snapshots y proteger credenciales de despliegue.

13.1 Generacion de JARs y WARs

Gradle incluye tareas jar y war para empaquetar bibliotecas y aplicaciones web. Puedes personalizar metadatos y contenidos.

plugins {
  id 'java-library'
  id 'war'
}

tasks.named('jar') {
  archiveBaseName.set('demo-lib')
  manifest {
    attributes 'Implementation-Version': project.version,
               'Implementation-Vendor': 'Ejemplo S.A.'
  }
}

tasks.named('war') {
  archiveBaseName.set('demo-web')
}

El artefacto JAR se genera en build/libs y el WAR en build/libs con extension .war. Usa classes o processResources como dependencias si necesitas preparar archivos antes del empaquetado.

13.2 Publicacion en Maven Central o repositorios privados

El plugin maven-publish permite publicar en repositorios Maven. Para Maven Central se requiere crear staging repositories via Sonatype y firmar artefactos.

plugins {
  id 'java'
  id 'maven-publish'
  id 'signing'
}

publishing {
  publications {
    create('mavenJava', MavenPublication) {
      from components.java
      pom {
        name.set('Demo Library')
        description.set('Biblioteca de ejemplo publicada con Gradle')
        url.set('https://github.com/ejemplo/demo-lib')
        licenses {
          license {
            name.set('Apache License 2.0')
            url.set('https://www.apache.org/licenses/LICENSE-2.0')
          }
        }
        scm {
          url.set('https://github.com/ejemplo/demo-lib')
        }
      }
    }
  }
  repositories {
    maven {
      name = 'sonatype'
      url = uri('https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/')
      credentials {
        username = findProperty('sonatypeUser')
        password = findProperty('sonatypePassword')
      }
    }
  }
}

signing {
  sign publishing.publications['mavenJava']
}

Define las credenciales en gradle.properties (no las subas al repositorio). Para repositorios privados internos, reemplaza la URL y omite la firma si no es requerida.

13.3 Versionado y snapshots

Gradle toma la version del proyecto desde version en build.gradle o gradle.properties. Utiliza sufijos -SNAPSHOT para builds de desarrollo y reglas automaticas en pipelines.

def esSnapshot = project.version.toString().endsWith('-SNAPSHOT')

tasks.register('imprimirVersion') {
  doLast {
    println "Version actual: ${project.version} (snapshot: ${esSnapshot})"
  }
}

tasks.named('publish') {
  onlyIf {
    !esSnapshot || System.getenv('ALLOW_SNAPSHOT') == 'true'
  }
}

En Maven Central, los snapshots se suben a repositorios dedicados (https://s01.oss.sonatype.org/content/repositories/snapshots/) y no requieren cerrar staging repositories.

13.4 Configuracion de credenciales

Maneja secretos con seguridad. Usa gradle.properties local, variables de entorno o sistemas de secret management en el CI/CD. Nunca hardcodees contraseñas en el repositorio.

# ~/.gradle/gradle.properties
sonatypeUser=usuarioExample
sonatypePassword=claveSegura
signing.keyId=ABCD1234
signing.password=claveFirma
signing.secretKeyRingFile=/Users/ejemplo/secring.gpg

El directorio ~/.gradle no se versiona, lo que protege credenciales. En pipelines, inyecta variables de entorno y mapealas a propiedades con findProperty.

Resumen didactico

Publicar artefactos con Gradle implica empaquetar JAR/WAR, configurar repositorios, firmar y versionar correctamente. Con el plugin maven-publish, versionado disciplinado y manejo seguro de credenciales, puedes distribuir bibliotecas confiables tanto en Maven Central como en repositorios privados.