maven和npm存储库有什么区别?

时间:2018-12-12 09:22:39

标签: node.js maven npm

我想知道npm和Maven存储库之间的区别

2 个答案:

答案 0 :(得分:0)

相同的工具,不同的语言? 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是基于Maven标准和约定的流行的基于Groovy的工具,专门用于简化pom.xml并打破​​这种“无脚本”的障碍。

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

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

注意:从npm v3开始,依赖性变得平坦。替代程序包管理器yarn也执行相同的操作。

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

答案 1 :(得分:0)

NPM专注于JavaScript,而Maven专注于Java和JVM派生(即Scala,Kotlin,Groovy)。
因此比较它们根本没有意义,因为它们不是并发的。
将Maven与Gradle(Java世界并发)或NPM与Yarn(JavaScript世界并发)进行比较会更有意义。

现在,Maven和NPM已关闭功能。这不足为奇:好的食谱已经超越了一种语言。

以下是一些共同点/功能:
-这些是与本地/远程存储库一起使用的程序包(JavaScript术语)/依赖项(Maven术语)管理器。
-这也是管理项目中的依赖关系并为其执行构建任务的一种方式。