因为我曾经使用过npm,它在package.json文件中查找依赖项并下载它。类似地,我在Java项目中看到了一个pom.xml文件。maven是否在此文件中查找并下载依赖项。我是否可以像package.json一样传递此pom.xml文件,而不是提供依赖项jar?这些工具是否相似,只是针对不同的平台构建?
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并打破“无脚本”的障碍。
pom.xml
package.json
与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构建工具。
wlzqhblo2#
是的,它们的主要目的是提供一种描述项目依赖关系的方法,而不是将它们保存在项目代码中,它们的次要目的是为开发人员提供一种简单的方法来执行、定义和共享开发时/构建时任务。大多数情况下,决定使用哪一种语言是很简单的,因为这取决于你所使用的主要语言。
maven
npm
下面我将详细解释它们的共同特性和不同之处。|npm项分别为:
settings.xml
.npmrc
provided
groupId
<homedir>/.m2
<projectdir>/node_modules
mvn package
npm install
npm build
.jar
.war
.ear
国家预防机制办法较为简单(见:scripts)
在npm中,它涉及编写代码或配置补充构建工具,如gulp、webpack等
gulp
webpack
npm init
e4eetjau3#
是的.这是一个类似的java打包工具.查找gradle也给你更多的自由与groovy language,但对于开始你可以使用maven来组织你的依赖.你包括他们作为标记在那里和maven为你做的工作.它遍历依赖关系树并下载所有适当的JAR。
gradle
groovy language
u4vypkhs4#
是的,gradle也一样,但是它们不像npm那样用户友好。
4条答案
按热度按时间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构建工具。
wlzqhblo2#
是的,它们的主要目的是提供一种描述项目依赖关系的方法,而不是将它们保存在项目代码中,它们的次要目的是为开发人员提供一种简单的方法来执行、定义和共享开发时/构建时任务。
大多数情况下,决定使用哪一种语言是很简单的,因为这取决于你所使用的主要语言。
maven
npm
下面我将详细解释它们的共同特性和不同之处。|
npm
项分别为:共同特点:
pom.xml
|package.json
,还允许您部署|发布您自己的工件| Package **。settings.xml
|.npmrc
**)的数据。provided
依赖项,但这似乎不适用于npm,因为javascript很少部署到容器中。groupId
|x1米11米1x差异:
<homedir>/.m2
中,而在npm中则下载到<projectdir>/node_modules
中。mvn package
(fetch deps,build).在npm中,这是一个两步的过程:npm install
(提取部署)、npm build
(构建).jar
、.war
、.ear
等)。然后,您可以覆盖这些操作,或注入新操作(通过插件系统)。这为构建、docgen、测试、部署等提供了一种开箱即用的解决方案。国家预防机制办法较为简单(见:scripts)
pom.xml
。在npm中,它涉及编写代码或配置补充构建工具,如
gulp
、webpack
等npm init
。使用maven,您需要知道如何编写最小的pom.xml
,或者阅读有关原型的内容。pom.xml
比编辑package.json
要常见得多。例如,在maven中添加依赖项是通过命令行在npm中手动(或通过IDE)完成的。e4eetjau3#
是的.这是一个类似的java打包工具.查找
gradle
也给你更多的自由与groovy language
,但对于开始你可以使用maven
来组织你的依赖.你包括他们作为标记在那里和maven为你做的工作.它遍历依赖关系树并下载所有适当的JAR。
u4vypkhs4#
是的,gradle也一样,但是它们不像npm那样用户友好。