maven - 命令式与声明式构建系统

标签 maven ant gradle

我最近开始使用 Gradle 作为构建系统。
Gradle 与 Ant 和 Maven 之类的第一个比较是,
Ant 是 势在必行构建系统,而 Maven 是 声明性 构建系统。
而 Gradle 是一个声明式构建系统,没有 Maven 强制执行的刚性。

在谈论构建系统时,我想更好地理解这些声明性和命令性术语。

最佳答案

总之,一个 Ant 脚本告诉 Ant 工具该做什么 - “编译这些文件,然后将它们复制到该文件夹​​。然后获取该文件夹的内容并创建一个存档。”

而一个 maven pom声明 我们希望得到的结果 - “这里是项目所依赖的库的名称,我们想生成一个网络文件”。 Maven 知道如何获取库以及在哪里可以找到它自己的源类。

虽然 ant 为您提供了更大的灵 active ,但它也迫使您不断地重新发明轮子。

另一方面,Maven 需要较少的配置,但可能会感觉过于受限,特别是如果您习惯了不同的工作流程。

编辑: ant-maven 比较的一个重要方面是 maven 有一个 公约 ,描述文件应该放在哪里,在哪里找到依赖项,在哪里放置生成的 Artifact ,而 ant 没有。

因此,您可以将使用 maven 想象为乘坐公共(public)汽车 - 您选择进入的站点和离开的站点。使用 ant 就像开车一样——你必须自己动手。您不必告诉巴士司机该做什么,但停靠站可能离您想去的地方太远。

EDIT2: “重新发明轮子”的比喻似乎没有我希望的那么清晰。这就是我的意思:

如果没有合理的默认值/约定,您必须为每个项目明确定义项目结构和构建生命周期,这通常使其成为品味和意见的问题。由于团队和公司之间的偏好不同,因此构建流程也是如此。这需要新项目成员和后来的维护者付出更多的认知努力。根据开发人员的经验和专业知识,最终的解决方案可能难以扩展和使用。

正如我在下面的评论中所说,虽然存在 ant 构建的最佳实践,但它们仍然必须为每个项目实现,或者从一个项目复制粘贴到另一个项目,而不是成为构建的开箱即用默认值工具本身。

对于我的口味,Maven 在权衡的另一边有点过分了。更改默认值并不像它可以而且应该那样容易。

关于maven - 命令式与声明式构建系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14955597/

相关文章:

java - 如何制作可重定位的rpm?

maven - cxf.version 3.2.1 给出 org.apache.cxf.tools.common.ToolErrorListener 错误

eclipse - 在eclipse中从模板自动生成ant文件

ant - 本地存储库的 Ivy 教程很好吗?

android - 库已添加 : Gradle Build

Gradle:关于任务失败的自定义消息?

java - 如何在.java文件中使用build.gradle中定义的变量

spring - Karate如何在Azure管道中启动应用程序?

eclipse - travis 中的 Sonar `should be relative to project baseDir` 错误

gradle - Ant 替换 token -Gradle