Maven和npm相似吗?

时间:2016-07-15 05:59:14

标签: java json node.js maven npm

因为我使用过npm,它在package.json文件中查找依赖项并为您下载。同样,我在Java项目中看到了一个pom.xml文件。 maven是否在此文件中查找并为我下载依赖项。我可以像package.json一样传递这个pom.xml文件,而不是给依赖项jar吗?这些工具是否相似,是否适用于不同的平台?

4 个答案:

答案 0 :(得分:86)

相同的工具,不同的语言?

Maven是最受欢迎的Java构建和依赖项解析工具,就像NPM用于JS一样。但它不仅仅是针对不同语言的相同工具。 Java和JS构建之间显然存在巨大差异,这些差异在Maven运行的方式中直接可见。例如,虽然许多JS工具依赖Git来做一些繁重的工作,但是Maven使用基于自定义文件系统的Maven存储库,因为Maven早于Git并且需要处理二进制工件,Git历史上处理得不好。在Maven中,源和二进制文件之间存在明显的分离,而它们在JS世界中通常是相同的。

Maven基础知识

Maven以其最纯粹的形式遵循声明性模型,其中pom.xml(类似于package.json)定义了构建的不同属性,但不包含脚本。缺点是,在不使用脚本的情况下微调构建的某些方面可能是一个挑战,因为您必须依赖插件。优点是通过查看pom.xml可以更容易地理解其他构建,因为它们通常遵循相同的方法而无需过多的自定义。 Gradle是一种基于Groovy的流行工具,基于Maven标准和约定构建,专门用于简化pom.xml并打破这种“无脚本”障碍。

引用您的依赖项

package.json类似,您不直接使用您的依赖项的pom.xml,而是定义依赖关系坐标,让您的构建工具处理其余的。在Maven中,这些坐标的基本形式是GAV(groupId,artifactId,version)。

平面依赖树?

根据其他答案中的评论,Maven提供了“平面依赖树”,而不是NPM默认提供的“嵌套依赖树”。 Maven不允许同一依赖项的多个版本。如果发生请求不同版本,Maven使用dependency resolution选择单个版本。这意味着有时您的传递依赖项将获得与其需求不同的版本,但有一些方法可以管理它。但是,这个限制来自Java,而不是Maven,因为(通常)在Java中,类加载器只提供对单个类定义的访问,即使在类路径上找到多个定义也是如此。由于Java在处理这方面并不是特别擅长,因此Maven首先尝试避免这种情况。

注意:从npm v3开始,依赖关系变平了。替代包管理器yarn也是如此。

成熟

此外,Maven比NPM年龄大,拥有更大的用户群,大量的自定义插件,到目前为止可能被认为更加成熟。有时,Maven用于非Java甚至多语言项目,因为有用于处理其他语言或特定环境的插件,例如Android。有一些插件可以连接Maven和其他构建工具,例如实际处理多个JS构建工具的frontend-maven-plugin

答案 1 :(得分:11)

下面,我使用|来分隔maven | npm条款:

共同特征:

  • 这两个工具都基于描述符文件 pom.xml | {{1}支持动态获取依赖项工件|包)。 } ,还允许您部署|发布您自己的工件|包

  • 它们都有默认的公共存储库|注册表((http://repo.maven.apache.org/maven2/ | https://registry.npmjs.org),但也可以使用第三方(通过 package.json | settings.xml )。< / p>

  • 它们都支持构建级依赖项(脚本中使用的插件| devDependencies)的概念。 * Maven还支持.npmrc依赖性,但这似乎不适用于npm,因为javascript很少部署到容器中。

  • 它们都支持依赖项命名空间:provided | groupId

区别:

  • maven还有一个本地存储库(缓存):

    • 无需为不同的项目再次获取相同的依赖项。
    • 本地安装的工件可以被其他本地项目自动访问。
  • 在maven中构建的项目的依赖关系已从scope下载。使用npm,它们可以下载到<homedir>/.m2中。

  • maven 中构建通常是一个一步过程<projectdir>/node_modules(获取deps,构建)。在npm中,此过程分为两步:mvn package(获取部门),npm install(构建)

  • maven根据不同的包装定义构建生命周期(用于构建,测试,部署)由阶段组成,默认操作(插件目标)所附加的阶段选项(npm build.jar.war等)。然后,您可以覆盖这些操作,或注入新操作(通过插件系统)。这为build,docgen,test,deploy e.t.c提供了一种现成的解决方案。 npm方法更简单(请参见:scripts

  • 在Maven设置中,构建过程通常涉及编辑.ear 。在npm中,它涉及编写代码

  • 由于某种原因,用户在npm模块中定义的版本范围比maven中的松散多得多。这可能会导致传递依赖项出现问题,这就是为什么最近添加了另一个文件: pom.xml

  • 使用npm,可以更轻松地开始一个新项目:package-lock.json。使用Maven,您需要知道如何编写最少的npm init或阅读原型。

  • 通常,编辑pom.xmlpom.xml更为常见。例如。 在Maven中添加依赖项是通过手动(或通过IDE)完成的,而在 npm中是通过命令行完成的。

  • 与所有构建工具一样,您可以从另一个内部调用一个工具,但是我认为从maven内部调用 npm 的情况要普遍得多。

  • npm支持开发,生产构建。在Maven中,需要通过个人资料进行定义。

答案 2 :(得分:3)

是肯定的。它是java的类似打包工具。查找gradle也可以通过groovy language为您提供更多自由,但是首先您可以使用maven来组织您的依赖项。你把它们作为标签包含在那里,而maven为你做的工作。

它遍历依赖树并下载所有适当的jar。

答案 3 :(得分:0)

是的,与gradle相同,但它们不是用户友好的npm。