16 - Buenas practicas con Gradle

Objetivo del tema

Recopilaras recomendaciones para usar Gradle de forma consistente: wrapper, organizacion de dependencias, modularizacion y normas de trabajo en equipo.

Estas practicas fortalecen builds reproducibles, escalables y faciles de mantener a largo plazo.

16.1 Uso correcto del gradle wrapper

El wrapper garantiza que todos los desarrolladores y pipelines usen la misma version de Gradle.

# Generar wrapper y fijar version
gradle wrapper --gradle-version 8.8

# Actualizar archivos del wrapper
gradle wrapper --gradle-version 9.0 --distribution-type all
  • Versiona gradlew, gradlew.bat y el directorio gradle/wrapper.
  • Prohibe gradle sin wrapper en scripts de CI: usa ./gradlew.
  • Audita cambios en gradle-wrapper.properties al actualizar versiones.

16.2 Organizacion de dependencias en bloques

Mantener dependencias ordenadas ayuda a detectar duplicados, alinear versiones y aplicar principios de dependency management.

ext {
  versions = [
    springBoot: '3.3.4',
    jackson   : '2.17.1',
    junitJupiter: '5.10.2'
  ]
}

dependencies {
  implementation platform("org.springframework.boot:spring-boot-dependencies:${versions.springBoot}")
  implementation 'org.springframework.boot:spring-boot-starter-web'
  implementation "com.fasterxml.jackson.core:jackson-databind:${versions.jackson}"

  testImplementation "org.junit.jupiter:junit-jupiter:${versions.junitJupiter}"
}
  • Define versiones en un mapa versions o usa version catalogs (libs.versions.toml).
  • Aplica platform o bom para sincronizar versiones transversales.
  • Documenta dependencias criticas (drivers, SDKs) y su proceso de actualizacion.

16.3 Modularizacion y escalabilidad

Dividir el codigo en modulos reduce tiempos de build y facilita la colaboracion.

// settings.gradle
rootProject.name = 'plataforma'
include 'commons', 'api-rest', 'cliente-mobile'

// build.gradle (raiz)
subprojects {
  apply plugin: 'java'
  repositories { mavenCentral() }

  dependencies {
    testImplementation 'org.junit.jupiter:junit-jupiter:5.10.2'
  }

  tasks.withType(Test).configureEach { useJUnitPlatform() }
}

project(':api-rest') {
  dependencies {
    implementation project(':commons')
  }
}
  • Define modulos con responsabilidades claras: commons, servicios, adaptadores.
  • Usa limites explicitamente (interfaces, DTOs) para desacoplar modulos.
  • Evita dependencias circulares; aplica reglas con herramientas como gradle-dependency-analysis.

16.4 Consejos para equipos de desarrollo

La disciplina en equipo previene builds inestables y conflictos.

  • Alinea scripts de CI con comandos locales (gradle clean build).
  • Establece politicas de actualizacion de plugins y Gradle (ej. revisar cada release LTS).
  • Comparte archivos gradle.properties base y usa ~/.gradle para credenciales.
  • Registra acuerdos en un documento de buenas practicas y revisalo periodicamente.
  • Segmenta pipelines: analisis estatico, pruebas, empaquetado y publicacion para feedback rapido.

Resumen didactico

Adoptar buenas practicas (wrapper, dependencias ordenadas, modularizacion y normas de equipo) convierte a Gradle en una herramienta predecible. Con procesos disciplinados los builds se mantienen rapidos, seguros y faciles de evolucionar.