Maven 与 npm 相似吗?
正如我使用过npm一样,它在package.json文件中查找依赖项并为您下载。同样,我在Java项目中看到一个pom.xml文件。maven 是否查找此文件并为我下载依赖项。我可以像 package.json 一样传递这个 pom.xml 文件,而不是给依赖关系 jar 吗?这些工具是否相似,只是针对不同的平台构建?
正如我使用过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以其最纯粹的形式遵循声明性模型,其中(类似于)定义了构建的不同属性,但不包含任何脚本。缺点是,在不使用脚本的情况下微调构建的某些方面可能是一个挑战,因为您必须依赖插件。优点是只需查看 ,就可以更容易地理解其他构建,因为它们通常遵循相同的方法,而无需太多的自定义。Gradle是一个流行的基于Groovy的工具,建立在Maven标准和惯例之上,专门设计用于简化和打破这种“无脚本”的障碍。pom.xml
package.json
pom.xml
pom.xml
与 类似,您不直接使用依赖项,而是定义依赖项坐标,并让构建工具处理其余部分。在Maven中,这些坐标的基本形式是GAV(groupId,artifactId,version)。package.json
pom.xml
根据其他答案中的注释,Maven 提供了“平面依赖关系树”,而不是 NPM 默认提供的“嵌套依赖关系树”。Maven 不允许同一依赖项的多个版本。如果碰巧请求了不同的版本,Maven 将使用依赖项解析来选择单个版本。这意味着有时您的传递依赖项将获得与所需版本不同的版本,但是有一些方法可以管理它。但是,此限制来自 Java,而不是 Maven,因为(通常)在 Java 中,类装入器仅提供对单个类定义的访问,即使在类路径上找到多个定义也是如此。由于Java不是特别擅长处理这种情况,Maven首先试图避免这种情况。
注意:由于 npm v3,依赖项是扁平化的。替代的包管理器纱线也做同样的事情。
此外,Maven比NPM要老得多,拥有更大的用户群,大量的自定义插件,到目前为止,总体上可能被认为是更成熟的。有时Maven用于非Java甚至多语言项目,因为有用于处理其他语言或特定环境(如Android)的插件。有些插件可以桥接Maven和其他构建工具,例如实际上处理多个JS构建工具的前端maven插件。
下面我用来区分专家|npm 术语分别为:|
这两个工具都支持基于描述符 文件pom.xml动态获取依赖项(工件|
包|package.json
,还允许您部署|发布自己的工件|包。
它们都有一个默认的公共存储库|注册表(http://repo.maven.apache.org/maven2/|https://registry.npmjs.org),但也可以使用第三方(通过设置.xml
|。npmrc
)。
它们都支持构建级依赖项(脚本中使用的插件| devDependencies)的概念。*Maven也支持依赖关系,但这似乎不适用于npm,因为javascript很少部署到容器中。provided
它们都支持依赖项名称间距:|groupId
scope
maven 有一个额外的本地存储库(缓存):
maven 中项目构建的依赖项在 中下载。使用 npm,它们将下载到 中。<homedir>/.m2
<projectdir>/node_modules
在 maven 中构建通常是一个一步到位的过程:(获取 deps ,构建)。在 npm 中,它是一个两步过程:(获取 deps),(构建)mvn package
npm install
npm build
maven定义了构建生命周期(用于构建,测试,部署),由阶段组成,默认操作(插件目标)附加到这些阶段,基于不同的打包选项(,,e.t.c)。然后,您可以覆盖这些操作,或注入新的操作(通过插件系统)。这为构建,docgen,test,deploy e.t.c.提供了一种开箱即用的解决方案,
npm方法更简单(请参阅:脚本).jar
.war
.ear
)
由于上述原因,npm被标记为javascript的包管理工具,而maven被标记为java的构建自动化和依赖管理工具。
在 maven 设置中,构建过程通常涉及编辑 pom.xml
。
在 npm 中,它涉及编写代码或配置补充构建工具,如 ,e.t.cgulp
webpack
由于某种原因,用户在 npm 模块中定义的版本范围比在 maven 中定义的版本范围要宽松得多。这可能会导致传递依赖项出现问题,这就是最近添加其他文件的原因:package-lock.json
使用 npm,启动一个新项目要简单得多:.使用maven,您需要知道如何编写最小值,或者阅读原型。npm init
pom.xml
一般来说,编辑比 更常见。例如,在 maven 中添加依赖项是手动完成的(或通过 IDE),而在 npm 中通过命令行完成。pom.xml
package.json
与所有构建工具一样,您可以从内部调用一个工具,但我认为从内部调用npm比从内部调用npm更常见。
npm 支持开发、生产构建。在 maven 中,这需要通过配置文件来定义。