Maven与npm相似吗?

正如我曾经与npm一起查找package.json文件中的依赖关系并为您下载。 同样,我在Java项目中看到一个pom.xml文件。 maven是否在这个文件中查找并为我下载依赖关系? 我可以像package.json一样传递这个pom.xml文件,而不是给依赖jar吗? 这些工具是否类似,只是针对不同的平台构build?

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

Maven是Java中最受欢迎的构build和依赖parsing工具,就像NPM是为JS一样。 但是,对于不同的语言来说,这不仅仅是一个工具。 Java和JS构build之间显然存在巨大差异,这些差异可以直接在Maven的运行方式中看到。 例如,尽pipe许多JS工具依赖于Git来完成一些繁重的工作,但Maven使用基于文件系统的自定义Maven仓库,因为Maven先于Git,需要处理二进制工件,而Git在历史上处理得并不好。 在Maven中,源代码和二进制文件之间有明确的分离,而在JS世界中它们通常是相同的。

Maven的基本知识

Maven以其最纯粹的forms遵循声明模型,其中pom.xml (类似于package.json )定义了构build的不同属性,但不包含脚本。 缺点是在不使用脚本的情况下微调构build的某些方面可能是一个挑战,因为您必须依赖插件。 其优点是通过查看pom.xml可以更容易地理解其他构build,因为它们通常遵循相同的方法,而没有太多的自定义。 Gradle是基于Maven标准和惯例构build的stream行的基于Groovy的工具,专门用于简化pom.xml并打破这个“无脚本”的障碍。

引用你的依赖关系

package.json类似,您不直接使用依赖项的pom.xml ,而是定义依赖关系坐标,并让您的构build工具处理其余部分。 在Maven中,这些坐标的基本forms是GAV(groupId,artifactId,version)。

平的依赖树?

根据其他答案中的注释,Maven提供了“平面依赖树”,而不是NPM默认提供的“嵌套依赖树”。 Maven不允许多个版本的相同的依赖。 如果发生了不同的版本请求,Maven使用依赖parsing来select一个版本。 这意味着有时你的传递依赖将会得到不同于他们需要的版本,但是有办法来pipe理它。 然而,这个限制来自Java,而不是Maven,因为(通常)在Java中,即使在类path中find多个定义,类加载器也只能提供对单个类定义的访问。 由于Java不擅长处理这个问题,Maven首先试图避免这种情况。

注意:由于npm v3的依赖关系变平了。 替代的包装pipe理器纱线也是一样的。

到期

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

是。 这是一个类似于java的打包工具。 寻找gradle也给你更多的groovy language自由,但是一开始你可以使用maven来组织你的依赖关系。 你把它们作为标签包含在那里,maven为你做这个工作。

它遍历依赖树,并下载所有适当的jar子。