Maven 与 npm 相似吗?

2022-08-31 09:32:32

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


答案 1

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

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

Maven 基础知识

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

引用依赖项

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

平面依赖关系树?

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

注意:由于 npm v3,依赖项是扁平化的。替代的包管理器纱线也做同样的事情。

成熟

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


答案 2

下面我用来区分专家|npm 术语分别为:|

共同特点:

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

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

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

  • 它们都支持依赖项名称间距:|groupIdscope

区别:

  • maven 有一个额外的本地存储库(缓存):

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

  • maven 中构建通常是一个一步到位的过程:(获取 deps ,构建)。在 npm 中,它是一个两步过程:(获取 deps),(构建)mvn packagenpm installnpm build

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

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

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

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

  • 使用 npm,启动一个新项目要简单得多:.使用maven,您需要知道如何编写最小值,或者阅读原型。npm initpom.xml

  • 一般来说,编辑比 更常见。例如,在 maven 中添加依赖项手动完成的(或通过 IDE),而在 npm 中通过命令行完成。pom.xmlpackage.json

  • 与所有构建工具一样,您可以从内部调用一个工具,但我认为从内部调用npm比从内部调用npm更常见。

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