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以其最纯粹的形式遵循声明性模型,其中
与
基于另一个答案中的注释,Maven提供了"平面依赖树",而不是NPM默认提供的"嵌套依赖树"。Maven不允许同一依赖项的多个版本。如果请求不同的版本,Maven会使用依赖解析来选择单个版本。这意味着有时您的可传递依赖项将得到不同于它们需要的版本,但有一些方法可以管理这一版本。但是,这个限制来自Java,而不是Maven,(通常)在爪哇中,类装载器只提供对一个类定义的访问,即使在类路径上找到多个定义。由于Java在处理这方面并不是特别好,Maven首先试图避免这种情况。
注意:由于NPM v3,依赖关系是扁平的。另一种包装管理器纱线也有同样的作用。
成熟度此外,Maven比NPM老得多,拥有更大的用户基础,大量的定制插件,到目前为止,可能被认为是更成熟的整体。有时Maven用于非Java甚至多语言项目,因为有用于处理其他语言或特定环境(例如Android)的插件。有一些插件可以桥接Maven和其他构建工具,比如前端Maven插件,它实际上可以处理多个JS构建工具。
下面我分别用
这两种工具都支持基于描述符文件
pom.xml package.json 的依赖项(工件包)的动态获取,还允许您部署发布自己的工件包。它们都有一个默认的公共存储库注册表(http://repo.maven.apache.org/maven2/https://registry.npmjs.org),但也可以使用第三方(通过
settings.xml .npmrc )。它们都支持构建级依赖性的概念(脚本中使用的插件devdependencies)。*Maven也支持
provided 依赖项,但这似乎不适用于NPM,因为很少将javascript部署到容器中。它们都支持依赖项名称间距:
groupId scope 。
Differrences:
Maven有一个额外的本地存储库(缓存):
- 不需要为不同的项目再次获取相同的依赖项。
- 本地安装的项目可由其他本地项目自动访问。
在
中下载来自项目A构建maven的依赖项。通过NPM,它们可以下载到/.m2 中。/node_modules 在Maven中构建通常是一个单步过程:
mvn package (fetch deps,build)。在NPM中,这是一个两步过程:npm install (fetch deps),npm build (build)Maven定义了构建生命周期(用于构建、测试、部署),包括基于不同打包选项(
.jar 、.war 、.ear e.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的打包工具。寻找
它遍历依赖树并下载所有适当的JAR。
是的,和Gradle一样,但它们不像NPM那样用户友好。