Maven 与 npm 类似吗?

新手上路,请多包涵

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

原文由 Shubham Jain 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.6k
2 个回答

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

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

原文由 Anton Koscejev 发布,翻译遵循 CC BY-SA 3.0 许可协议

下面我使用 | 来分隔maven | npm 术语分别为:

共同特征:

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

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

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

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

区别:

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

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

  • maven 中构建通常是 一步过程mvn package (获取 deps,构建)。在 npm 中,它是一个两步过程: npm install (获取部门), npm build (构建)

  • Maven 定义 构建生命周期(用于构建、测试、部署) ,包括阶段,默认操作(插件目标)附加到这些阶段, 基于不同的打包选项( .jar.war.ear 等)。然后您可以覆盖这些操作,或注入新操作(通过插件系统)。这为构建、文档生成、测试、部署等提供了一种开箱即用的解决方案

npm 方法更简单(请参阅: 脚本

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

  • 在 Maven 设置中,构建过程通常涉及 编辑 pom.xml

在 npm 中,它涉及 编写代码 或配置 补充构建工具,如 gulpwebpack

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

  • 使用 npm 可以更 直接地开始 一个新项目: npm init 。使用 Maven,您需要知道如何编写最小的 pom.xml ,或阅读原型。

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

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

  • npm 支持 开发、生产构建。在 Maven 中,这需要通过 profiles 来定义。

原文由 Marinos An 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题