¿Por qué maven? ¿Cuales son los beneficios? [cerrado]

131

¿Cuáles son los principales beneficios de usar maven en comparación con digamos hormiga? Parece ser más una molestia que una herramienta útil. Utilizo maven 2, con Eclipse Java EE simple (sin m2eclipse) y tomcat.

Los partidarios de Maven creen que

  1. Maven te permite obtener fácilmente las dependencias de tus paquetes

  2. Maven te obliga a tener una estructura de directorio estándar

En mi experiencia

  1. Averiguar las dependencias del paquete no es realmente tan difícil. Raramente lo haces de todos modos. Probablemente una vez durante la configuración del proyecto y algunas más durante las actualizaciones. Con Maven, terminarás arreglando dependencias no coincidentes, poms mal escritos y haciendo exclusiones de paquetes de todos modos.

  2. Lento ciclo FIX-COMPILE-DEPLOY-DEBUG, que mata la productividad. Esta es mi queja principal. Realizas un cambio, tienes que esperar a que comience la construcción de Maven y esperar a que se implemente. Sin despliegue en caliente en absoluto.

¿O simplemente lo estoy haciendo mal? Por favor, apúntame en la dirección correcta, soy todo oídos.

trix
fuente
1
Estoy realmente interesado en el punto 2. ¿Alguien más nota el lento ciclo de reparación-compilación-implementación? o todo el mundo lo sabe, pero se queda callado al respecto, ya que Maven es lo mejor que tenemos / lo más común / lo más genial. Crear una guerra / oído para desplegar es bastante malo, Maven lo está empeorando. ¿Tarda 5 segundos en mi máquina para ver un cambio de jsp en un proyecto maven, en una estructura de directorio explotada? menos de 1 seg. Puedo guardar varias veces, y solo compila el último cambio, ¿en Maven? cada guardado desencadena una construcción.
Trix
Tal vez Maven no es el problema aquí, ¿pero el soporte / complemento IDE? Sin embargo, Maven ha existido por bastante tiempo, si no podemos hacerlo bien, ¿deberíamos movernos / inventar / proponer algo más? además de Ivy
trix
2
@Javid Si bien el título de la pregunta es similar, el cuerpo de la pregunta es diferente de la OMI y no lo considero un tonto.
Pascal Thivent
Por un segundo sonaba como si estuviera hablando NuGet ...
micahhoover

Respuestas:

108

Averiguar las dependencias del paquete no es realmente tan difícil. Raramente lo haces de todos modos. Probablemente una vez durante la configuración del proyecto y algunas más durante las actualizaciones. Con Maven, terminarás arreglando dependencias no coincidentes, poms mal escritos y haciendo exclusiones de paquetes de todos modos.

No es tan difícil ... para proyectos de juguetes. Pero los proyectos en los que trabajo tienen muchos, muchos, y estoy muy contento de obtenerlos de manera transitiva, de tener un esquema de nombres estandarizado para ellos. Gestionar todo esto manualmente a mano sería una pesadilla.

Y sí, a veces tienes que trabajar en la convergencia de dependencias. Pero piénselo dos veces, esto no es inherente a Maven, es inherente a cualquier sistema que use dependencias (y estoy hablando de las dependencias de Java en general aquí).

Entonces, con Ant, debe hacer el mismo trabajo, excepto que debe hacer todo manualmente: tomar alguna versión del proyecto A y sus dependencias, tomar alguna versión del proyecto B y sus dependencias, averiguar qué versiones exactas usan, verificar que no se superponen, comprobando que no son incompatibles, etc. Bienvenido al infierno.

Por otro lado, Maven admite la gestión de dependencias y las recuperará de forma transitiva para mí y me proporciona las herramientas que necesito para gestionar la complejidad inherente a la gestión de dependencias : puedo analizar un árbol de dependencias, controlar las versiones utilizadas en dependencias transitivas, excluir algunas de ellos si es necesario, controlar la converger en módulos, etc. no hay magia. Pero al menos tienes apoyo.

Y no olvide que la gestión de dependencias es solo una pequeña parte de lo que ofrece Maven, hay mucho más (sin mencionar las otras herramientas que se integran muy bien con Maven, por ejemplo, Sonar ).

Lento ciclo FIX-COMPILE-DEPLOY-DEBUG, que mata la productividad. Esta es mi queja principal. Realizas un cambio, tienes que esperar a que comience la construcción de Maven y esperar a que se implemente. Sin despliegue en caliente en absoluto.

Primero, ¿por qué usas Maven así? Yo no. Utilizo mi IDE para escribir pruebas, codificar hasta que pasen, refactorizar, implementar, implementar en caliente y ejecutar una compilación local de Maven cuando haya terminado, antes de comprometerme, para asegurarme de que no romperé la compilación continua.

En segundo lugar, no estoy seguro de que usar Ant mejoraría mucho las cosas. Y según mi experiencia, las compilaciones modulares de Maven que utilizan dependencias binarias me dan un tiempo de compilación más rápido que las compilaciones típicas de Ant monolíticas. De todos modos, eche un vistazo a Maven Shell para un entorno listo para (re) usar Maven (que por cierto es increíble).

Así que al final, y lamento decirlo, no es realmente Maven lo que está matando su productividad, es el uso indebido de sus herramientas. Y si no estás contento con eso, bueno, qué puedo decir, no lo uses. Personalmente, uso Maven desde 2003 y nunca miré hacia atrás.

Pascal Thivent
fuente
@Pascal, ¿puedes decir qué herramientas estás usando? IDE, complementos, etc. ¿Nos está diciendo que si cambio un archivo .properties o un archivo jsp, este se implementará en caliente sin hacer una compilación maven? (tal vez la implementación en caliente no es el término correcto aquí). No estaba claro a qué me refería con hormiga. Me refería a usar el directorio explotado estándar durante el desarrollo y usar ant para crear un war / ear antes del lanzamiento. Para un directorio explotado, las reglas son simples, copie / compile archivos de src a clases y no toque el resto.
Trix
continúa ... Sin embargo, en mis proyectos, lo que se implementa en Tomcat son los frascos de los módulos. Si cambio un .jsp, ¿maven no tiene que reconstruir esos frascos?
Trix
44
Tienes que admitir que la mayoría de los proyectos son proyectos de juguetes, es decir, dependencias simples. Eso es solo ley de estadísticas.
Trix
2
@trix, sobre la implementación en caliente de ant vs maven: si no está haciendo una compilación de hormigas para la implementación en caliente, ¿por qué está utilizando Maven para lo mismo? Supongo que si usas hormiga por lo mismo, tomaría al menos la misma cantidad de tiempo ... ¿no?
Reddy
2
Entonces, Pascal, ¿podría decirnos cómo tiene configurado un proyecto para la naturaleza de Maven y no utilizar el proceso de construcción para implementar? Este es el punto 2 de la pregunta inicial. Me pregunto cómo hacer eso, así que realmente agradezco si puede darnos una explicación clara.
20

Maven puede considerarse como una herramienta de desarrollo de proyectos completa, no solo una herramienta de construcción como Ant. Debe usar Eclipse IDE con el complemento Maven para solucionar todos sus problemas.

Aquí hay algunas ventajas de Maven, citadas en la página Beneficios de usar Maven :

Henning

  • configuración rápida del proyecto, sin archivos build.xml complicados, solo un POM y listo
  • Todos los desarrolladores en un proyecto usan las mismas dependencias jar debido a POM centralizado.
  • obtener una serie de informes y métricas para un proyecto "gratis"
  • reducir el tamaño de las distribuciones de origen, porque los frascos se pueden extraer de una ubicación central

Emmanuel Venisse

  • hay muchos objetivos disponibles, por lo que no es necesario desarrollar una parte específica del proceso de compilación, a diferencia de ANT, podemos reutilizar las tareas ANT existentes en el proceso de compilación con un complemento antrun

Jesse Mcconnell

  • Promueve el diseño modular de código. Al simplificar la gestión de proyectos múltiples, permite que el diseño se distribuya en varias partes lógicas, entrelazando estas partes mediante el uso del seguimiento de dependencias en archivos pom.
  • Aplica el diseño modular de código. es fácil pagar el servicio modular al código modular, pero cuando el código se encuentra en proyectos de compilación separados, es imposible cruzar referencias cruzadas entre módulos de código a menos que lo permita específicamente en su gestión de dependencias ... no hay simplemente haga esto ahora y corríjalo más tarde 'implementaciones.
  • La gestión de dependencias está claramente declarada. con el mecanismo de administración de dependencias, tiene que intentar arruinar el control de versiones de su jar ... no hay ninguno de los problemas clásicos de '¿qué versión de este jar de proveedor es esta?' Y configurarlo en un proyecto existente arranca la parte superior del desorden existente si existe cuando se ve obligado a hacer versiones 'desconocidas' en su repositorio para poner las cosas en marcha ... eso o mentirse a sí mismo que conoce el versión actual de ABC.jar.
  • Ciclo de vida de tipo fuerte: hay un ciclo de vida definido y definido por el cual un sistema de software pasa desde el inicio de una construcción hasta el final ... y los usuarios pueden mezclar y combinar su sistema con el ciclo de vida en lugar de improvisar su propio ciclo de vida. Esto tiene el beneficio adicional de permitir que las personas se muevan de un proyecto a otro y hablen usando el mismo vocabulario en términos de desarrollo de software.

Vincent Massol

  • Mayor impulso: Ant ahora es legado y no avanza rápidamente. Maven avanza rápidamente y existe la posibilidad de tener muchas herramientas de alto valor en torno a Maven (CI, proyecto de tablero, integración IDE, etc.).
YoK
fuente
55
Mientras se vota hacia abajo, por favor proporcione la razón, esa no es una regla ética sino dicha en stackoverflow.
YoK
1
No hay nada de malo en las referencias, pero realmente debe dejar en claro que el contenido no es suyo.
Pascal Thivent
Gracias. Me aseguraré de citarlo además de mencionar de dónde se hizo referencia. solo 30 días impares en stackoverflow y todavía aprendiendo el arte :).
YoK
11

Averiguar dependencias para pequeños proyectos no es difícil. Pero una vez que comience a lidiar con un árbol de dependencia con cientos de dependencias, las cosas pueden salirse fácilmente de control. (Estoy hablando por experiencia aquí ...)

El otro punto es que si usa un IDE con compilación incremental y soporte Maven (como Eclipse + m2eclipse), entonces debería poder configurar editar / compilar / implementar en caliente y probar.

Yo personalmente no hago esto porque he llegado a desconfiar de este modo de desarrollo debido a malas experiencias en el pasado (pre Maven). Quizás alguien pueda comentar si esto realmente funciona con Eclipse + m2eclipse.

Stephen C
fuente
Uno podría comenzar con Maven para obtener todas las dependencias y luego copiar las dependencias a su proyecto, ¿verdad?
Trix
2
Supongo que podrías. Pero eso podría romperse si actualiza las dependencias de su proyecto ... o si su proyecto dependía de instantáneas.
Stephen C
Me refiero a tener 2 proyectos, el único propósito del proyecto maven es obtener dependencias. Use el control de versiones para realizar un seguimiento de los cambios entre las actualizaciones de dependencia. Hago esto de todos modos, solo para poder ver los cambios, en caso de que rompa mi compilación.
Trix
44
Ughh No es así como Maven está diseñado para ser utilizado. Uno de los grandes beneficios de Maven es evitar el control de las bibliotecas dependientes en el control de versiones. Con su enfoque, saturará su VCS con muchas versiones de muchos archivos binarios. Y algunos VCS son particularmente malos para manejar archivos binarios.
Stephen C
2
En general, se aprende de la manera más difícil a cansarse de cualquier tipo de magia al escribir programas: -S
Thorbjørn Ravn Andersen
9

Maven es una de las herramientas en las que necesita decidir de antemano si le gusta y quiere usarlo, ya que pasará bastante tiempo aprendiéndolo, y haber tomado dicha decisión de una vez por todas le permitirá omitir todo tipo de dudas mientras aprendes (¡porque te gusta y quieres usarlo!)

Las convenciones fuertes ayudan en muchos lugares, como Hudson, que puede hacer maravillas con los proyectos de Maven, pero puede ser difícil de ver al principio.

editar: a partir de 2016, Maven es la única herramienta de compilación de Java donde los tres IDE principales pueden usar las fuentes de fábrica. En otras palabras, el uso de maven hace que su compilación sea independiente de IDE. Esto permite, por ejemplo, usar perfiles Netbeans incluso si normalmente trabaja en eclipse

Thorbjørn Ravn Andersen
fuente
1
Y lo contrario también es cierto, una gran cantidad de gente viene a experto de odio preconcebida, porque no es de hormigas, etc.
Goibniu
¿Lo contrario? ¿Quiere decir?
Thorbjørn Ravn Andersen
9

Las ventajas de Maven sobre las hormigas son bastantes. Intento resumirlos aquí.

La Convención sobre la configuración de
Maven utiliza un enfoque distintivo para el diseño y el inicio del proyecto, que facilita el salto a un proyecto. Por lo general, solo se necesita el comando checkount y el comando maven para obtener los artefactos del proyecto.

Modularización del
proyecto Las convenciones del proyecto sugieren (o mejor, obligan) al desarrollador a modularizar el proyecto. En lugar de un proyecto monolítico, a menudo se ve obligado a dividir su proyecto en subcomponentes más pequeños, lo que facilita la depuración y la administración de la estructura general del proyecto.

Gestión de dependencias y ciclo de vida del proyecto
En general, con una buena configuración de SCM y un repositorio interno, la gestión de dependencias es bastante fácil, y nuevamente se ve obligado a pensar en términos de Project Lifecycle: versiones de componentes, gestión de versiones, etc. Un poco más complejo que la hormiga algo, pero de nuevo, una mejora en la calidad del proyecto.

¿Qué le pasa a Maven?
Maven no es fácil. El ciclo de construcción (qué se hace y cuándo) no está tan claro dentro del POM. Además, surgen algunos problemas con la calidad de los componentes y las dependencias que faltan en los repositorios públicos.
El mejor enfoque (para mí) es tener un repositorio interno para almacenar en caché (y mantener) las dependencias, y aplicar para la gestión de liberación de componentes. Para proyectos más grandes que los proyectos de muestra en un libro, agradecerá a maven antes o después

Luca Botti
fuente
6

Maven puede proporcionar beneficios para su proceso de construcción mediante el uso de convenciones y prácticas estándar para acelerar su ciclo de desarrollo y, al mismo tiempo, ayudarlo a lograr una mayor tasa de éxito. Para una visión más detallada de cómo Maven puede ayudarlo con su proceso de desarrollo, consulte Los beneficios de usar Maven.

usuario433555
fuente
3

Maven es una poderosa herramienta de gestión de proyectos que se basa en POM (modelo de objetos de proyecto). Se utiliza para proyectos de construcción, dependencia y documentación. Simplifica el proceso de construcción como ANT. Pero está demasiado avanzado que ANT. Maven ayuda a gestionar: Compilaciones, Documentación, Reporing, SCM, Lanzamientos, Distribución. - El repositorio maven es un directorio de archivos JAR empaquetados con el archivo pom.xml. Maven busca dependencias en los repositorios.

Nikhil Pahariya
fuente
2

Nunca he encontrado el punto 2? ¿Puede explicar por qué cree que esto afecta la implementación de alguna manera? Si algo le permite estructurar sus proyectos de una manera modular que realmente permita soluciones rápidas para errores en un nivel particular, y permite el desarrollo independiente de una API del resto del proyecto, por ejemplo.

Es posible que esté intentando agrupar todo en un solo módulo, en cuyo caso el problema no es realmente maven, sino la forma en que lo está utilizando.

Goibniu
fuente
Estoy usando el eclipse simple jee, maven 2 y tomcat. Obviamente una aplicación web. Si estoy cambiando un archivo de propiedades, o un jsp, para ver mis cambios en Tomcat, Maven tiene que hacer su construcción, crear un war / ear e implementarlo en Tomcat. Esto es lento en comparación con si uso una estructura de directorios explotada.
Trix
1
@trix La implementación en caliente bajo Eclipse con Tomcat simplemente funciona. Lo estás haciendo mal.
Pascal Thivent
0

Esto debería haber sido un comentario, pero no encajaba en la longitud de un comentario, así que lo publiqué como respuesta.

Todos los beneficios mencionados en otras respuestas son alcanzables por medios más simples que el uso de Maven. Si, por ejemplo, es nuevo en un proyecto, de todos modos pasará más tiempo creando arquitectura de proyecto, uniendo componentes, codificando que descargando archivos jar y copiándolos a la carpeta lib. Si tiene experiencia en su dominio, ya sabe cómo comenzar el proyecto con qué bibliotecas. No veo ningún beneficio de usar maven, especialmente cuando plantea muchos problemas al hacer automáticamente la "gestión de dependencias".

Solo tengo conocimiento de nivel intermedio de maven, pero te digo que he realizado grandes proyectos (como ERP) sin usar maven.

Syed Aqeel Ashiq
fuente