正如我与npm合作时所做的那样,npm会在包中查找依赖项.json文件并为您下载.类似地,我看到一个pom.Java项目中的xml文件.maven会在这个文件中查找并为我下载依赖项吗.我能把这个球传过go 吗.类似xml文件的包.json,而不是提供依赖项jar?这些工具是否相似,只是为不同的平台构建的?

推荐答案

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

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

马文基础

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来 Select 一个版本.这意味着,有时您的可传递依赖项将获得不同于它们所需的版本,但有一些方法可以管理这一点.然而,这种限制来自Java,而不是Maven,因为(通常)在Java中,类加载器只提供对单个类定义的访问,即使在类路径上找到了多个定义.由于Java并不特别擅长处理这种情况,Maven首先试图避免这种情况.

注意:由于npm v3,依赖关系是平坦的.替代的包管理器yarn也做同样的事情.

成熟

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

Node.js相关问答推荐

使用NodeJS输出检索Base64图像的网络报废

Stripe webhook无法访问Express请求原始正文

GitLab SAST中的Nodejcan未找到匹配项

控制台显示一个长对象,我可以';每当我发布更新Mongoose数据库的请求时,我都不知道错误是什么,

try 使用 pdf.js 时 pdf.getPage 不是函数

如何在MongoDB中删除嵌套对象数组中的属性?

Amplify 部署的应用程序出现TypeError: handler is not a function错误,但它在本地运行

Node.js 上的 CLI 应用程序如何通过 child_process 将选项值作为参数传递给 Shell 命令

Axios 响应循环通过函数只返回第一个映射对象的结果

'{ id: string; 类型的参数}' 不可分配给FindOneOptions类型的参数

Node.js 表达的 Error 对象expose 了哪些属性?

Webpack TypeScript module.hot 不存在

Connect/Express 中的session和cookieSession中间件有什么区别?

编写可维护的事件驱动代码

对不同对象中的函数使用相同的键时,V8 中的函数调用缓慢

TypeError:请求路径包含未转义的字符,我该如何解决这个问题

在单独的模块中定义 Mongoose 模型

- configuration.output.path:提供的值public不是绝对路径!使用 Webpack

NPM:为什么要安装这个包?

使用 Node-sass 缩小 CSS