Maven和npm相似吗?

Shu*_*ain 60 java json maven node.js npm

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

Ant*_*jev 97

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

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使用依赖项解析来选择单个版本.这意味着有时您的传递依赖项将获得与其需求不同的版本,但有一些方法可以管理它.但是,这个限制来自Java,而不是Maven,因为(通常)在Java中,类加载器只提供对单个类定义的访问,即使在类路径上找到多个定义也是如此.由于Java在处理这方面并不是特别擅长,因此Maven首先尝试避免这种情况.

注意:从npm v3开始,依赖关系变平了.替代包装经理纱线也是如此.

到期

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

  • 除了上述信息之外,以下[Youtube播放列表](https://www.youtube.com/watch?v=al7bRZzz4oU&list=PL92E89440B7BFD0F6)可以很好地描述Maven作为包管理器的用途 (4认同)
  • 此答案的更新:“此外,Maven 比 NPM 老得多,拥有更大的用户群......”当这个问题最初在 2017 年被回答时,这可能是正确的,但不再准确。根据@cacoder 发布的链接,NPM 的用户群现在大约是 Maven 的 11 倍。来源:https://stackshare.io/stackups/gradle-vs-maven-vs-npm (3认同)
  • 我经常访问 npmjs.com 来搜索可能有用的包。在 Maven (https://search.maven.org) 上找到执行此操作的链接需要进行大量的谷歌搜索。但是,搜索不会将我指向文档,不会向我显示流行度指标,也不会指向 github。我不觉得它有帮助,这表明这是人们对 NPM 的期望,而不是对 Maven 的期望。 (2认同)

Mar*_* An 18

下面我用|Maven来分隔 npm条款:

共同特征:

  • 两种工具都支持基于描述符文件|的动态获取依赖项工件|包pom.xmlpackage.json,还允许您部署| 发布自己的工件| 包

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

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

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

区别:

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

    • 无需针对不同的项目再次获取相同的依赖项。
    • 本地安装的工件可以由其他本地项目自动访问。
  • 在Maven中构建的项目的依赖项在中下载<homedir>/.m2。使用npm可以将它们下载到中<projectdir>/node_modules

  • Maven中进行构建通常是一个步骤:(mvn package获取deps,进行构建)。在npm中,这是一个两步过程:npm install(fetch deps),npm build(build)

  • 行家定义构建生命周期(用于构建,测试,部署)由阶段,到默认操作(插件的目标)连接,基于differrent封装选项(.jar.war.ear等)。然后,您可以覆盖这些操作,或注入新操作(通过插件系统)。这为构建,docgen,测试,部署等提供了一种开箱即用的解决方案。npm
    方法更为简单(请参阅: 脚本

  • 由于上述原因,npm被标记为javascript软件包管理工具,而maven被标记为java构建自动化和依赖项管理工具

  • 在maven设置中,构建过程通常涉及编辑pom.xml
    在npm中,它涉及编写代码或配置补充构建工具(例如gulpwebpack

  • 由于某些原因,用户在npm模块中定义的版本范围比maven 宽松得多。这可能会导致传递依赖项出现问题,这就是最近添加一个附加文件的原因:package-lock.json

  • 使用npm ,开始一个新项目要简单得多npm init。使用Maven,您需要知道如何编写minimal pom.xml或阅读有关原型的信息。

  • 一般而言,编辑pom.xmlpackage.json。例如在行家添加依赖完成手动(或经由IDE),而在NPM通过命令行

  • 与所有构建工具一样,您可以从另一个内部调用一个工具,但是我认为从maven内部调用npm比在另一个内部调用更为普遍。

  • npm支持开发,生产构建。在Maven中,这需要通过配置文件进行定义。


Apo*_*los 6

是的。它是一个类似的java打包工具。寻找gradle还可以让您更自由地使用groovy language,但首先您可以使用它maven来组织您的依赖项。您将它们作为标签包含在那里,maven 会为您完成这项工作。

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

  • 不确定,因为我对所有这些 js 工具不太熟悉。可以说,“gradle”是“maven + ant”。它做 Maven 所做的事情,但除了它所做的所有实际工作之外,它还让您可以自由地编写代码和脚本。我刚才看了“gulp”。从我读到的内容来看,也许是一样的。如果你想开始使用 Maven 与 gradle,我建议从更清晰、更容易理解的 `maven` 开始,然后再用 `gradle`! (2认同)