提问者:小点点

Maven类似于NPM吗?


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


共3个答案

匿名用户

Maven是Java最流行的构建和依赖解析工具,就像NPM对于JS一样。但它并不只是针对不同语言的同一工具。Java和JS构建之间显然存在着巨大的差异,而这些差异在Maven的操作方式中是直接可见的。例如,虽然许多JS工具依赖于Git来完成一些繁重的任务,但Maven使用自定义的基于文件系统的Maven存储库,因为Maven早于Git,并且需要处理二进制工件,而Git在历史上并不能很好地处理这些工件。在Maven中,源代码和二进制文件之间有明确的区分,而在JS世界中它们通常是同一回事。

最纯粹形式的Maven遵循声明式模型,其中(类似于)定义了构建的不同属性,但不包含脚本。缺点是在不使用脚本的情况下对构建的某些方面进行微调可能是一个挑战,因为您必须依赖插件。这样做的好处是,只需查看就可以更容易地理解其他构建,因为它们通常遵循相同的方法,无需太多的自定义。Gradle是一种流行的基于Groovy的工具,它构建在Maven标准和约定之上,专门设计用于简化并打破“无脚本”的障碍。

类似,您不直接处理依赖项的,而是定义依赖项坐标,并让构建工具处理其余部分。在Maven中,这些坐标的基本形式是GAV(groupId,artifactId,version)。

基于另一个答案中的注释,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还支持依赖项,但这似乎不适用于npm,因为javascript很少部署到容器中。

它们都支持依赖项命名空间:

>

/.m2/code>中下载来自maven中的项目构建的依赖项。使用npm,它们可以在中下载。

在maven中构建通常是一个单步过程:(fetch deps,build。在npm中,它是一个两步过程:(获取deps),(构建)

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中的,它涉及编写代码或配置补充构建工具,如E.T.C

由于某种原因,用户在npm模块中定义的版本范围比在Maven中要宽松得多。这可能会导致传递依赖关系出现问题,这就是为什么最近添加了一个额外的文件:

使用npm,启动一个新项目要简单得多:。使用maven,您需要知道如何编写最小的,或者了解原型。

通常,编辑比编辑更常见。例如。在maven中添加依赖项是手动(或通过IDE)完成的,而在npm中则是通过命令行完成的。

与所有构建工具一样,您可以从一个工具内部调用另一个工具,但我认为从maven内部调用npm比相反的方法更为常见。

npm支持dev,production构建。在maven中,这需要通过概要文件来定义。

匿名用户

是的。这是一个类似的包装工具为Java。还可以查找,它为您提供了更多的自由,但对于start,您可以使用来组织依赖项。您将它们作为标记包含在那里,maven为您完成这项工作。

它遍历依赖树并下载所有适当的JAR。