因为我曾经使用过npm,它会在package.json文件中查找依赖项,并为您下载它。类似地,我在Java项目中看到了一个pom.xml文件。maven是否在此文件中查找并为我下载依赖项。我是否可以像package.json那样传递这个pom.xml文件,而不是给出依赖项JAR?这些工具是否相似,只是为不同的平台构建?
Maven是Java最流行的构建和依赖解析工具,就像NPM对于JS一样。但它并不只是针对不同语言的同一工具。Java和JS构建之间显然存在着巨大的差异,而这些差异在Maven的操作方式中是直接可见的。例如,虽然许多JS工具依赖于Git来完成一些繁重的任务,但Maven使用自定义的基于文件系统的Maven存储库,因为Maven早于Git,并且需要处理二进制工件,而Git在历史上并不能很好地处理这些工件。在Maven中,源代码和二进制文件之间有明确的区分,而在JS世界中它们通常是同一回事。
最纯粹形式的Maven遵循声明式模型,其中
与
基于另一个答案中的注释,Maven提供了“平面依赖树”,而不是默认情况下NPM提供的“嵌套依赖树”。Maven不允许同一依赖项有多个版本。如果发生请求不同版本的情况,Maven使用依赖关系解析来选择单个版本。这意味着有时您的可传递依赖项将获得不同于它们所需的版本,但有方法可以管理这一点。但是,这种限制来自Java,而不是Maven,因为(通常)在Java,类加载器将只提供对单个类定义的访问,即使在类路径上发现了多个定义。由于Java不是特别擅长处理这一点,所以Maven一开始就试图避免这种场景。
注意:自NPMV3以来,依赖关系是扁平化的。替代的包装管理器纱线也做同样的事情。
此外,Maven比NPM要老得多,拥有更大的用户群,大量的定制插件,而且到目前为止,可以认为Maven总体上更加成熟。有时Maven用于非Java甚至多语言项目,因为有一些插件用于处理其他语言或特定环境,例如Android。有一些插件可以桥接Maven和其他构建工具,比如frontend-maven-plugin,它实际上处理多个JS构建工具。
下面我使用分别在maven npm术语之间进行分隔:
>
它们都有一个默认的公共存储库注册表(http://repo.maven.apache.org/maven2/https://registry.npmjs.org),但也可以使用第三方(通过
它们都支持构建级依赖关系(脚本中使用的插件devDependencies)的概念。*Maven还支持
它们都支持依赖项命名空间:
>
在 在maven中构建通常是一个单步过程: maven根据不同的打包选项(code.jar/code,code.war/code,code.ear/code>E.T.C)定义了由阶段组成的构建生命周期(用于构建,测试,部署),默认操作(插件目标)附加到这些阶段。然后可以覆盖这些操作,或者注入新的操作(通过插件系统)。这为build.docgen.test.deploy e.t.c.br>提供了一种现成的解决方案,npm方法更加简单(请参阅:scripts) 由于上述原因,npm被标记为用于javascript的包管理工具,而maven被标记为用于Java的构建自动化和依赖管理工具。 在maven设置中,构建过程通常涉及编辑npm中的 由于某种原因,用户在npm模块中定义的版本范围比在Maven中要宽松得多。这可能会导致传递依赖关系出现问题,这就是为什么最近添加了一个额外的文件: 使用npm,启动一个新项目要简单得多: 通常,编辑 与所有构建工具一样,您可以从一个工具内部调用另一个工具,但我认为从maven内部调用npm比相反的方法更为常见。 npm支持dev,production构建。在maven中,这需要通过概要文件来定义。
/.m2/code>中下载来自maven中的项目构建的依赖项。使用npm,它们可以在
中下载。
是的。这是一个类似的包装工具为Java。还可以查找
它遍历依赖树并下载所有适当的JAR。