Herramientas

Gradle vs Maven

En este articulo ponemos cara a cara estas dos herramientas analizando las principales ventajas e inconvenientes de cada una. ¿Con cuál te quedas?

Publicado el 14 de Mayo de 2019
Compartir

En el mundo de la programación en Java, el líder para el desarrollo de software durante un tiempo considerable ha sido Maven. Esta conocida herramienta para la construcción de software y gestión de proyectos, creada en el año 2002 y de similar funcionalidad a Apache Ant (y en menor medida a PEAR de PHP y CPAN de Perl), teniendo un modelo de configuración de construcción más simple y basado en un formato XML.

Hoy en día, ha llegado el momento de dejar atrás los interminables archivos XML de configuración y dar paso a algo más moderno y potente como lo es Gradle. Esta herramienta, que permite la automatización de la compilación de código abierto, se encuentra centrada en la flexibilidad y el rendimiento. Adicionalmente, es importante destacar que los scripts de compilación de Gradle se escriben utilizando Groovy o Kotlin DSL (Domain Specific Language).

En este artículo te ofreceremos un resumen de las principales diferencias entre Gradle y Apache Maven en cuanto a rendimiento, flexibilidad, gestión de dependencias y experiencia de usuario.

Flexibilidad

Gradle es muy flexible ya que se basa en un guión, por ende las compilaciones personalizadas son fáciles de hacer; el modelo de Gradle permite su uso para el desarrollo con lenguajes nativos como por ejemplo C y C++, además se puede ampliar para abarcar otros lenguajes con la ayuda de sus herramientas a través de su API.
Tanto Gradle como Maven brindan un patrón sobre su configuración, sin embargo, Maven proporciona un modelo muy rígido que hace que la personalización sea tediosa y en ocasiones imposible. Si bien esto puede facilitar la comprensión de cualquier compilación Maven, siempre que no tenga requisitos especiales, también lo hace inadecuado para muchos problemas de automatización.

Imagen 0 en Gradle vs Maven
Esta imagen muestra una construcción limpia de lado a lado, de la biblioteca Apache Commons Lang utilizando Maven y Gradle (sin memoria caché de compilación). A través del siguiente link podrás ver el escaneo de compilación.

Rendimiento

Mejorar el tiempo de construcción es una de los objetivos principales tanto para Gradle como para Maven, las mayores diferencias se encuentran en las ventajas y novedades con las que cuenta Gradle para evitar rehacer el trabajo y volver a procesar los archivos y, de esta forma, incrementar la productividad. Existen tres (3) características principales que podemos destacar las cuales hacen a Gradle mucho más rápido en comparación con Maven como son las siguientes:

  • Construcción Incremental: Gradle permite la construcción incremental ya que en el proceso de compilación de las tareas valida si la entrada o la salida ha cambiado. En caso de no existir algún cambio la considera actualizada y no se ejecuta, en caso contrario (que exista alguna actualización de entrada o salida) sólo procesará los archivos que presenten una modificación.

  • Caché de Compilación: reutiliza las salidas de las tareas de Gradle de forma local y comparte salidas de tareas entre las máquinas, lo que conlleva que, en la mayoría de los casos, acelere el tiempo promedio de compilación.

  • Gradle Daemon: es un proceso de larga duración que ejecuta las compilaciones de forma rápida, logrando evitar el tedioso proceso de arranque manteniendo los datos del proyecto en la memoria.

Estas y otras características de rendimiento, que podemos encontrar ingresando a través del siguiente enlace, hacen que Gradle sea al menos el doble de rápido en casi todos los escenarios y cien (100) veces más veloz para grandes construcciones que utilizan la memoria caché de compilación.

Experiencia de usuario

La larga permanencia de Maven se debe a que su soporte a través de los IDEs sea considerado el mejor para muchos usuarios. Sin embargo, el soporte IDE de Gradle continúa mejorando rápidamente. Por ejemplo, Gradle actualmente tiene una DSL basada en Kotlin que proporciona una experiencia IDE mucho mejor, es relevante mencionar que el equipo de Gradle está trabajando con los fabricantes de IDE para mejorar la compatibilidad de edición.

Aunque los IDEs son importantes, una gran cantidad de usuarios prefieren ejecutar operaciones de compilación a través de una interfaz de línea de comandos, Gradle proporciona una CLI (Command Line Interface / Interfaz de Línea de Comandos) moderna que cuenta con características como “tareas de Gradle”, así como también un mejor registro de las líneas de comandos.

Imagen 1 en Gradle vs Maven

Finalmente, Gradle proporciona una interfaz de usuario interactiva, basada en la web para depurar y optimizar construcciones destacando en este punto los escaneos de compilación. Además, las construcciones pueden ser alojadas en el sitio oficial y así permitir que una organización recolecte el historial de compilación y realice análisis de las tendencias, compare las compilaciones para la depuración u optimice los tiempos de compilación

Imagen 2 en Gradle vs Maven

Gestión de Dependencias

Ambos sistemas de compilación ofrecen capacidad integrada para resolver dependencias de repositorios configurables y pueden almacenar en caché las dependencias localmente y descargarlas en paralelo.

Como consumidor de la biblioteca, Maven permite anular una dependencia pero solo por versión. Por su parte, Gradle proporciona selección de dependencias personalizables y reglas de sustitución. El mecanismo de sustitución permite a Gradle construir múltiples proyectos fuente, para crear compilaciones compuestas.

En cuanto a Maven, este tiene pocos ámbitos de dependencia incorporados, lo que obliga a que las arquitecturas de los módulos sean poco prácticas en escenarios comunes, como el uso de dispositivos de prueba o generación de código. Así mismo, no hay separación entre la unidad y las pruebas de integración, por ejemplo: Gradle permite ámbitos de dependencia personalizados como se mencionó anteriormente, lo que proporciona versiones más rápidas y mejor modeladas.

Como productor de la biblioteca, Gradle permite declarar las dependencias “api” e “implementation” para evitar que las bibliotecas no deseadas se filtren en los classpaths de los consumidores, la configuración de “api” se debe usar para declarar las dependencias que exporta la API de la biblioteca, mientras que la configuración de “implementation” se debe utilizar para declarar las dependencias que son internas al componente; mientras que Maven permite a los editores proporcionar metadatos a través de dependencias opcionales.

Si requieres mayor detalle puedes consultar la lista de características Gradle y Gradle vs Maven comparación de rendimiento del sitio oficial para obtener más información al respecto.

Aprende todo lo que necesitas para trabajar con proyectos que usen Apache Maven y conoce las soluciones que hay que usar para resolver los problemas más frecuentes que pueden ocurrir.

cta-blog-curso-maven

Recuerda que puedes comenzar este curso con tu suscripción de OpenWebinars. Si todavía no estás suscrito, aprovecha para hacerlo ahora.


Compartir este post

También te puede interesar...

Curso de Maven

Curso de Maven

4 horas y 55 minutos · Curso

Aprende todo lo que necesitas para trabajar con proyectos que usen Apache Maven y conoce las soluciones que hay que usar para resolver los problemas …

  • Herramientas
Artículos
Ver todos