Gestión de Dependencias: Gradle vs Maven

Maria Paula Vizcaíno
Pragma
Published in
4 min readFeb 15, 2024

La gestión de dependencia nos permite añadir eficiencia, escalabilidad y mantenibilidad del código, si la empleamos de manera adecuada en nuestros proyectos.

En el ambiente de Java, teniendo en cuenta su énfasis en la modularidad, emplear herramientas compatibles con nuestro propósito puede determinar el éxito de nuestro desarrollo. Para ello, contamos con dos herramientas especializadas en este campo: Gradle y Maven donde cada una brinda al pragmático un enfoque particular para la construcción de nuestros proyectos.

Tenemos la responsabilidad de emplear la herramienta que mejor se acople al objetivo, requerimientos y necesidades de nuestra aplicación, para ello, debemos analizar sus características particulares, las facilidades que brindan para la construcción de proyectos y sus filosofías subyacentes.

En estos enfoques, desde Gradle obtenemos flexibilidad y potencia, permitiéndonos personalizar la estructura de nuestra aplicación y la lógica de construcción, siendo idónea para sistemas que priorizar la adaptabilidad y la granularidad.

Por otro lado, Maven ha sido la herramienta preferida por los desarrolladores por el principio de “convención sobre configuración”, que consiste en estructurar la configuración de la aplicación asociada con reglas específicas.

Gradle: Flexibilidad y potencia

En los últimos años, Gradle ha logrado adquirir popularidad entre los desarrolladores debido a su base en convenciones donde ofrece, por medio de scripts, la personalización del proyecto proporcionándonos libertad en la construcción de nuestra aplicación.

Un diferenciador de Gradle es su flexibilidad estructural, librando a los desarrolladores de limitaciones por estructuras predefinidas simplificando la integración de nuestra aplicación con herramientas y sistemas externos.

Se centra en la automatización de sistemas y la eficiencia de estos mediante un modelo de construcción basado en tareas, manejadas como acciones particulares durante la estructuración. Esta herramienta permite construir de manera incremental donde las únicas acciones que se ejecutarán posterior a unas modificaciones serán afectadas por dichos cambios.

Gradle está basado en DSL (lenguaje de dominio específico) basado en Korlin y Groovy para definir configuraciones y, a la par, tareas; esto facilita la comprensión y el mantenimiento del código. Adicionalmente, esta herramienta de manejo de dependencias cuenta con principios de programación funcional proporcionando procesos de desarrollo dinámicos.

Podemos implementar los artefactos a emplear en el archivo de configuraciones del proyecto el cual se llama ‘build.gradle’. Este se compone de cuatro secciones, veamos su composición:

// Declaración de plugins
plugins {
id 'java' // Plugin para proyectos Java
}

// Configuración del proyecto
group 'com.ejemploPragma' // Grupo del proyecto
version '1.0' // Versión del proyecto

// Configuración de dependencias
dependencias {
// Dependencia de Spring Boot
implementation 'org.springframework.boot:spring-boot-starter-web:2.5.0'
// Dependencia de JUnit para pruebas
testImplementation 'junit:junit:4,12'
}

// Configuración de tareas personalizadas
task sayHello {
doLast {
println '¡Hola pragmático!'
}
}

Gradle es capaz de manejar errores y excepcionas adecuadamente sin comprometer la funcionalidad de la aplicación y la integridad de los datos. Gestiona y resuelve interrupciones como conflictos de versiones y ofrece configuraciones avanzadas para especificar las dependencias que deben excluirse, siendo útil en los casos en los que ciertas librerías entran en conflicto entre sí o no son necesarias en el desarrollo.

task buildProd(tyoe: Jar) {
from sourceSets.main.output
archiveClassifier.set('prod')
}

Maven: Convenciones y simplicidad

Esta herramienta desarrollada por Apache sigue convenciones predefinidas reduciendo las configuraciones manuales; “convención sobre configuración”. Esta estructura preestablecida, da un orden específico a los archivos y directorios del proyecto como por ejemplo el código fuente en la ruta ‘src/main/java’, los recursos en ‘src/main/resourses’ y las pruebas en ‘src/test/java’.

De manera similar a Gradle, Maven es un sistema robusto que cuanta con el archivo ‘pom.xml’ en el cual se definen las dependencias y las configuraciones del proyecto, incluyendo los plugins que se van a utilizar; veamos su composición:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema.instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groudId>com.example</groupId>
<artifactId>my-project</artifactId>
<version>1.0.0</version>
<packaging>jar>/packaging>

<dependencies>
<!-- Dependencias del proyecto -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.12</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>

<build>
<plugins>
<!-- Plugins de construcción -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>

</proyect>

Maven emplea un repositorio central donde almacena una amplia variedad de bibliotecas y artefactos, así, se encarga de descargar automáticamente las bibliotecas necesarias y sus dependencias transitivas simplificando la gestión de dependencias y evitando problemas de compatibilidad.

Elección para gestionar las dependencias

Para poder seleccionar la herramienta adecuada, además de considerar las ventajas y desventajas que vienen consigo, se deben considerar las necesidades del proyecto. Por un lado, Gradle es ideal para proyectos que requieren alta flexibilidad y personalización.

Por el otro, Maven es más adecuado para proyectos que siguen convenciones y requieren una configuración mínima.

En términos de rendimiento, Gradle se destaca por su por eficiencia en el modelo de ejecución y su capacidad para realizar construcciones incrementales, contando con la capacidad de detectar cambios en el código minimizando tiempos en la construcción de aplicaciones a gran escala.

Por su parte, Maven, debido a la preestructura que maneja, genera construcciones más extensas tendiendo a ser menos eficiente en proyectos complejos. Esto afecta de manera similar a la escalabilidad de las aplicaciones, siendo Maven más adecuado para proyectos de tamaño pequeño y medio.

Otro aspecto a tener en cuenta es la popularidad de Maven debido a que cuenta con una comunidad de desarrolladores más robusta que Gradle, contando así con una gran variedad de complementos en su repositorio central, siendo útil para integraciones con tecnologías y bibliotecas comunes en Java.

Independientemente de la elección, ambas herramientas contribuyen a la de gestión dependencias en el desarrollo de software Java debido a su disponibilidad de recursos y tecnologías.

Referencias.

--

--