java - que - ¿Por qué usar Gradle en lugar de Ant o Maven?
gradle vs maven 2018 (9)
Esta no es mi respuesta, pero definitivamente resuena conmigo. Es del radar de tecnología de ThoughtWorks de octubre de 2012 :
Dos cosas han causado fatiga con las herramientas de construcción basadas en XML como Ant y Maven: demasiados refuerzos puntiagudos enojados y la aspereza de las arquitecturas de complementos. Si bien los problemas de sintaxis pueden tratarse a través de la generación, las arquitecturas de complementos limitan severamente la capacidad de las herramientas de construcción para crecer con gracia a medida que los proyectos se vuelven más complejos. Hemos llegado a sentir que los complementos son el nivel incorrecto de abstracción, y en su lugar prefieren herramientas basadas en lenguaje como Gradle y Rake, porque ofrecen abstracciones más precisas y más flexibilidad a largo plazo.
¿Qué me da otra herramienta de compilación dirigida a Java?
Si usas Gradle sobre otra herramienta, ¿por qué?
Esto puede ser un poco controvertido, pero Gradle no oculta el hecho de que se trata de un lenguaje de programación completo.
Ant + ant-contrib es esencialmente un lenguaje de programación completo que nadie quiere programar.
Maven intenta adoptar el enfoque opuesto de tratar de ser completamente declarativo y obligarlo a escribir y compilar un complemento si necesita lógica. También impone un modelo de proyecto que es completamente inflexible. Gradle combina lo mejor de todas estas herramientas:
- Sigue la convención sobre la configuración (ala Maven) pero solo en la medida que lo desee
- Te permite escribir tareas personalizadas flexibles como en Ant
- Proporciona soporte para proyectos de múltiples módulos que es superior tanto a Ant como a Maven
- Tiene un DSL que hace que el 80% sea fácil y el 20% posible (a diferencia de otras herramientas de construcción que hacen que el 80% sea fácil, el 10% posible y el 10% imposible).
Gradle es la herramienta de construcción más configurable y flexible que aún no he utilizado. Requiere un poco de inversión por adelantado para aprender el DSL y conceptos como las configuraciones, pero si necesita una herramienta de creación de JVM sin sentido y completamente configurable, es difícil de superar.
Estoy de acuerdo en parte con Ed Staub. Gradle definitivamente es más poderoso en comparación con Maven y proporciona más flexibilidad a largo plazo.
Después de realizar una evaluación para pasar de Maven a Gradle, decidimos mantenernos en Maven por dos problemas que encontramos con Gradle (la velocidad es más lenta que en Maven, el proxy no funcionaba)
Gradle combina muy bien tanto a Ant como a Maven, sacando lo mejor de ambos marcos. Flexibilidad de Ant y convención sobre configuración, administración de dependencias y complementos de Maven.
Por lo tanto, si desea tener una compilación Java estándar, como en Maven, pero la tarea de prueba tiene que hacer algunos pasos personalizados, podría verse a continuación.
build.gradle:
apply plugin:''java''
task test{
doFirst{
ant.copy(toDir:''build/test-classes''){fileset dir:''src/test/extra-resources''}
}
doLast{
...
}
}
Además de eso, utiliza una sintaxis genial que proporciona mucho más poder de expresión que el xml de ant / maven.
Es un superconjunto de Ant: puede usar todas las tareas de Ant en gradle con una sintaxis más agradable y con estilo, es decir.
ant.copy(file:''a.txt'', toDir:"xyz")
o
ant.with{
delete "x.txt"
mkdir "abc"
copy file:"a.txt", toDir: "abc"
}
Gradle se puede usar para muchos propósitos, es una navaja suiza mucho mejor que Ant, pero se enfoca específicamente en construcciones de proyectos múltiples.
En primer lugar, Gradle es una herramienta de programación de dependencias que también significa que es una herramienta de programación. Con Gradle puede ejecutar cualquier tarea aleatoria en su configuración y Gradle se asegurará de que todas las dependencias declaradas se ejecuten de manera adecuada y oportuna. Su código puede distribuirse en muchos directorios en cualquier tipo de diseño (árbol, plano, disperso, ...).
Gradle tiene dos fases distintas: evaluación y ejecución. Básicamente, durante la evaluación, Gradle buscará y evaluará los scripts de compilación en los directorios que se supone que deben buscar. Durante la ejecución, Gradle ejecutará las tareas que se han cargado durante la evaluación, teniendo en cuenta las interdependencias entre tareas.
Además de estas funciones de programación de dependencias, Gradle agrega funciones de dependencia de proyectos y JAR mediante la integración con Apache Ivy. Como saben, Ivy es una herramienta de gestión de dependencias mucho más poderosa y mucho menos valorada que Maven.
Gradle detecta dependencias entre proyectos y entre proyectos y JARs. Gradle funciona con los repositorios de Maven (descarga y carga) como iBiblio o sus propios repositorios, pero también admite y otro tipo de infraestructura de repositorio que pueda tener.
En construcciones de proyectos múltiples, Gradle es adaptable y se adapta a la estructura y arquitectura de la construcción. No tiene que adaptar su estructura o arquitectura a su herramienta de construcción, como se requeriría con Maven.
Gradle hace un gran esfuerzo para no interponerse en tu camino, un esfuerzo que Maven casi nunca hace. La convención es buena, pero también lo es la flexibilidad. Gradle le ofrece muchas más funciones que Maven, pero lo más importante es que en muchos casos, Gradle le ofrecerá una transición indolora lejos de Maven.
Gradle volvió a poner la diversión en el software de construcción / montaje. Utilicé ant para construir software durante toda mi carrera y siempre he considerado que la parte real "buildit" del trabajo de desarrollo es un mal necesario. Hace unos meses, nuestra compañía se cansó de no usar un repositorio binario (también conocido como registrar los frascos en el vcs) y me dieron la tarea de investigar esto. Comenzó con hiedra, ya que podía ser atornillada encima de hormiga, no tuve mucha suerte al publicar mis artefactos construidos como quería. Fui a Maven y corté con xml, trabajé espléndidamente para algunas librerías simples de ayuda, pero tuve problemas serios al tratar de agrupar aplicaciones listas para su implementación. Solté un buen rato en los complementos de Google y en los foros de lectura y terminé descargando billones de archivos de soporte para varios complementos que me costó mucho usar. Finalmente fui por Gradle (me puse bastante amargado en este punto y me molesté porque "¡No debería ser ESTO difícil!")
Pero desde el primer día mi estado de ánimo comenzó a mejorar. Estaba llegando a alguna parte. Tardé unas dos horas en migrar mi primer módulo ant y el archivo de compilación era básicamente nada. Fácilmente montado una pantalla. El gran "wow" era: crear scripts en xml, ¿qué tan estúpido es eso? el hecho de que declarar una dependencia tome UNA fila es muy atractivo para mí -> puede ver fácilmente todas las dependencias para un determinado proyecto en una página. Desde entonces, he estado en un rollo constante, por cada problema que enfrenté hasta ahora hay una solución simple y elegante. Creo que estas son las razones:
- groovy es muy intuitivo para desarrolladores de java
- la documentación es genial para impresionante
- la flexibilidad es infinita
Ahora paso mis días tratando de idear nuevas características para agregar a nuestro proceso de compilación. ¿Qué tan enfermo es eso?
También es mucho más fácil administrar construcciones nativas. Ant y Maven son efectivamente solo en Java. Existen algunos complementos para Maven que intentan manejar algunos proyectos nativos, pero no hacen un trabajo efectivo. Se pueden escribir tareas de Ant que compilan proyectos nativos, pero son demasiado complejos e incómodos.
Hacemos Java con JNI y muchos otros bits nativos. Gradle simplificó nuestro desorden de hormigas considerablemente. Cuando comenzamos a introducir la gestión de dependencias en los proyectos nativos, era complicado. Conseguimos que Maven lo hiciera, pero el código Gradle equivalente era una pequeña fracción de lo que se necesitaba en Maven, y la gente podía leerlo y entenderlo sin convertirse en gurús de Maven.
Usamos Gradle y lo elegimos sobre Maven y Ant. Ant nos dio total flexibilidad, e Ivy ofrece una mejor administración de dependencias que Maven, pero no hay un gran soporte para las construcciones de proyectos múltiples. Terminas haciendo una gran cantidad de codificación para soportar construcciones multiproyecto. Además, tener un poco de compilación por convención es bueno y hace que los scripts de compilación sean más concisos. Con Maven, lleva la construcción por convención demasiado lejos, y personalizar su proceso de construcción se convierte en un truco. Además, Maven promueve cada proyecto publicando un artefacto. A veces, tiene un proyecto dividido en subproyectos, pero desea que todos los subproyectos se construyan y versionen juntos. Realmente no es algo para lo que Maven está diseñado.
Con Gradle puedes tener la flexibilidad de Ant y construir por convención de Maven. Por ejemplo, es trivial extender el ciclo de vida de construcción convencional con su propia tarea. Y no estás obligado a usar una convención si no quieres. Groovy es mucho mejor para codificar que XML. En Gradle, puede definir dependencias entre proyectos en el sistema de archivos local sin la necesidad de publicar artefactos para cada uno en un repositorio. Finalmente, Gradle usa Ivy, por lo que tiene una excelente gestión de dependencias. El único inconveniente real para mí hasta ahora es la falta de integración madura de Eclipse, pero las opciones para Maven no son mucho mejores.
Yo no uso Gradle con ira (solo un proyecto de juguete hasta ahora) [el autor significa que han usado Gradle solo en un proyecto de juguete hasta ahora, no que Gradle sea un proyecto de juguete, vea los comentarios] , pero diría que Las razones por las que uno consideraría usarlo serían las frustraciones de Ant y Maven.
En mi experiencia, Ant es a menudo de solo escritura (sí, sé que es posible escribir construcciones elegantes y modulares , pero el hecho es que la mayoría de la gente no). Para cualquier proyecto que no sea trivial, se convierte en un alucinante, y tiene mucho cuidado para garantizar que las construcciones complejas sean verdaderamente portátiles. Su naturaleza imperativa puede llevar a la replicación de la configuración entre compilaciones (aunque las macros pueden ayudar aquí).
Maven toma el enfoque opuesto y espera que se integre completamente con el ciclo de vida de Maven. Los usuarios experimentados de Ant encuentran esto particularmente perturbador ya que Maven elimina muchas de las libertades que tienes en Ant. Por ejemplo, hay un blog de Sonatype que enumera muchas de las críticas de Maven y sus respuestas.
El mecanismo del complemento de Maven permite configuraciones de compilación muy potentes, y el modelo de herencia significa que puede definir un pequeño conjunto de POM principales que encapsulan sus configuraciones de compilación para toda la empresa y los proyectos individuales pueden heredar esas configuraciones, dejándolas ligeras. La configuración de Maven es muy detallada (aunque Maven 3 promete resolver esto), y si quiere hacer algo que no sea "a la manera de Maven", tiene que escribir un complemento o usar la integración de hackers Ant. Tenga en cuenta que me gusta escribir complementos de Maven pero aprecio que muchos objetarán el esfuerzo involucrado.
Gradle promete llegar al punto dulce entre Ant y Maven. Utiliza el enfoque de Ivy para la resolución de dependencias. Permite la convención sobre la configuración, pero también incluye tareas Ant como ciudadanos de primera clase. También le permite usar sabiamente los repositorios existentes de Maven / Ivy.
Por lo tanto, si ha golpeado y se ha quedado atascado con cualquiera de los puntos de dolor de Ant / Maven, probablemente valga la pena probar Gradle, aunque en mi opinión queda por verse si no estaría intercambiando problemas conocidos por otros desconocidos. Sin embargo, la prueba del pudín está en la comida, así que me reservo el juicio hasta que el producto sea un poco más maduro y otros hayan resuelto cualquier problema (lo llaman por su razón). Sin embargo, seguiré usándolo en mis proyectos de juguetes. Siempre es bueno estar al tanto de las opciones.