¿Maven es similar a npm?

84

Como he trabajado con npm, que busca dependencias en el archivo package.json y lo descarga por usted. Del mismo modo, veo un archivo pom.xml en el proyecto Java. ¿Maven busca en este archivo y descarga las dependencias por mí? ¿Puedo pasar este archivo pom.xml como package.json, en lugar de dar los frascos de dependencia? ¿Son estas herramientas similares y solo están diseñadas para diferentes plataformas?

Shubham Jain
fuente

Respuestas:

124

¿Misma herramienta, diferente idioma?

Maven es la herramienta de resolución de dependencia y compilación más popular para Java, al igual que NPM lo es para JS. Pero no es solo la misma herramienta para un idioma diferente. Obviamente, existen grandes diferencias entre las compilaciones de Java y JS, y estas diferencias son directamente visibles en la forma en que opera Maven. Por ejemplo, mientras que muchas herramientas JS dependen de Git para hacer un trabajo pesado, Maven trabaja con repositorios Maven personalizados basados ​​en sistemas de archivos, ya que Maven es anterior a Git y necesita manejar artefactos binarios, que Git históricamente no manejaba bien. En Maven hay una clara separación entre fuentes y binarios, mientras que a menudo son lo mismo en el mundo JS.

Conceptos básicos de Maven

Maven en su forma más pura sigue un modelo declarativo, donde pom.xml(similar a package.json) define diferentes propiedades de la construcción, pero no contiene scripts. La desventaja es que puede ser un desafío ajustar algunos aspectos de la compilación sin usar scripts, ya que debe depender de los complementos. La ventaja es que puede ser más fácil entender otras compilaciones con solo mirarlas pom.xml, ya que generalmente siguen el mismo enfoque sin demasiada personalización. Gradle es una herramienta popular basada en Groovy construida sobre los estándares y convenciones de Maven, y está específicamente diseñada para simplificar pom.xmly romper esta barrera de "no escritura".

Haciendo referencia a sus dependencias

De manera similar package.json, no trabaja pom.xmldirectamente con su dependencia, sino que define las coordenadas de dependencia y deja que su herramienta de construcción se encargue del resto. En Maven, la forma básica de estas coordenadas es GAV (groupId, artifactId, version).

¿Árbol de dependencia plano?

Según los comentarios de la otra respuesta, Maven proporciona un "árbol de dependencia plano", no un "árbol de dependencia anidado" que NPM proporciona de forma predeterminada. Maven no permite múltiples versiones de la misma dependencia. Si sucede que se solicitan diferentes versiones, Maven usa la resolución de dependencia para elegir una sola versión. Esto significa que a veces sus dependencias transitivas obtendrán una versión diferente a la que requieren, pero hay formas de gestionar esto. Sin embargo, esta limitación proviene de Java, no de Maven, ya que (normalmente) en Java un cargador de clases solo proporcionará acceso a una única definición de clase incluso si se encuentran varias definiciones en la ruta de clases. Dado que Java no es particularmente bueno para manejar esto, Maven intenta evitar este escenario en primer lugar.

Nota: desde npm v3, las dependencias se aplanan. El hilo del administrador de paquetes alternativo también hace lo mismo.

Madurez

Además, Maven es considerablemente más antiguo que NPM, tiene una base de usuarios más grande, una gran cantidad de complementos personalizados y, hasta ahora, probablemente podría considerarse más maduro en general. A veces, Maven se utiliza para proyectos que no son de Java o incluso políglotas, ya que existen complementos para manejar otros lenguajes o entornos específicos, como Android. Hay complementos que unen a Maven y otras herramientas de compilación, como frontend-maven-plugin, que en realidad maneja múltiples herramientas de compilación JS.

Anton Koscejev
fuente
4
Además de la información anterior, la siguiente lista de reproducción de Youtube hace un gran trabajo al describir el uso de Maven como administrador de paquetes
Tommy Thompson
1
A menudo visito npmjs.com para buscar un paquete que pueda ser útil. Se necesitó bastante buscar en Google para encontrar un enlace para hacer esto en Maven ( search.maven.org ). Sin embargo, las búsquedas no me dirigen a documentos, no me muestran métricas de popularidad, no apuntan a github. No lo encuentro útil, sugiriendo que esto es algo que la gente espera de NPM pero no de Maven.
Joe Lapp
Una comparación estadística bastante buena entre NPM y Maven está aquí: stackshare.io/stackups/npm-vs-gradle
cacoder
1
Una actualización de esta respuesta: "Además, Maven es considerablemente más antiguo que NPM, tiene una base de usuarios más grande ..." Esto probablemente era cierto cuando la pregunta se respondió originalmente en 2017, pero ya no es precisa. Según el enlace publicado por @cacoder, la base de usuarios de NPM es ahora aproximadamente 11 veces más grande que la de Maven. Fuente: stackshare.io/stackups/gradle-vs-maven-vs-npm
mnutsch
28

A continuación, utilizo |para separar entre maven | términos npm respectivamente:

Características comunes:

  • Ambas herramientas admiten la búsqueda dinámica de dependencias ( artefactos | paquetes ) en función de un archivo descriptor pom.xml| package.jsony también le permite implementar | publica tus propios artefactos | paquetes .

  • Ambos tienen un repositorio público predeterminado | registro ( http://repo.maven.apache.org/maven2/ | https://registry.npmjs.org ), pero también se puede utilizar un tercero (a través de settings.xml|.npmrc ).

  • Ambos admiten el concepto de dependencias de nivel de compilación (complementos | devDependencies utilizados en scripts) . * Maven providedtambién admite dependencias, pero esto no parece aplicarse a npm, ya que javascript rara vez se implementa en contenedores.

  • Ambos admiten el espacio de nombres de dependencia: groupId|scope

Diferencias:

  • maven tiene un repositorio local adicional (caché):

    • No es necesario recuperar la misma dependencia para diferentes proyectos.
    • Otros proyectos locales pueden acceder automáticamente a los artefactos que se instalan localmente.
  • las dependencias de una compilación de proyecto en maven se descargan en <homedir>/.m2. Con npm se descargan en formato <projectdir>/node_modules.

  • La construcción en maven es comúnmente un proceso de un solo paso : mvn package(buscar deps, construir). En npm es un proceso de 2 pasos: npm install(buscar deps), npm build(compilar)

  • maven define los ciclos de vida de compilación (para compilación , prueba, implementación) que constan de fases, a las que se adjuntan las operaciones predeterminadas (objetivos del complemento) , a partir de opciones de embalaje (differrent .jar, .war, .earetc). Luego puede sobrescribir estas operaciones o inyectar otras nuevas (a través del sistema de complementos). Esto proporciona una especie de solución lista para
    usar para compilar, docgen, probar, implementar, etc.El enfoque npm es más simplista (ver: scripts )

  • Debido a lo anterior, npm está etiquetado como una herramienta de administración de paquetes para javascript, mientras que maven está etiquetado como una herramienta de automatización de compilación y administración de dependencias para java .

  • En la configuración de maven, el proceso de compilación suele implicar la edición del archivopom.xml .
    En npm implica escribir código o configurar herramientas de compilación complementarias como gulp, webpacketc.

  • Por alguna razón , rangos de versiones definidos por los usuarios en los módulos npm son mucho más flexibles que en maven. Esto puede causar problemas con las dependencias transitivas, es por eso que recientemente se agregó un archivo adicional:package-lock.json

  • Con npm es mucho más sencillo para iniciar un nuevo proyecto: npm init. Con maven, necesitas saber cómo escribir un mínimo pom.xmlo leer sobre arquetipos.

  • En general, es mucho más común editar pom.xmlque package.json. Por ejemplo, añadiendo dependencias de Maven se hace manualmente (o mediante IDE) mientras está en npm mediante la línea de comandos .

  • Al igual que con todas las herramientas de construcción, puede llamar a una herramienta desde dentro de la otra, pero creo que es mucho más común llamar npm desde dentro de Maven que al contrario.

  • npm admite desarrollo , compilaciones de producción . En maven, esto debe definirse a través de perfiles .

Marinos An
fuente
5

si. es una herramienta de empaquetado similar para Java. busque gradletambién cuál le da más libertad groovy language, pero para empezar puede usarmaven para organizar sus dependencias. usted los incluye como etiquetas allí y maven hace el trabajo por usted.

atraviesa el árbol de dependencias y descarga todos los archivos jar apropiados.

Apostolos
fuente
1
no estoy seguro porque no estoy tan familiarizado con todas estas herramientas js. gradleestá maven + antjuntos, digamos. hace lo que hace maven, pero también le da la libertad de escribir código y scripts, además de todos los trabajos de facto que hace. gulpacabo de echar un vistazo . tal vez sea lo mismo, por lo que leí. Si desea comenzar a usar maven vs gradle, le sugiero comenzar con mavencuál es más claro y más fácil de entender y luego estropearlo gradle.
Apostolos
Gracias. ¿Maven tiene un árbol de dependencia plano o un árbol de dependencia anidado?
Shubham Jain
1
por ejemplo, vea aquí mvnrepository.com/artifact/org.hibernate/hibernate-core/… . hibernate depende de otras bibliotecas, pero estos archivos jar no se almacenarán en el repositorio local de maven dentro de la biblioteca de hibernate, sino en sus propios paquetes.
Apostolos
1
Creo que hay una diferencia en el manejo de dependencias anidadas (transitivas). cada módulo de nodo puede contener su propia versión de una dependencia, mientras que maven intentará resolver una sola dependencia común si varias dependencias requieren la misma tercera dependencia pero en una versión diferente. También diría que grunt coincide con gradle ya que se basa en tareas. gradle es más de ant + ivy, mientras que maven está fuertemente impulsado por las convenciones. tal vez más cerca de webpack pero nada demasiado similar.
wemu
1
lo siento, tienes razón. Lo confundí con el procedimiento de construcción de perfiles que a veces uso y defino las versiones.
Apostolos
0

Sí, lo mismo con gradle, pero no son fáciles de usar como npm.

LEMUEL ADANE
fuente