正如我使用过的 npm 一样,它在 package.json 文件中查找依赖项并为您下载它。同样,我在 Java 项目中看到了一个 pom.xml 文件。 maven 是否会查看此文件并为我下载依赖项。我可以像 package.json 一样传递这个 pom.xml 文件,而不是提供依赖项 jars 吗?这些工具是否相似并且只是为不同的平台构建?
原文由 Shubham Jain 发布,翻译遵循 CC BY-SA 4.0 许可协议
正如我使用过的 npm 一样,它在 package.json 文件中查找依赖项并为您下载它。同样,我在 Java 项目中看到了一个 pom.xml 文件。 maven 是否会查看此文件并为我下载依赖项。我可以像 package.json 一样传递这个 pom.xml 文件,而不是提供依赖项 jars 吗?这些工具是否相似并且只是为不同的平台构建?
原文由 Shubham Jain 发布,翻译遵循 CC BY-SA 4.0 许可协议
下面我使用 |
来分隔maven | npm 术语分别为:
这两种工具都支持基于描述符文件 动态获取依赖项( 工件 | 包) pom.xml
| package.json
,还允许您 部署 |发布 你自己的 作品 |包裹。
他们都有一个默认的公共 存储库 |注册表( http://repo.maven.apache.org/maven2/ | https://registry.npmjs.org ),但也可以使用第 3 方(通过 settings.xml
| .npmrc
)。
它们都支持 构建级依赖项的概念(插件 | 脚本中使用的 devDependencies) 。 *Maven 也支持 provided
依赖项,但这似乎不适用于 npm,因为 javascript 很少部署到容器中。
它们都支持依赖命名空间: groupId
| scope
maven 有一个额外的 本地存储库(缓存):
在 <homedir>/.m2
中下载来自 Maven 项目构建的依赖项。使用 npm,它们在 <projectdir>/node_modules
中下载。
在 maven 中构建通常是 一步过程: mvn package
(获取 deps,构建)。在 npm 中,它是一个两步过程: npm install
(获取部门), npm build
(构建)
Maven 定义 构建生命周期(用于构建、测试、部署) ,包括阶段,默认操作(插件目标)附加到这些阶段, 基于不同的打包选项( .jar
, .war
, .ear
等)。然后您可以覆盖这些操作,或注入新操作(通过插件系统)。这为构建、文档生成、测试、部署等提供了一种开箱即用的解决方案
npm 方法更简单(请参阅: 脚本)
由于上述原因,npm 被标记 为 javascript 的包管理工具, 而 maven 被标记为 java 的构建自动化和依赖项管理工具。
在 Maven 设置中,构建过程通常涉及 编辑 pom.xml
。
在 npm 中,它涉及 编写代码 或配置 补充构建工具,如 gulp
, webpack
等
由于某些原因,用户在 npm 模块中定义的 版本范围 比在 maven 中 宽松 得多。这可能会导致传递依赖性出现问题,这就是为什么最近添加了一个附加文件: package-lock.json
使用 npm 可以更 直接地开始 一个新项目: npm init
。使用 Maven,您需要知道如何编写最小的 pom.xml
,或阅读原型。
一般来说,编辑 pom.xml
比 package.json
更常见。例如 ,在 maven 中添加依赖项 是 手动(或通过 IDE)完成的,而在 npm 中是通过命令行 完成的。
与所有构建工具一样,您可以从另一个工具内部调用一个工具,但我认为 从 maven 内部调用 npm 比从相反方向调用更常见。
npm 支持 开发、生产构建。在 Maven 中,这需要通过 profiles 来定义。
原文由 Marinos An 发布,翻译遵循 CC BY-SA 4.0 许可协议
15 回答8.4k 阅读
5 回答4.8k 阅读✓ 已解决
8 回答6.2k 阅读
1 回答6k 阅读✓ 已解决
4 回答2.4k 阅读✓ 已解决
1 回答4k 阅读✓ 已解决
5 回答3.6k 阅读
相同的工具,不同的语言?
Maven 是最流行的 Java 构建和依赖解析工具,就像 NPM 用于 JS 一样。但它不仅仅是用于不同语言的相同工具。 Java 和 JS 构建之间显然存在巨大差异,这些差异在 Maven 操作方式中直接可见。例如,虽然许多 JS 工具依赖 Git 来完成一些繁重的工作,但 Maven 使用基于自定义文件系统的 Maven 存储库,因为 Maven 早于 Git 并且需要处理二进制工件,而 Git 在历史上不能很好地处理这些工件。在 Maven 中,源代码和二进制文件之间有明显的区别,而在 JS 世界中它们通常是同一回事。
Maven基础
最纯粹的 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 使用 依赖解析 来选择一个版本。这意味着有时您的传递依赖项会获得与所需版本不同的版本,但有一些方法可以管理它。但是,此限制来自 Java,而不是 Maven,因为(通常)在 Java 中,即使在类路径中找到多个定义,类加载器也只会提供对单个类定义的访问。由于 Java 不是特别擅长处理这种情况,因此 Maven 一开始就试图避免这种情况。
注意:从 npm v3 开始,依赖项是扁平化的。替代包管理器 纱线 也做同样的事情。
到期
此外,Maven 比 NPM 更老,拥有更大的用户群,大量的自定义插件,到目前为止可能被认为总体上更成熟。有时 Maven 用于非 Java 甚至多语言项目,因为有一些插件可以处理其他语言或特定环境,例如 Android。有一些插件可以连接 Maven 和其他构建工具,例如实际处理多个 JS 构建工具 的 frontend-maven-plugin 。