java - Maven 与 npm 类似吗?

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

最佳答案

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

Maven 是最流行的 Java 构建和依赖解析工具,就像 NPM 用于 JS 一样。但它不仅仅是用于不同语言的相同工具。 Java 和 JS 构建之间显然存在巨大差异,这些差异在 Maven 操作方式中直接可见。例如,虽然许多 JS 工具依赖 Git 来完成一些繁重的工作,但 Maven 使用基于自定义文件系统的 Maven 存储库,因为 Maven 早于 Git 并且需要处理二进制 Artifact ,而 Git 在历史上不能很好地处理这些 Artifact 。在 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 使用 dependency resolution选择一个版本。这意味着有时您的传递依赖项会获得与所需版本不同的版本,但有一些方法可以管理它。但是,此限制来自 Java,而不是 Maven,因为(通常)在 Java 中,即使在类路径中找到多个定义,类加载器也只会提供对单个类定义的访问。由于 Java 不是特别擅长处理这种情况,因此 Maven 一开始就试图避免这种情况。

注意:从 npm v3 开始,依赖项是扁平化的。替代包管理器yarn也一样。

成熟度

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

https://stackoverflow.com/questions/38388824/

相关文章:

java - 与 Jackson 映射时将默认值设置为空字段

java - 忽略 Jackson 序列化的特定字段

javascript - 对象和哈希之间的区别?

asp.net - 如何使用 IIS 7.5 压缩来自 ASP.NET MVC 的 Json 结果

json - 如何让 cURL 仅输出 HTTP 响应正文(JSON)而不输出其他 header 等

javascript - 保留未定义的 JSON.stringify 否则将删除

python - 将 JSON 数组转换为 Python 列表

json - AngularJS - 服务器端验证和客户端表单

python - 使用常规编码器使对象 JSON 可序列化

c# - 将 XML 转换为动态 C# 对象