Objetivo del tema
Comprenderás cómo el archivo principal de Gradle describe el proceso de construcción mediante bloques declarativos y cómo adaptar su sintaxis tanto en Groovy como en Kotlin DSL para cubrir necesidades reales.
Al finalizar, podrás identificar los bloques esenciales, crear tareas personalizadas y disponer de un ejemplo funcional listo para compilar y ejecutar un proyecto sencillo.
El archivo build.gradle
utiliza Groovy de forma predeterminada, un lenguaje dinámico que favorece la concisión gracias a la inferencia de tipos y a la posibilidad de omitir paréntesis. La alternativa build.gradle.kts
emplea la Kotlin DSL, que aporta tipado estático, autocompletado y mayor seguridad frente a errores de ejecución.
Aunque ambas DSL generan el mismo modelo interno, conviene elegir la que mejor se adapte al equipo: Groovy facilita copiar ejemplos existentes mientras que Kotlin DSL se integra mejor con herramientas modernas de desarrollo.
Ejemplo en Groovy
plugins {
id 'java'
}
group = 'com.ejemplo'
version = '1.0.0'
repositories {
mavenCentral()
}
Ejemplo equivalente en Kotlin DSL
plugins {
java
}
group = "com.ejemplo"
version = "1.0.0"
repositories {
mavenCentral()
}
Independientemente de la sintaxis, los bloques plugins
, group
, version
y repositories
cumplen la misma función; sólo cambian las reglas del lenguaje utilizado.
Los plugins extienden el alcance del build con comportamientos prediseñados, las dependencias describen los componentes externos que necesita la aplicación, y los repositorios indican dónde encontrarlos. Este conjunto de bloques convierte al script en una descripción declarativa del proyecto.
java
o application
.plugins {
id 'application'
}
repositories {
mavenCentral()
maven {
url = uri('https://repo.miempresa.com/releases')
}
}
dependencies {
implementation 'org.apache.commons:commons-lang3:3.14.0'
testImplementation 'org.junit.jupiter:junit-jupiter:5.10.2'
}
Gradle resuelve conflictos de versiones aplicando estrategias configurables; por defecto elige la versión más reciente, aunque puedes definir reglas explícitas para garantizar estabilidad.
Las tareas encapsulan acciones atómicas. Los plugins aportan tareas listas para usar, como compileJava
o test
, y también es posible declarar tareas personalizadas con lógica específica. Cada tarea puede depender de otras para formar pipelines reproducibles.
tasks.register('imprimirVersion') {
group = 'informes'
description = 'Muestra la versión configurada del proyecto'
doLast {
println("Versión del proyecto: ${project.version}")
}
}
tasks.register('prepararRecursos') {
dependsOn('processResources')
doLast {
println('Recursos preparados correctamente.')
}
}
Además de register
, puedes usar named
para ajustar tareas existentes sin redefinirlas. La combinación de dependencias y acciones doLast
hace que el build sea expresivo y fácil de mantener.
Con los bloques anteriores se puede construir una aplicación ejecutable de forma inmediata. El siguiente script declara el plugin application
, establece la clase principal y define las bibliotecas necesarias.
plugins {
id 'application'
}
group = 'com.ejemplo'
version = '1.0.0'
repositories {
mavenCentral()
}
dependencies {
implementation 'com.google.guava:guava:33.0.0-jre'
testImplementation 'org.junit.jupiter:junit-jupiter:5.10.2'
}
application {
mainClass = 'com.ejemplo.App'
}
tasks.withType(Test).configureEach {
useJUnitPlatform()
}
Para construir este script, crea un archivo build.gradle
en la raíz del proyecto y copia el bloque anterior. El archivo establece el plugin application
, asigna el identificador del artefacto (group
y version
) y declara repositorios y dependencias necesarias para compilar y probar.
build.gradle
.src/main/java/com/ejemplo/App.java
con un main
que imprima un mensaje.src/test/java
para aprovechar JUnit
ya configurado.Pasos de ejecución:
gradle build
para descargar dependencias, compilar y lanzar las pruebas.gradle run
para iniciar la aplicación. Gradle invocará la clase principal definida en el bloque application
.
El archivo build.gradle
centraliza la configuración del proyecto: define plugins, dependencias y repositorios, y organiza tareas que automatizan el ciclo de vida. Dominar la sintaxis de Groovy y Kotlin DSL permite alternar entre ambos estilos según el contexto y escribir scripts mantenibles que aceleren los builds.