10 - Configuracion avanzada

Objetivo del tema

Exploraras herramientas avanzadas de Gradle para estandarizar builds, trabajar con proyectos multi-modulo y parametrizar configuraciones segun entorno.

Al finalizar, sabras generar el wrapper, organizar subproyectos, definir perfiles por ambiente y leer propiedades externas con seguridad.

10.1 Gradle Wrapper (gradlew)

El Gradle Wrapper fija la version de Gradle para todo el equipo. Genera los scripts gradlew y gradlew.bat junto al directorio gradle/wrapper con la configuracion.

# Generar wrapper con una version especifica
gradle wrapper --gradle-version 8.8

# Ejecutar builds con el wrapper
./gradlew clean build

Incluye el wrapper en tu repositorio para evitar que otros desarrolladores instalen Gradle manualmente. Los pipelines de CI tambien deben usar los scripts gradlew.

10.2 Multi-project builds (subproyectos)

Un build multi-proyecto agrupa modulos relacionados bajo un mismo settings.gradle. Cada subproyecto tiene su propio build.gradle, pero comparten configuraciones comunes desde el proyecto raiz.

// settings.gradle
rootProject.name = 'plataforma'
include 'api', 'servicio-auth', 'cliente-web'
// build.gradle (raiz)
subprojects {
  apply plugin: 'java'

  repositories {
    mavenCentral()
  }

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

tasks.register('buildAll') {
  dependsOn(subprojects.collect { it.tasks.named('build') })
}

Usa project(':api').dependencies para declarar dependencias entre modulos. Ejecuta ./gradlew :api:test para apuntar a un subproyecto puntual.

10.3 Perfiles y configuracion por entornos

Gradle permite variar la configuracion segun el entorno (desarrollo, staging, produccion). Puedes usar propiedades del sistema, variables de entorno o archivos .properties especificos.

def entorno = findProperty('env') ?: 'dev'

def configPorEntorno = file("config/${entorno}.properties")

if (!configPorEntorno.exists()) {
  throw new GradleException("No se encontro el archivo de configuracion para ${entorno}")
}

Properties props = new Properties()
configPorEntorno.withInputStream { props.load(it) }

ext {
  apiUrl = props.getProperty('api.url')
  featureFlagPago = props.getProperty('feature.pago', 'false').toBoolean()
}

println "Entorno seleccionado: ${entorno} (api: ${apiUrl})"

Ejecuta ./gradlew build -Penv=qa para seleccionar otro perfil. Procura ignorar archivos sensibles con .gitignore.

10.4 Propiedades y parametros externos

Las propiedades externas permiten parametrizar builds sin modificar el build.gradle. Puedes definirlas en gradle.properties, en linea de comandos (-Pclave=valor) o como variables de entorno.

# gradle.properties
version=1.2.0
org.gradle.jvmargs=-Xmx1g -Dfile.encoding=UTF-8
despliegue.url=https://deploy.dev/api
println "Version del proyecto: ${project.version}"
println "URL de despliegue: ${findProperty('despliegue.url')}"

tasks.register('publicar') {
  doLast {
    def credencial = System.getenv('DEPLOY_TOKEN') ?: ''
    if (credencial) {
      println "Publicando con token..."
    } else {
      println "Token de despliegue no disponible, operacion en modo simulacion"
    }
  }
}

Evita hardcodear credenciales en el repositorio. Usa servicios de secretos del CI/CD o variables de entorno cifradas.

Resumen didactico

La configuracion avanzada de Gradle ofrece herramientas para estandarizar builds (wrapper), coordinar multi-proyectos, aplicar perfiles segun entorno y manejar propiedades parametrizadas. Estas practicas facilitan escalar equipos y automatizar despliegues con confianza.