正如我与npm一起工作的那样,它在package.json文件中查找依赖项并为您下载。同样,我在Java项目中看到一个pom.xml文件。Maven是否会在此文件中查找并为我下载依赖项。我可以绕过像package.json这样的pom.xml文件,而不是提供依赖项jar吗?这些工具是否相似并且仅针对不同的平台构建?
正如我与npm一起工作的那样,它在package.json文件中查找依赖项并为您下载。同样,我在Java项目中看到一个pom.xml文件。Maven是否会在此文件中查找并为我下载依赖项。我可以绕过像package.json这样的pom.xml文件,而不是提供依赖项jar吗?这些工具是否相似并且仅针对不同的平台构建?
Answers:
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,版本)。
根据另一个答案中的注释,Maven提供了“平面依赖树”,而不是NPM默认提供的“嵌套依赖树”。Maven不允许相同依赖项的多个版本。如果碰巧要求使用不同的版本,则Maven使用依赖项解析来选择一个版本。这意味着有时您的传递性依赖项将获得与所需版本不同的版本,但是可以通过多种方法来管理它。但是,此限制来自Java,而不是Maven,因为(通常)在Java中,即使在类路径中找到了多个定义,类加载器也只能提供对单个类定义的访问。由于Java并不是特别擅长处理此问题,因此Maven首先尝试避免这种情况。
注意:从npm v3开始,依赖关系变得平坦。替代的卷装管理器纱线也执行相同的操作。
此外,Maven比NPM年龄要大得多,拥有更大的用户群,数量众多的自定义插件,到目前为止,它可能总体上被认为更成熟。有时,Maven用于非Java甚至是多语言项目,因为有用于处理其他语言或特定环境(例如Android)的插件。有一些桥接Maven和其他构建工具的插件,例如实际上可以处理多个JS构建工具的frontend-maven-plugin。
下面我用|
Maven来分隔 npm条款:
两种工具均支持基于描述符文件|依赖项的动态获取依赖项(工件|包)pom.xml
。package.json
,还允许您部署| 发布自己的工件| 包。
它们都有默认的公共存储库。注册表 (http://repo.maven.apache.org/maven2/ | https://registry.npmjs.org),但是也可以使用3rd-party(通过settings.xml
|.npmrc
)。
它们都支持构建级依赖项的概念(脚本中使用的插件| devDependencies)。* Mavenprovided
也支持依赖关系,但这似乎不适用于npm,因为javascript很少部署到容器中。
它们都支持依赖命名空间:groupId
|scope
Maven还有一个附加的本地存储库(缓存):
来自Maven中的项目构建的依赖项在中下载<homedir>/.m2
。使用npm可以将它们下载到中<projectdir>/node_modules
。
在Maven中进行构建通常是一个步骤:(mvn package
获取deps,进行构建)。在npm中,这是一个两步过程:npm install
(fetch deps),npm build
(build)
行家定义构建生命周期(用于构建,测试,部署)由阶段,到默认操作(插件的目标)连接,基于differrent封装选项(.jar
,.war
,.ear
等)。然后,您可以覆盖这些操作,或注入新的操作(通过插件系统)。这为build,docgen,test,deploy等提供了一种开箱即用的解决方案。npm
方法更加简单(请参阅: 脚本)
由于上述原因,npm被标记为javascript的软件包管理工具,而maven被标记为java的构建自动化和依赖关系管理工具。
在maven设置中,构建过程通常涉及编辑pom.xml
。
在npm中,它涉及编写代码或配置补充构建工具(例如gulp
)webpack
等
由于某些原因,用户在npm模块中定义的版本范围比maven宽松得多。这可能会导致传递依赖项出现问题,这就是最近添加一个附加文件的原因:package-lock.json
使用npm ,开始一个新项目要简单得多:npm init
。使用Maven,您需要知道如何编写minimalpom.xml
或阅读有关原型的信息。
一般而言,编辑pom.xml
比package.json
。例如在行家添加依赖完成手动(或经由IDE),而在NPM通过命令行。
与所有构建工具一样,您可以从另一个内部调用一个工具,但是我认为从maven内部调用npm比在另一个内部调用更为普遍。
npm支持开发,生产构建。在Maven中,这需要通过配置文件进行定义。
是。它是Java的类似打包工具。gradle
还可以通过查找为您提供更多的自由groovy language
,但是首先,您可以使用maven
来组织依赖项。您将它们作为标签包括在内,而maven会为您完成工作。
它遍历依赖关系树并下载所有适当的jar。
gradle
是maven + ant
一起让我们说。它可以完成maven的工作,但它除了提供事实上的所有工作外,还为您提供了编写代码和脚本的自由。我刚才看了看gulp
。从我阅读的内容来看,也许是一样的。如果您想开始使用Maven vs Gradle,我建议您从此开始maven
更清晰,更容易理解,然后将其弄乱gradle
!