相同的工具,不同的语言?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 开始,依赖关系变得扁平化。替代包管理器yarn也执行相同的操作。
成熟度 此外,Maven 比 NPM 更老,拥有更大的用户群,大量的自定义插件,到目前为止可能被认为整体上更加成熟。有时 Maven 用于非 Java 甚至多语言项目,因为有用于处理其他语言或特定环境(例如 Android)的插件。有一些插件可以桥接 Maven 和其他构建工具,例如frontend-maven-plugin实际上可以处理多个 JS 构建工具。
归档时间: |
|
查看次数: |
3028 次 |
最近记录: |