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