为什么Maven有这么糟糕的代表?

网上有很多关于Maven如何坏的话题。 几年来我一直在使用Maven的一些特性,在我看来最重要的好处是依赖pipe理。

Maven的文档还不够,但是通常当我需要完成一些工作的时候,我想到了一次,然后工作(例如当我实现签署jar子时)。 我不认为Maven是伟大的,但它确实解决了一些问题,如果没有它,这将是一个真正的痛苦。

那么,为什么Maven有这样一个糟糕的代表,Maven可以期待什么问题? 也许有更好的select,我不知道? (例如,我从来没有详细看过常春藤。)

注意:这不是试图引起一个参数。 这是一个尝试清除FUD。

我大概六个月前看着maven。 我们正在开始一个新项目,没有任何支持的遗产。 那就是说:

  • Maven是全有或全无。 或者至less据我所知道的文件。 您不能轻易使用maven作为ant的直接替代品,并逐渐采用更高级的function。
  • 根据文档,Maven是超然的幸福,让所有你最疯狂的梦想成真。 在开悟之前,你只需要冥想手册10年。
  • Maven使您的构build过程依赖于您的networking连接。
  • Maven有无用的错误信息。 将ant的“Target x在项目y中不存在”与mvn的“无效任务运行”进行比较:您必须指定一个有效的生命周期阶段或目标,格式为plugin:goal或pluginGroupId:pluginArtifactId:pluginVersion:goal“它build议我用-e运行mvn以获取更多信息,这意味着它将打印相同的消息,然后是一个BuildFailureException的堆栈跟踪。

我不喜欢maven的很大一部分可以从以下摘自Better Builds with Maven的摘录中解释:

当有人想知道Maven是什么的时候,他们通常会问“Maven究竟是什么?”,他们期望得到一个简短的答案。 “它是一个构build工具或脚本框架”Maven不仅仅是三个无聊而且毫无鼓舞的词汇。 这是思想,标准和软件的结合,不可能将Maven的定义提炼成简单的消解声音。 革命的思想常常难以用言语expression。

我的build议是:如果你不能用言语expression想法,你不应该试图写一本关于这个主题的书,因为我不会心灵感应地吸收这些想法。

  • 它从一开始就对你施加严格的结构。
  • 这是基于XML的,所以和ANT一样难以阅读。
  • 它的错误报告是晦涩难懂的,当事情出错时,你就会陷入困境。
  • 文档很差。
  • 它使艰难的事情变得简单,简单的事情变得困难。
  • 维护一个Maven构build环境需要太多的时间,这打破了一个全唱的构build系统。
  • 需要很长时间才能发现你在maven中发现了一个bug,而且没有configuration错误。 而这些错误确实存在,并且在令人惊讶的地方。
  • 它承诺很多,但是却背叛了你,就像一个美丽而诱人的,但情绪冷漠和操纵的情人。

过去我肯定唠叨和唠叨过maven 。 但现在,我不会没有它。 我觉得好处远远大于任何问题。 主要:

  • 标准化的项目结构
    • 给一个新的开发者join一个项目:
      • 当你说这是一个Maven项目时,开发人员知道项目布局以及如何构build和打包项目
      • 当你说这是一个Ant项目时,开发人员将不得不等待你解释更多,否则将不得不通过build.xml来解决问题。
    • 当然,总是可以用Ant来强加全公司的标准,但我常常想,你会重新发明一个谚语。
  • 依赖pipe理。
    • 不只是使用外部库,也使用内部库/模块。 确保使用Maven存储库代理服务器,如Nexus或Artifactory 。
    • 常春藤可以做一些这样的事情。 事实上,如果你需要的只是一个依赖pipe理,那么使用Ivy可能会更好。
  • 特别是在一个项目内。 我发现打破一些小项目是非常有用的,maven处理这个问题。 ant要困难得多。
  • 标准化的工件pipe理(特别是与连接或工艺相结合)
  • 发布插件是美好的。
  • Eclipse和NetBeans的整合非常好。
  • 与哈德森的融合非常棒。 特别是像findbugs这样的趋势图。
  • 这是一个小问题,但是Maven默认embeddedjar或war之类的细节(不仅仅是文件名)的细节非常有帮助。

我的缺点主要是:

  • 命令行是相当无益的。 这首先让我感到很开心。
  • XML格式非常冗长。 我可以看出为什么这样做,但阅读起来还是很痛苦的。
    • 也就是说,它有一个XSD,便于在IDE中进行编辑。
  • 一开始就很难把你的头围绕起来。 例如,像生命周期一样。
    • maven的权威指南是一个很好的介绍。

我真的相信花点时间去了解maven是值得的。

我从两个大项目中获得的实践经验是,我们花费了1000-1500个小时的时间处理每个项目的相关问题,不包括500小时从maven 1转到maven 2的工作。

从那以后,我必须说我绝对讨厌maven。 想到这件事,我感到很沮丧。

Eclipse集成是可怕的。 (例如,我们在代码生成方面遇到了无穷无尽的麻烦,在这种情况下,eclipse与生成的代码产生了同步,并且需要经常进行完整的重build。怪罪是maven和eclipse,但是eclipse比maven和emacs更有用,所以日食和maven必须去。)

我们有很多的依赖,正如我们发现的那样,语法错误实际上经常被委托给公共的maven仓库,这可能会浪费你宝贵的时间。 每周。 解决方法是使用代理或本地pipe理的存储库,而且花费相当多的时间才能正确使用。

Mavens项目结构并不适合Eclipse开发,而Eclipse中的构build时间增加。

代码生成和同步问题的影响,我们不得不经常从堆栈重build,将代码/编译/testing周期减less到无穷无尽的编译/ websurf / sleep / die / code-cycle,并将其发送回90年代40分钟的编译时间。

maven唯一的借口是依赖解决scheme,但是我想偶尔做一次,而不是每一次构build。

总而言之,maven与KISS相距甚远。 而且,在年龄大增的时候,拥护者往往是那种在生日那天庆祝额外的人。 随意投我一下:-)

Maven很棒。 在我看来,其声誉的原因与陡峭的学习曲线有关。 (我终于接近了)

这个文档有点粗糙,只是因为它觉得有很多文本和新东西要理解才开始有意义。 我说时间是Maven需要得到更广泛的赞扬所需要的。

因为Maven是减less大人们啜泣绝对恐怖群众的手段。

优点:

  • 依赖pipe理。 几年来,我的同事和我都没有手动下载和pipe理依赖关系。 这是一个巨大的节省时间。
  • IDE独立性。 事实certificate,所有主要IDE,Eclipse,IDEA和NetBeans如何得到Maven项目的体面支持,所以我们的开发人员不会被locking在一个特定的IDE中。
  • 命令行。 借助Maven,支持同时进行的IDE和命令行configuration非常简单,有利于持续集成。

缺点:

竞争:

  • ant:没有依赖pipe理。 期。
  • 常春藤:还不够成熟Maven(不是后者也没有它的怪癖)。 几乎相同的function集,所以没有令人信服的理由移动。 我做了几次尝试, 全部不成功。

底线:我们所有的项目都已经用Maven完成了好几年了。

我觉得这个项目对于那些最简单,最复杂项目的人来说是一个不好的名声。

如果从单个代码库构build单个WAR,则会迫使您移动项目结构,并手动将三个瓶中的两个瓶jar列入POM文件。

如果要从一组九个EAR文件原型中构build一个EAR文件,并且包含五个WAR文件,三个EJB和其他17个工具,依赖关系jar和configuration,这些工具需要在最终生成过程中调整现有资源中的MANIFEST.MF和XML文件; 那么Maven可能太受限制了。 这样的项目变成了一堆复杂的嵌套的configuration文件,属性文件和滥用Maven构build目标和分类器指定。

所以如果你处于复杂曲线的底部10%,那就太过于夸张了。 在这条曲线的前10%,你处在紧箍咒中。

Maven的增长是因为它适合80%

我的经验回应了许多职位的挫折。 Maven的问题在于,为了追求最终的自动化善良,它隐藏并隐藏了构buildpipe理的细节。 这让你几乎无助,如果它打破。

我的经验是,maven的任何问题很快就会通过嵌套的xml文件networking退化为一个多小时的狙击手,类似于根pipe的经验。

我也曾在依赖Maven的商店工作过,喜欢它的人(喜欢“按下button,完成所有工作”的人)并不理解它。 这个maven版本有一百万个自动目标,如果我花时间读完他们所做的,我肯定会有用的。 更好的2个目标,你完全理解的工作。

警告:2年前与Maven合作过,现在可能会更好。

和Glenn一样,我不认为Maven有一个不好的代表,而是一个混合代表。 我一直工作了6个月,专门尝试将一个相当大的项目项目迁移到Maven,并清楚地显示了该工具的限制。

根据我的经验,Maven对于:

  • 外部依赖pipe理
  • 集中pipe理构build(pominheritance)
  • 大量的插件很多东西
  • 与持续集成工具非常好的集成
  • 非常好的报告function(FindBugs,PMD,Checkstyle,Javadoc …)

而且还有一些问题:

  • 全部或没有办法(很难慢慢迁移到Maven)
  • 复杂依赖关系,intermodules依赖关系
  • 循环依赖(我知道,糟糕的devise,但我们无法修复5年的开发…)
  • 一致性(版本范围在任何地方都不一样)
  • 错误(再次与版本范围)
  • 可重复的构build(除非你修复所有插件的版本号,你不能确定你将在6个月内获得相同的构build)
  • 缺乏文档(这个文档对于基础知识来说是相当不错的,但是如何处理大型项目却没有太多的例子)

为了给出一些背景,大约有30个开发人员在这个项目上工作,而且这个项目已经有5年多的时间了,所以很多遗留下来的,大量的过程已经到位,已经有很多定制的专有工具。 我们决定尝试迁移到Maven,因为维护我们专有工具的成本太高了。

我想反驳在这个论坛上提出的一些抱怨:

Maven是全有或全无。 或者至less据我所知道的文件。 您不能轻易使用maven作为ant的直接替代品,并逐渐采用更高级的function。

这是不正确的。 Maven的巨大胜利是用它来理性地pipe理你的依赖关系,如果你想用maven来做这件事,并且用ant做所有事情,你可以。 就是这样:

<?xml version="1.0" encoding="UTF-8"?> <project name="foo" basedir="." xmlns:maven="antlib:org.apache.maven.artifact.ant" > <maven:dependencies verbose="true" pathId="maven.classpath"> <maven:pom id="maven.pom" file="pom.xml" /> </maven:dependencies> </project> 

你现在有一个名为“maven.classpath”的classpath对象,它包含了在pom文件中定义的所有maven依赖项。 所有你需要的是把maven的ant任务jar放在你的ant的lib目录下。

Maven使您的构build过程依赖于您的networking连接。

默认的依赖和插件提取过程取决于networking连接,是的,但只适用于最初的构build(或者如果你改变了依赖或插件的使用)。 之后,所有的jar子都在本地caching。 如果你想强制无networking连接,你可以告诉maven使用离线模式。

它从一开始就对你施加严格的结构。

它不清楚这是指文件格式还是“惯例与configuration”问题。 对于后者,有很多不可见的默认值,比如java源文件和资源的预期位置,或者源代码的兼容性。 但是这不是硬性的,它为您提供了合理的默认值,所以您不必明确地定义它们。 所有的设置可以很容易地重写(尽pipe对于初学者来说,在文档中很难find如何改变某些东西)。

如果你正在谈论的文件格式,以及在下一部分的答复涵盖…

这是基于XML的,所以和ANT一样难以阅读。

首先,我不明白你怎么可能抱怨某个东西“不比ant好”的某个方面作为它有一个不好的代表的理由。 其次,虽然它仍然是XML,但XML的格式更加明确。 而且,因为它的定义,所以为POM做一个合理的厚客户端编辑器要容易得多。 我已经看到了页面很长的ant构build脚本跳过所有的地方。 任何ant构build脚本编辑器都不会让这个更美味的,只是一个稍微不同的方式呈现的另一个长长的互相连接的任务列表。

话虽如此,我在这里看到的一些抱怨有或有一些无能为力,最大的存在

  • 文档很差/缺失
  • 可复制的版本
  • Eclipse集成是不好的
  • 错误

我的回答是双重的。 首先,Maven比Ant或Make要年轻得多,所以你不得不期待要花费时间才能达到这些应用程序的成熟度。 其次是,如果你不喜欢它, 修理它 。 它是一个开源项目,使用它,然后抱怨任何人都可以解决的事情似乎相当于我。 不喜欢文档? 有助于使其更清晰,更完整或更易于初学者使用。

可重复构build问题分为两个问题,版本范围和自动Maven插件更新。 对于插件来说,除非在一年之后重新编译项目时确保使用完全相同的JDK和完全相同的Ant版本,否则这只是一个不同名称的相同问题。 对于版本范围,我build议开发一个插件,它将为所有直接和传递的依赖生成一个locking版本的临时pom,并使其成为maven发布生命周期的一部分。 这样,你的发布版本poms就是所有依赖关系的精确描述。

它应该得到它的声誉。 并不是每个人都需要Maven开发人员认为适合每个项目的严格结构。 它非常不灵活。 对于许多人来说,“亲”是什么,依赖pipe理,恕我直言,它是最大的“骗子”。 我绝对不满意maven从networking上下载jar子,并失去对不兼容的睡眠(是的,离线模式存在,但为什么我应该有所有这些数百个XML文件和校验和)。 我决定使用哪个库,许多项目都依赖于networking连接严重关注构build。

更糟糕的是,当事情不能奏效的时候,你完全迷失了。 文件很糟糕,社区很无聊。

一年后,我想更新这个:我不再有这个关于Maven社区的意见。 如果今天提出这个问题,我不会写这个答案。 我将把我目前的意见作为一个单独的答案。


这是一个非常主观的答案,但问题是关于意见,所以…

我喜欢Maven,越喜欢它,我越了解它。 但是,有一件事影响了我的感觉:maven社区主要围绕着Sonatype(“Maven公司”,这是很多Maven公司的工作地点),而Sonatype公司正在积极推动公司产品在社区中的发展。

一个例子:“Maven Book”的twitterstream连接到一个所谓的存储库pipe理介绍 。

对不起,这个“介绍”是Nexus的一半信息,一半销售额。 stream行测验:除了Nexus和Nexus Pro之外,还有其他回购经理吗? 另外,这与所谓的开源Maven Book有什么关系呢? 哦,对了,关于知识库pipe理的一章已经分成了一本关于Nexus的书。 呵呵。 如果我贡献了Maven书籍,如果我增加了Nexus销售额,我是否会收到推荐费用?

想象一下,如果您参与了Java开发论坛,那么讨论Java的Sun员工就会抓住每一个可能的机会来讨论NetBeans和“NetBeans Pro”。 过了一段时间,它失去了一些社区的感觉。 我从来没有像Ant那样的经历过。

说完这一切,我确实认为Maven是一个非常有趣和有用的系统(我不称之为工具,就像Ant,Maven比这个更广泛),用于软件开发configuration和构buildpipe理。 依赖pipe理有时是一种祝福和诅咒,但是它是令人耳目一新的 – 当然不是Maven提供的唯一优势。 我可能对Sonatype先令的反应太强烈了,但是在我看来,它会伤害Maven。 我不知道这个意见是否与其他人分享。

我认为Maven得到了一个坏的说唱,因为它强加给你的项目的结构,而其他工具,如Ant允许你完全定义你想要的结构。 也同意文档不好,但我认为主要是Maven得到的坏消息是因为人们习惯了Ant。

太神奇了。

因为不满意的人抱怨而满意的人不说他们满意。 我的观点是,有更多满意的maven用户比不满意,但后来更多的噪音。 这实际上也是现实生活中常见的模式(ISP,电话运营商,运输等)。

对我来说唯一最重要的问题是,如果Mavenconfiguration不当,可能无法生成可重复构build,原因如下:

  • 不可靠的远程仓库;
  • 依赖于SNAPSHOT版本或没有版本的插件和库。

与ant构build相反,虽然所有的jar子都在本地检查,尽pipe冗长而烦人的IMO工作。

好的部分是问题是可以解决的:

  • 使用你自己的Maven仓库,这已经变得很简单,我正在使用Archiva ,效果很好;
  • 总是正确地版本您的依赖关系。 Maven已经开始在2.0.8或2.0.9开始的超级POM中locking插件版本,并且所有的依赖应该在发布的版本上。

好主意 – 糟糕的实施。

我最近把一个项目从Ant移到了Maven。 它在最后工作得很好,但是我必须在同一个pom中使用两个不同版本的maven-assembly-plugin和maven-jar-plugin(有两个configuration文件),因为在一个版本中工作的是另一个版本。

所以这非常令人头痛。 文档并不总是很好,但我必须承认,谷歌的答案相对容易。

确保你总是指定你使用的插件的版本。 不要指望新版本会向后兼容。

我认为争议来自于maven仍然在演变,而且这个过程有时候是痛苦的。

问候

我喜欢maven。 我从1.0之前就已经使用它了。 这是一个强大的工具,为我节省了大量的时间,并改善了我的开发基础设施。 但是我可以理解一些人的挫败感。 我看到三种挫折感:

  1. 原因是真正的问题(例如详细的POM,缺less文档),
  2. 有些是错误信息(例如“你必须build立一个互联网连接” – 不是真的 – 不要这样做,这是可以避免的),
  3. 其中一些是maven放空,但真的有人是有罪的(“不要射击使者”)。

对于第一种情况,真正的问题 – 当然,有问题,POM是冗长的,文档可能会更好。 尽pipe如此,在短时间内可以用maven获得好的结果。 每当我得到一个用ant构build的项目时,我都会畏缩,并尝试将其导入到我的IDE中。 build立目录结构可能需要很长时间。 使用maven,只是在IDE中打开POM文件的情况。

对于第二种情况,Maven是复杂的,误解是司空见惯的。 如果maven 3可以find解决这种复杂性(或者甚至是复杂性)的方法,那将是一件好事。 maven的确需要投入很大的资金,但是根据我的经验,投资很快就会收回。

至于最后一点,我认为Maven的传递依赖关系可能是最有名的例子。

传递依赖性是使用重用的真正软件的本质。 Windows DLL,Debian软件包,java软件包,OSGi软件包,甚至包括C ++头文件都包含依赖项,并且存在依赖性问题。 如果你有两个依赖,并且每个都使用不同版本的相同的东西,那么你必须尝试以某种方式解决这个问题。 Maven并不试图解决依赖性问题,而是把它带到最前沿,并提供工具来帮助pipe理问题,比如通过报告冲突和为项目层次结构提供一致的依赖关系,并且实际上提供绝对控制一个项目的依赖关系。

手动在每个项目中包含依赖关系的方法(一个海报说他检查所有依赖关系到源代码控制中)正在冒着使用错误依赖的风险,比如当一个库被更新时忽略更新,而没有检查它的依赖更新。 对于任何规模的项目,手动pipe理依赖关系肯定会导致错误。 使用maven,你可以更新你使用的库版本,并包含正确的依赖关系。 对于变更pipe理,您可以将旧的依赖关系(对于您的项目作为一个整体)与新的集合进行比较,并且可以仔细检查,testing等。

Maven不是依赖问题的原因,而是使其更加明显。 在解决依赖性问题时,maven使得任何依赖性“调整”明确(改变你的POM覆盖依赖),而不是隐式的,就像在版本控制中手动pipe理的jar一样,jar只是简单的存在,支持天气,他们是正确的依赖或不。

我相信Maven有一个不好的代表,因为大多数批评者没有观察到Maven + Hudson + Sonar的组合。 如果他们有,他们会问“我怎么开始”?

我的一些宠物与Maven偷情:

  • XML定义非常笨拙和冗长。 他们从来没有听说过属性吗?

  • 在其默认configuration中,它总是在每个操作上扫描“networking”。 不pipe这个function是否有用,对于“干净”的互联网访问来说,看起来都非常愚蠢。

  • 同样在默认情况下,如果我不小心指定确切的版本号,它将从网上取得最新的更新,不pipe这些最新版本是否引入依赖性错误。 换句话说,你处于其他人的依赖pipe理的摆布之中。

  • 所有这些networking访问的解决scheme是通过添加-o选项将其closures。 但是如果你真的想要依赖更新的话,你必须记得把它关掉。

  • 另一个解决scheme是安装您自己的“源代码pipe理”服务器的依赖关系。 惊喜:大多数项目已经有了源代码控制,只有在没有额外设置的情况下才能运行!

  • Maven的构build速度非常慢。 摆弄networking更新缓解了这一点,但Maven构build仍然缓慢。 而且非常详细。

  • Maven插件(M2Eclipse)与Eclipse差不多。 Eclipse与版本控制软件和Ant相当顺利地集成在一起。 相比之下,Maven集成非常笨重和丑陋。 我提到慢吗?

  • Maven仍然是越野车。 错误消息是无益的。 太多的开发者正在遭受这个困扰。

好问题。 我刚刚开始了一个大型项目,以前的项目的一部分是将模块化引入到我们的代码库中。

我听说过有关maven的坏消息。 事实上,这是我所听过的所有事情。 我看着介绍它来解决我们目前正在经历的依赖性噩梦。 我在Maven看到的问题是,它的结构非常僵化,也就是说,你需要符合它的项目布局,才能为你工作。

我知道大多数人会说什么 – 你不必遵守结构。 事实确实如此,但是直到你完成最初的学习曲线时,你才会知道这一点。在这一点上,你已经投入了太多的时间去抛弃一切。

ant用了很多这些天,我喜欢它。 考虑到这一点,我偶然发现了一个名叫Apache Ivy的小型已知依赖pipe理器。 常春藤很好地融入了Ant,并且可以快速,轻松地获得基本的JAR检索设置和工作。 常春藤的另一个好处是它非常强大而且非常透明。 你可以很容易地使用诸如scp或ssh之类的机制来传输构build; 通过文件系统或远程存储库进行'链'依赖性检索(Maven回购兼容性是其stream行function之一)。

所有人都说,我发现最后的使用非常令人沮丧 – 文档很多,但是写得很糟糕,在debugging或试图解决问题时会增加挫折感。

我将在这个项目中的某个时候重新访问Apache Ivy,希望能够正常工作。 它所做的一件事就是让我们作为一个团队来研究我们依赖的库,并得到一个文档列表。

最终,我认为这一切都归结为如何作为一个人/团队工作,以及需要什么来解决你的依赖问题。

您可能会发现以下与常春藤有关的资源有用:

  • Apache常春藤与Maven 2比较
  • Apache常春藤FAQ
  • Apache常春藤function列表

我喜欢Maven – 它提高了生产力,我很高兴我不再使用Ant(phew!)

但是,如果我能改变事情,那将是:

  1. 使pom.xml文件不要冗长
  2. 不要从存储库中包含.jar。

人们为什么不喜欢Maven有很多原因,但是面对它,他们是非常主观的 。 Maven今天有了一些好的(免费的)书籍,更好的文档,更好的插件和大量的参考成功的项目构build,与一两年前的Maven是不一样的。

在简单的项目中使用Maven是非常容易的,对于更大或更复杂的项目,需要更多的知识和对Maven理念的更深入的理解 – 也许在公司级别上Maven guru像networkingpipe理员一样。 Maven讨厌的主要来源往往是无知

Maven的另一个缺点就是缺乏像Ant这样的灵活性。 但是记住Maven有一套惯例 – 坚持它们似乎在开始时是困难的,但最终常常是从问题中拯救出来。

Maven目前的成功certificate了它的价值。 当然,没有人是完美的,Maven有一些缺点和怪癖,但在我看来,Maven慢慢地摆动着他的对手。

我不会说它有一个不好的代表,因为它有一个混合代表。 如果你的项目遵循Maven所倡导的“约定configuration”范式,那么你可以从中获得很大的影响力。 如果你的项目不适合Maven的世界观,那么它可能成为一个负担。

为此,如果你能控制这个项目,那么Maven可能就是要走的路。 但是,如果你不这样做,布局是由不是Maven的粉丝决定的,那可能比它的价值更麻烦。 最幸福的Maven项目可能是Maven项目开始的项目。

对我来说,有许多专家利用maven vs ant来进行内部项目。 不过,对于开源项目,我认为Maven对于让许多项目更容易构build起来有很大的影响。 不久之前,花了几个小时才得到了平均的OSS Java(基于ant)项目的编译,必须设置大量的variables,下载相关的项目等等。

你可以用Maven做任何你可以用Ant做的事情,但是Ant不鼓励任何标准,Maven强烈build议你遵循它的结构,否则将会有更多的工作。 的确,有些事情对于Maven来说是很痛苦的,这对于Ant来说很容易做到,但是最终的结果几乎总是从想要检查项目的人的angular度来看更容易build立起来。

如果你打算在开发项目上打赌你的业务或工作,你想要控制基础 – 即构build系统。 有了Maven,你无法控制。 这是陈述和不透明的。 Maven框架开发人员不知道如何构build一个透明或直观的系统,这从日志输出和文档中很清楚。

依赖pipe理是非常诱人的,因为在项目开始的时候它可能会有相同的时间,但是会被警告,它会从根本上打破,最终会给你带来很多的麻烦。 当两个依赖关系具有不兼容的瞬态依赖关系时,将会被复杂的封锁所阻塞,这将会破坏整个团队的构build并阻止数天的开发。 Maven的构build过程由于其本地存储库的状态不一致而对于团队中的不同开发人员而言也是众所周知的不一致的。 根据开发人员创build环境的时间,或者他们正在处理的其他项目,他们将得到不同的结果。 你会发现你正在删除你的整个本地存储库,并且Maven重新下载jar的次数比第一次为dev分支设置的次数要多得多。 我相信OSGI是一个试图解决这个根本问题的举措。 我想说,也许如果事情需要如此复杂,那么基本的前提是错误的。

我已经是一个maven用户/受害者超过5年了,我不得不说,它将为您节省更多的时间来检查您的依赖关系到您的源代码库,并编写好的和简单的ant任务。 用ant,你完全知道你的构build系统在做什么。

由于Maven的问题,我在几家不同的公司遇到了许多失败的人。

我最近试图把一个旧的GWT / Maven / Eclipse项目带回到现实生活中,并在我所有的业余时间里用了两个星期的时间,但是我仍然无法一直build立起来。 现在是时候减less我的损失,并开发使用ant/日食我认为…

简短的回答:我发现维护一个Maven构build系统非常困难,我想尽快切换到Gradle。

我和Maven一起工作了四年多。 我称自己是构build系统的专家,因为在过去的(至less)五家公司中,我已经对构build/部署基础架构进行了重大改造。

我学到的一些教训:

  • 大多数开发人员往往不会花费大量时间考虑构build系统; 因此,这个构build变成了一堆意大利面条,但是当这个混乱被清理和合理化时,他们确实很感激。
  • 在处理复杂性时,我宁愿有一个暴露复杂性的透明系统(比如Ant),而不是试图通过施加严格限制来简化复杂事物的系统,比如Maven。 想想Linux与Windows。
  • Maven在function上有很多漏洞需要拜占庭式的解决方法。 这导致POM文件难以理解和不可维护。
  • Ant是超级灵活和可以理解的,但是Ant文件也可以变得相当大,因为它是如此的低级。
  • 对于任何重要的项目,开发人员必须创build自己的构build/部署结构超出该工具提供的; 结构对项目的适用性与维护的容易程度有很大关系。 最好的工具将支持你创build一个结构,而不是打你。

我已经研究了一下Gradle,看起来它有可能是两个世界中最好的,允许声明和程序构build描述的混合。

这比你用来编写项目的语言复杂得多。 正确configuration比实际编程更难。

我在这里提到的大多数/所有不利因素以及队友的类似反对方面都在努力奋斗,并同意他们的观点。 但是我坚持了下来,并将继续坚持这样一个目标,即只有maven(或者gradle)才能真正实现这个目标。

如果你正在优化同行(开源开发者 ),ant / make /将做什么。 如果你正在向非同行( 用户 )提供function,只有Maven / Gradle /等会做。

只有maven可以让你发布一小组源代码+ poms(没有embedded式lib /二进制依赖关系jar包含隐秘的名字,没有依赖信息),有一个良好的文档标准的项目布局,任何IDE可以加载没有吸收的人开发人员特殊的布局约定。 还有一个一键安装程序(mvn install),可以在获取任何缺失的依赖关系的同时构build一切。

其结果是一个简单的入口,用户可以按照自己的方式进入代码,在这里poms可以指向相关的文档。

除了(不可或缺)的要求之外,我和其他人一样不喜欢maven。