关于java:Maven和npm类似吗?

Is Maven similar to npm?

正如我与NPM合作过的那样,它在package.json文件中查找依赖项并为您下载。类似地,我在Java项目中看到了一个POM.XML文件。Maven是否查找此文件并为我下载依赖项?我可以绕过这个pom.xml文件,比如package.json,而不是给出依赖jar吗?这些工具是否相似,只是为不同的平台构建的?


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

Maven是最流行的Java构建和依赖性解决工具,就像NPM是JS一样。但对于不同的语言来说,这不仅仅是同一个工具。Java和JS构建之间存在明显的差异,这些差异可以直接通过Maven操作来实现。例如,虽然许多JS工具依赖于Git来完成一些繁重的工作,但Maven使用基于自定义文件系统的Maven存储库,因为Maven早于Git,需要处理二进制工件,而Git以前处理得不好。在Maven中,源文件和二进制文件之间有明显的分离,而在JS世界中,它们通常是相同的。

Maven基础

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

引用依赖项

package.json类似,您不直接使用依赖关系的pom.xml,而是定义依赖关系坐标,并让构建工具处理其余部分。在maven中,这些坐标的基本形式是gav(groupid、artifactid、version)。

扁平依赖树?

基于另一个答案中的注释,Maven提供了"平面依赖树",而不是NPM默认提供的"嵌套依赖树"。Maven不允许同一依赖项的多个版本。如果请求不同的版本,Maven会使用依赖解析来选择单个版本。这意味着有时您的可传递依赖项将得到不同于它们需要的版本,但有一些方法可以管理这一版本。但是,这个限制来自Java,而不是Maven,(通常)在爪哇中,类装载器只提供对一个类定义的访问,即使在类路径上找到多个定义。由于Java在处理这方面并不是特别好,Maven首先试图避免这种情况。

注意:由于NPM v3,依赖关系是扁平的。另一种包装管理器纱线也有同样的作用。

成熟度

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


下面我分别用|来区分maven npm术语:

常见特征:

  • 这两种工具都支持基于描述符文件pom.xmlpackage.json的依赖项(工件包)的动态获取,还允许您部署发布自己的工件包。

  • 它们都有一个默认的公共存储库注册表(http://repo.maven.apache.org/maven2/https://registry.npmjs.org),但也可以使用第三方(通过settings.xml.npmrc)。

  • 它们都支持构建级依赖性的概念(脚本中使用的插件devdependencies)。*Maven也支持provided依赖项,但这似乎不适用于NPM,因为很少将javascript部署到容器中。

  • 它们都支持依赖项名称间距:groupIdscope

Differrences:

  • Maven有一个额外的本地存储库(缓存):

    • 不需要为不同的项目再次获取相同的依赖项。
    • 本地安装的项目可由其他本地项目自动访问。
  • /.m2中下载来自项目A构建maven的依赖项。通过NPM,它们可以下载到/node_modules中。

  • 在Maven中构建通常是一个单步过程:mvn package(fetch deps,build)。在NPM中,这是一个两步过程:npm install(fetch deps),npm build(build)

  • Maven定义了构建生命周期(用于构建、测试、部署),包括基于不同打包选项(.jar.war.eare.t.c)附加默认操作(插件目标)的阶段。然后您可以覆盖这些操作,或者注入新的操作(通过插件系统)。这为构建、docgen、测试、部署E.T.C.提供了一种现成的解决方案。NPM方法更简单(请参见:脚本)

  • 在maven设置中,构建过程通常包括编辑pom.xml。在NPM中,它涉及到编写代码。

  • 由于某些原因,用户在NPM模块中定义的版本范围比Maven宽松得多。这可能会导致传递依赖项出现问题,这就是最近添加附加文件的原因:package-lock.json

  • 对于NPM来说,启动一个新项目要简单得多:npm init。对于maven,您需要知道如何编写最小的pom.xml,或者阅读原型。

  • 一般来说,编辑pom.xml比编辑package.json更为常见。例如,在maven中添加依赖项是通过命令行在npm中手动(或通过ide)完成的。

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

  • NPM支持开发、生产构建。在Maven中,这需要通过配置文件来定义。


对.这是一个类似Java的打包工具。寻找gradle,这也给了你更多的使用groovy language的自由,但是首先你可以使用maven来组织你的依赖。你把它们作为标签放在那里,Maven为你做这项工作。

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


是的,和Gradle一样,但它们不像NPM那样用户友好。