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?
84
Respuestas:
¿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 apackage.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 mirarlaspom.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 simplificarpom.xml
y romper esta barrera de "no escritura".Haciendo referencia a sus dependencias
De manera similar
package.json
, no trabajapom.xml
directamente 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.
fuente
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.json
y 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
provided
tambié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é):
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
,.ear
etc). Luego puede sobrescribir estas operaciones o inyectar otras nuevas (a través del sistema de complementos). Esto proporciona una especie de solución lista parausar 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 archivo
pom.xml
.En npm implica escribir código o configurar herramientas de compilación complementarias como
gulp
,webpack
etc.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ínimopom.xml
o leer sobre arquetipos.En general, es mucho más común editar
pom.xml
quepackage.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 .
fuente
si. es una herramienta de empaquetado similar para Java. busque
gradle
también cuál le da más libertadgroovy 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.
fuente
gradle
estámaven + ant
juntos, 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.gulp
acabo de echar un vistazo . tal vez sea lo mismo, por lo que leí. Si desea comenzar a usar maven vs gradle, le sugiero comenzar conmaven
cuál es más claro y más fácil de entender y luego estropearlogradle
.Sí, lo mismo con gradle, pero no son fáciles de usar como npm.
fuente