json Maven和npm相似吗?

c7rzv4ha  于 2023-02-01  发布在  Maven
关注(0)|答案(4)|浏览(165)

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

vsnjm48y

vsnjm48y1#

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

Maven是Java中最流行的构建和依赖性解决工具,就像NPM是JS中的一样。但是,不同的语言使用不同的工具是不一样的。Java和JS构建之间显然存在巨大的差异,这些差异在Maven的操作方式上可以直接看到。例如,虽然许多JS工具依赖Git来完成一些繁重的工作,但Maven使用的是基于文件系统的定制Maven存储库。因为Maven早于Git,需要处理二进制工件,而Git过去并没有很好地处理这些工件。在Maven中,源代码和二进制文件之间有一个明确的分离,而在JS世界中,它们通常是同一件事。

专业基础知识

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

引用您的依赖项

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

扁平依赖关系树?

根据另一个答案中的评论,Maven提供了“扁平依赖关系树”,而不是NPM默认提供的“嵌套依赖关系树”。Maven不允许同一依赖关系的多个版本。如果碰巧请求了不同的版本,Maven使用dependency resolution来挑选单个版本。这意味着有时您的传递依赖关系将获得与它们所需不同的版本,但是有一些方法可以解决这个问题。2然而,这个限制来自Java,而不是Maven,因为(通常)在Java中,即使在类路径中发现了多个类定义,类加载器也只提供对单个类定义的访问。3由于Java并不擅长处理这个问题,Maven首先试图避免这种情况。
注意:从npm v3开始,依赖关系被扁平化了,替代的包管理器yarn也做了同样的事情。
成熟
此外,Maven比NPM要老得多,拥有更大的用户群,大量的自定义插件,到目前为止可能被认为是更成熟的整体。有时候Maven被用于非Java甚至是多语种的项目,因为有一些插件可以处理其他语言或特定环境,比如Android。有一些插件可以连接Maven和其他构建工具。例如frontend-maven-plugin,它实际上处理多个JS构建工具。

wlzqhblo

wlzqhblo2#

是的,它们的主要目的是提供一种描述项目依赖关系的方法,而不是将它们保存在项目代码中,它们的次要目的是为开发人员提供一种简单的方法来执行、定义和共享开发时/构建时任务。
大多数情况下,决定使用哪一种语言是很简单的,因为这取决于你所使用的主要语言。

  • Java语言:maven
  • javascript/打印脚本:npm

下面我将详细解释它们的共同特性和不同之处。|npm项分别为:

共同特点:

  • 这两个工具都支持动态获取依赖项工件|软件包)基于描述符文件**pom.xml|package.json,还允许您部署|发布您自己的工件| Package **。
  • 它们都有一个默认的公共存储库|注册表http://repo.maven.apache.org/maven2/|https://registry.npmjs.org),但也可以使用第三方(通过**settings.xml|.npmrc**)的数据。
  • 它们都支持构建级依赖关系(插件)的概念|脚本中使用的devDependencies). * Maven也支持provided依赖项,但这似乎不适用于npm,因为javascript很少部署到容器中。
  • 它们都支持依赖项命名空间:groupId|x1米11米1x

差异:

  • Maven有一个额外的本地存储库(缓存):
  • 不需要为不同的项目再次获取相同的依赖项。
  • 本地安装的工件可由其他本地项目自动访问。
  • 在maven中构建的项目依赖项下载到<homedir>/.m2中,而在npm中则下载到<projectdir>/node_modules中。
  • 构建maven通常是一步式流程mvn package(fetch deps,build).在npm中,这是一个两步的过程:npm install(提取部署)、npm build(构建)
  • maven定义构建生命周期(用于构建、测试、部署)由多个阶段组成,默认操作(插件目标)附加,基于不同的打包选项(.jar.war.ear等)。然后,您可以覆盖这些操作,或注入新操作(通过插件系统)。这为构建、docgen、测试、部署等提供了一种开箱即用的解决方案。

国家预防机制办法较为简单(见:scripts

  • 基于以上原因,npm被称为javascript包管理工具,而maven被称为java构建自动化和依赖性管理工具。
  • 在maven的设置中,构建过程通常涉及编辑pom.xml

在npm中,它涉及编写代码或配置补充构建工具,如gulpwebpack

  • 由于某些原因,用户在npm模块中定义的版本范围比在maven中要宽松得多。这可能会导致传递依赖关系的问题,这就是为什么最近添加了一个额外的文件:* * 一米二三米一x**
  • 使用NPM,启动一个新项目要简单得多:npm init。使用maven,您需要知道如何编写最小的pom.xml,或者阅读有关原型的内容。
  • 一般来说,编辑pom.xml比编辑package.json要常见得多。例如,在maven中添加依赖项是通过命令行在npm中手动(或通过IDE)完成的。
  • 与所有构建工具一样,您可以从一个工具内部调用另一个工具,但我认为从maven内部调用npm要比从maven内部调用npm更为常见。
  • npm支持开发,生产构建。在maven中,这需要通过配置文件来定义。
e4eetjau

e4eetjau3#

是的.这是一个类似的java打包工具.查找gradle也给你更多的自由与groovy language,但对于开始你可以使用maven来组织你的依赖.你包括他们作为标记在那里和maven为你做的工作.
它遍历依赖关系树并下载所有适当的JAR。

u4vypkhs

u4vypkhs4#

是的,gradle也一样,但是它们不像npm那样用户友好。

相关问题