我曾经使用过 npm,它在 package.json 文件中查找依赖项并为您下载它。类似地,我在 Java 项目中看到一个 pom.xml 文件。Maven 是否查看这个文件并为我下载依赖项。我是否可以像 package.json 那样传递 pom.xml 文件,而不是给出依赖项 jar?这些工具是否相似,只是针对不同的平台构建的?
是的。这是一个类似的 Java 打包工具。寻找 gradle也给你更多的自由与 groovy language,但作为开始,你可以使用 maven来组织你的依赖。你把它们作为标签放在那里 Maven 就会替你完成工作。
gradle
groovy language
maven
它遍历依赖树并下载所有适当的 jar。
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
Similarly to package.json, you don't work with pom.xml of your dependency directly, but rather define dependency coordinates and let your build tool handle the rest. In Maven the basic form of these coordinates is GAV (groupId, artifactId, version).
基于另一个答案中的注释,Maven 提供了“平面依赖树”,而不是 NPM 默认提供的“嵌套依赖树”。Maven 不允许同一依赖项的多个版本。如果需要不同的版本,Maven 使用 依赖性解决方案选择一个版本。这意味着,有时候您的传递依赖关系将获得不同于它们所需的版本,但是有一些方法可以管理这种情况。但是,这个限制来自 Java,而不是 Maven,因为(通常)在 Java 中,类装入器只提供对单个类定义的访问,即使在类路径上发现了多个定义。由于 Java 并不特别擅长处理这种情况,Maven 首先试图避免这种情况。
注意: 自 npm v3以来,依赖关系是扁平的。替代的包管理器 纱线也是如此。
此外,Maven 要比 NPM 老得多,拥有更大的用户基础,大量的自定义插件,到目前为止可能被认为更加成熟。有时 Maven 用于非 Java 项目,甚至用于多语种项目,因为有些插件用于处理其他语言或特定环境,如 Android。有些插件可以连接 Maven 和其他构建工具,比如 前端-专家-插件,它实际上可以处理多个 JS 构建工具。
是的,与 gradle 相同,但它们不像 npm 那样用户友好。
下面我使用 |分别分隔 maven | npm 术语:
|
这两个工具都支持基于描述符文件 ABC0 | package.json的 依赖项的动态获取(艺术品 | 包裹) ,并且还允许您使用 部署 | 发布自己的 艺术品 | 包裹。
它们都有一个默认的公共 存储库 | 注册表(http://repo.maven.apache.org/maven2/ | https://registry.npmjs.org) ,但也可以使用第三方(通过 ABC0 | .npmrc)。
.npmrc
它们都支持 构建级别的依赖项(脚本中使用的插件 | devDependency)的概念。* Maven 也支持 provided依赖关系,但这似乎不适用于 npm,因为 javascript 很少被部署到容器中。
provided
They both support dependency namespacing: groupId|scope
groupId
scope
Maven 还有一个额外的 本地储存库(缓存) :
从 maven 中的项目构建的依赖关系在 <homedir>/.m2中下载,使用 npm 在 <projectdir>/node_modules中下载。
<homedir>/.m2
<projectdir>/node_modules
在 Maven中构建通常是 一步到位的过程: mvn package(获取 deps,构建)。在 npm 中,有两个步骤: npm install(提取 deps)、 npm build(构建)
mvn package
npm install
npm build
Maven 根据不同的打包选项(.jar、 .war、 .ear e.t.c)定义了 建立生命周期(用于构建、测试和部署) 由各个阶段组成,这些阶段附加了默认操作(插件目标)。然后你可以覆盖这些操作,或者注入新的操作(通过插件系统)。这为构建、 docgen、测试、部署 e.t.c 提供了一种开箱即用的解决方案。 Npm 方法更加简单(见: 剧本)
.jar
.war
.ear
由于上述原因,npm 被标记为 package-management tool for javascript,而 Maven 被标记为 Java 的构建自动化和依赖管理工具。
在 maven 设置中,构建过程通常涉及到 编辑 pom.xml。 在 npm 中,它涉及到 写代码或配置 辅助构建工具,如 gulp、 webpack e.t.c
gulp
webpack
由于某些原因,用户在 npm 模块中定义的 版本范围比在 maven 中定义的 放松要多得多。这可能导致传递依赖性问题,这就是为什么最近添加了一个附加文件: package-lock.json
package-lock.json
与 npm 是更多的 一开始就很简单一个新的项目: npm init。使用 maven,您需要知道如何编写最小的 pom.xml,或者阅读有关原型的内容。
npm init
一般来说,编辑 pom.xml比编辑 package.json更常见。例如,在 maven 中添加依赖项是在 通过命令行进行 npm中完成的 手动操作(或通过 IDE)。
与所有构建工具一样,您可以从一个工具内部调用另一个工具,但是我认为调用 npm from inside maven比调用相反的工具更为常见。
npm supports 开发人员,生产建设. In maven this needs to be defined through 资料.