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

Dan*_*Dan 99 java build-automation build-process maven-2

互联网上有很多关于Maven如何糟糕的话题.我已经使用Maven的一些功能已经有几年了,我认为最重要的好处是依赖管理.

Maven文档不够充分,但通常当我需要完成某些事情时我会弄清楚它然后它可以工作(例如当我实现签署jar时).我不认为Maven是伟大的,但它确实解决了一些问题,没有它将是一个真正的痛苦.

那么,为什么Maven会有如此糟糕的代表,以及Maven在未来会遇到什么问题呢?也许还有更多我不了解的替代方案?(例如,我从未详细看过常春藤.)

注意:这不是导致争论的尝试.这是尝试清除FUD.

Kev*_*son 140

大约六个月前我调查了maven.我们正在开始一个新项目,并没有任何遗产支持.那说:

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

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

当有人想知道Maven是什么时,他们通常会问"Maven究竟是什么?",他们希望得到一个简短的声音答案."好吧,它是一个构建工具或一个脚本框架"Maven是三个以上无聊,没有吸引力的单词.它是思想,标准和软件的结合,并且不可能将Maven的定义提炼为简单的消化声音.革命性的想法通常难以用语言传达.

我的建议是:如果你不能用文字传达这些想法,你就不应该试着写一本关于这个主题的书,因为我不会心灵感应地吸收这些想法.

  • 对于那些了解Maven的人,不需要任何解释.对于那些不这样做的人,不可能有任何解释. (134认同)
  • 你的一个要点是假的.-o - 离线模式,所以不,它不会使您的构建过程依赖于您的网络连接. (35认同)
  • @Apocalisp:换句话说,唯一了解Maven的人就是编写它的人? (14认同)
  • 我同意全有或全无的观点.我已经看到很多人浪费太多时间试图将他们一半的项目组合保留在蚂蚁和一半的maven中.提交后,您必须将工作转换为部署的每个部分. (10认同)
  • *Maven是全有或全无.*这不是真的.如果需要,您可以使用maven进行依赖关系管理.所需要的只是一个工作示例,说明如何使用Maven ant任务来读取pom文件并生成包含所有依赖项的ANT类路径. (5认同)
  • *Maven使您的构建过程依赖于您的网络连接.*非常不正确.如果您需要下载尚未拥有的依赖项,那么是的,您需要网络连接.对于任何其他构建工具,情况怎么样? (3认同)

izb*_*izb 109

  • 它从一开始就强加于你的结构.
  • 它是基于XML的,所以它和ANT一样难以阅读.
  • 它的错误报告是模糊的,当出现问题时会让你陷入困境.
  • 文档很差.
  • 它让事情变得简单,简单易事.
  • 维护Maven构建环境需要花费太多时间,这使得拥有一个全能的构建系统失败了.
  • 需要很长时间才能发现你在maven中发现了一个错误并且没有配置错误.这些错误确实存在,而且在令人惊讶的地方.
  • 它承诺了很多,但却背叛了你,就像一个美丽而诱人,但情感冷漠和操纵的情人.

  • ++它让事情变得简单,简单易事.它是对的! (45认同)
  • "它承诺了很多,但却背叛了你,就像一个美丽而诱人,但在情感上冷酷和操纵的情人." 哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈 (8认同)
  • 重新指出第2点:它几乎总是使用元素,属性几乎从不,因此XML比Ant更难阅读! (8认同)
  • 最后一颗子弹的+1.没有什么能让我的日子像是一个如此真实的令人敬畏和热闹的类比. (4认同)

Dom*_*ell 96

我过去肯定会对maven抱怨和呻吟.但现在,我不会没有它.我觉得这些好处远远超过任何问题.主要:

  • 标准化项目结构.
    • 鉴于新开发人员加入了一个项目:
      • 当你说它是一个Maven项目时,开发人员就知道项目布局以及如何构建和打包项目
      • 当你说它是一个Ant项目时,开发人员将不得不等待你解释更多或者必须通过build.xml来解决问题.
    • 当然,总是可以用Ant来强加公司范围的标准,但我想往往会重新发明众所周知的轮子.
  • 依赖管理.
    • 不仅有外部库,还有内部库/模块.请务必使用Maven存储库代理服务器,例如NexusArtifactory.
    • 可以用常春藤做一些这样的事情.事实上,如果您只需要一个依赖管理,那么使用Ivy可能会更好.
  • 特别是在一个项目中.我发现打破小子项目非常有用,maven处理得很好.蚂蚁要困难得多.
  • 标准化的工件管理(特别是与nexusartifactory一起使用)
  • 发布插件很精彩.
  • Eclipse和NetBeans集成非常好.
  • 哈德森的整合非常棒.特别是像findbugs这样的趋势图.
  • 这是一个小点,但行家像嵌入版本号的详细信息,其实里面的罐子或战争(不只是在文件名)在默认情况下是极其有益的.

我的缺点主要是:

  • 命令行非常无益.这让我开始了很多.
  • XML格式非常冗长.我可以看出为什么这样做,但阅读仍然是一种痛苦.
    • 也就是说,它有一个XSD,可以在IDE中轻松编辑.
  • 一开始你很难理解它.例如生命周期之类的东西.

我真的相信花一点时间去认识maven是值得的.

  • 我并不特别介意XML格式(Eclipse可以处理大多数繁琐的部分),并且构建大型项目的指令通常都是令人讨厌和复杂的.例如,在你试图让GNU automake做一些它不关心的事情之前,你还没有真正把头撞到砖墙上. (2认同)
  • IntelliJ还具有出色的Maven支持. (2认同)

Kar*_*rlP 80

我从两个大型项目获得的实际经验是,我们在每个项目上花费了1000-1500小时来处理与maven相关的问题,不包括从maven 1到maven 2的500小时努力.

从那以后,我必须说我绝对讨厌maven.在思考它时我感到很沮丧.

Eclipse集成非常糟糕.(例如,我们在代码生成方面遇到了无穷无尽的麻烦,其中eclipse与生成的代码同步,并且经常需要完全重建.责备是maven和eclipse,但是eclipse比maven更有用并且说emacs,所以日食停留和maven必须去.)

我们有很多依赖项,正如我们发现的那样,语法错误实际上经常被提交给公共maven存储库,这可能会浪费你宝贵的时间.每周.解决方法是拥有一个代理或本地管理的存储库,并且花了很长时间才能做到正确.

Mavens项目结构不适合用Eclipse开发,并且eclipse中的构建时间也会增加.

代码生成和同步问题的影响,我们不得不经常从scrach重建,将你的代码/编译/测试周期减少到无休止的编译/ websurf/sleep/die/code-cycle,直接发送回到90年代40分钟的编译时间.

maven的唯一借口是依赖解析,但我想偶尔做一次,而不是每次构建.

总而言之,maven离KISS尽可能远.而且,当他们的年龄是一个主要的数字时,倡导者往往是那些在他们的生日庆祝额外的人.随意投票给我:-)

  • 那么,你有没有找到Maven的替代品呢? (5认同)
  • Eclipse集成仍然很糟糕.尽管有最新的插件,但插件控制的maven任务会因为模糊的错误消息而失败.然后同事告诉我放入命令shell并运行相同的命令......然后它神秘地起作用.Eclipse是一个成熟的环境,maven插件远远落后. (4认同)
  • 我同意你实际说的一些内容,尽管我认为我最终做对了.为了获得你想要的东西,你可以看一下Ivy,但还没有尝试过,但它似乎将依赖管理带入了更加结构化的Ant环境. (3认同)
  • 嘿! 我哀叹这样一个事实,即下一次我将成为一个黄金时代是29岁,下一个完美的立方体年龄是64岁,我最后一个完美的penteract年龄将是32岁......但我并没有积极倡导maven. (3认同)
  • Maven和Eclipse如何定义项目是一个根本区别.在Maven中,项目或多或少是组织源代码的便捷方式.最初设计Eclipse时,您可以同时处理一个或多个不相关的项目.后来(并非总是合理的)要求导致IBM滥用项目作为"模块",eclipse实际上处理得相当糟糕.为了汇总定义,在很多情况下,maven项目可能应该映射到eclipse源文件夹.但是,由于maven很糟糕,为什么还要烦. (2认同)
  • 好吧,道格.我们可以切换回emacs,或者vi,或者其他什么,但是这样做是因为克隆上的make clone没有任何意义,是吗? (2认同)

Cug*_*uga 46

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

文档有点粗糙,只是因为在开始有意义之前感觉有很多文本和新事物需要理解.我说Maven需要的时间才能得到更广泛的赞扬.

  • 它不是困扰我的学习曲线.这真的不难理解.我的问题是,对于大型(商业)项目,您获得的价值远低于花费的精力.好的,您的项目构建.很酷,但是花了一年人的成本,由于外部因素导致的不断构建失败,10分钟编译而不是5秒和一个丑陋的日食工作区,这是不值得的.此外,以相同的成本,您可以或多或少地雇用一个经常手动构建中继的人. (10认同)
  • @Karlp - 好吧,你还没有完全理解它...... 1.)"由于外部因素引起的失败" - 你应该创建一个项目存储库,你可以保留所有的依赖项,并控制它的版本.2.)"10分钟编译而不是5秒" - 也许对于最初的maven安装和第一次构建 - maven下载它需要的所有依赖项加上你的项目 - 但你正在做的常规构建试图构建你自己的代码不应该正在下载 - 请参阅1 - 也是,离线模式.3.)"丑陋的eclipse工作区" - maven适用于所有主要的IDE(NB,IntelliJ)和命令行. (8认同)
  • 这可能有点真实,但我发现使用Maven与Eclipse的集成确实有助于减少人们的学习曲线.http://m2eclipse.codehaus.org/ (6认同)
  • @Taylor,我在插件方面遇到了很多问题,特别是如果你使用其他版本的Eclipse或天堂禁止RAD.我认为它已经到了那里,但是...... (2认同)

Apo*_*isp 24

因为Maven是一种减少成年男子啜泣绝对恐怖的装置.

  • 没有!Maven不能用于盈利.它只能用于邪恶. (7认同)
  • 我们应该批量生产并将其出售给所有恶棍以获取巨额利润! (3认同)

sal*_*sal 18

我认为对于拥有最简单和最复杂项目的人来说,它的声誉很差.

如果您从单个代码库构建单个WAR,则会强制您移动项目结构并手动将三个jar中的两个放入POM文件中.

如果您正在从一组9个EAR文件原型中构建一个EAR,其中包含五个WAR文件,三个EJB和17个其他工具,依赖关系jar和配置,需要在最终构建期间调整现有资源中的MANIFEST.MF和XML文件; 那么Maven可能太受限制了.这样的项目变得混乱了复杂的嵌套配置文件,属性文件以及滥用Maven构建目标和分类器指定.

因此,如果你处于复杂性曲线的最低点10%,那就太过分了.在曲线的前10%,你穿着紧身衣.

Maven的增长是因为它适用于中间80%


Sas*_*a O 18

优点:

  • 依赖管理.几年来,我和我的同事并没有手动下载和管理依赖项.这节省了大量时间.
  • IDE独立性.事实证明,所有主要的IDE,Eclipse,IDEA和NetBeans如何得到Maven项目的良好支持,因此我们的开发人员不会被锁定在一个特定的IDE中.
  • 命令行.使用Maven,支持同步IDE和命令行配置非常简单,有利于持续集成.

缺点:

竞争:

  • Ant:没有依赖关系管理.期.
  • 常春藤:还不如Maven成熟(不是后者也没有它的怪癖).几乎相同的功能集,所以没有令人信服的理由移动.我尝试了几次尝试; 一切都不成功.

一句话:我们所有的项目都已经用Maven完成了好几年了.

  • Ant不与Maven竞争.Ivy不与Maven竞争(它与Maven Ant竞争任务).Maven不仅仅是一个构建工具+依赖管理.期. (3认同)

Ste*_* B. 16

我的经历使这里的许多帖子感到沮丧.Maven的问题在于它在寻求最终的自动化优势时包装和隐藏了构建管理的细节.如果它破裂,这会让你几乎无助.

我的经验是,maven的任何问题很快就会变成一个多小时的狙击狩猎,通过嵌套的xml文件网络,体验类似于根管.

我也曾经在严重依赖Maven的商店里工作过,喜欢它的人(喜欢"按下按钮,完成所有工作")的人都不理解.maven构建有一百万个自动目标,如果我觉得花时间阅读他们所做的事情,我肯定会有用.更好的2个目标,你完全理解的工作.

警告:2年前最后与Maven合作,现在可能会更好.


Gui*_*ume 14

像格伦一样,我不认为Maven有不好的代表,但是混合代表.我已经工作了6个月,专门尝试将一个相当大的项目项目迁移到Maven,它清楚地显示了该工具的局限性.

根据我的经验,Maven适合:

  • 外部依赖管理
  • 集中管理构建(pom继承)
  • 很多插件都有很多东西
  • 与持续集成工具的良好集成
  • 非常好的报告功能(FindBugs,PMD,Checkstyle,Javadoc,......)

它有一些问题:

  • 全有或全无的方法(很难慢慢迁移到Maven)
  • complexe依赖,intermodules依赖
  • 循环依赖(我知道,糟糕的设计,但我们无法修复5年的开发......)
  • 一致性(版本范围无处不在)
  • 错误(再次与版本范围)
  • 可重现的构建(除非您修复所有插件的版本号,否则您无法确定将在6个月内获得相同的构建)
  • 缺乏文档(该文档对于基础知识非常有用,但是没有很多关于如何处理大型项目的示例)

为了给出一些背景信息,大约有30名开发人员在这个项目上工作,该项目已经存在了5年多,所以:许多遗留问题,许多流程已经到位,许多自定义专有工具已经到位.我们决定尝试迁移到Maven,因为维护我们专有工具的成本太高了.


Jhe*_*ico 12

我想反驳一下在这个论坛上提出的一些投诉:

Maven是全有或全无.或者至少从文档中我可以看出来.您不能轻易使用maven作为ant的替代品,并逐渐采用更高级的功能.

事实并非如此.Maven的最大胜利是使用它来以合理的方式管理你的依赖关系,如果你想在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>
Run Code Online (Sandbox Code Playgroud)

您现在有一个名为"maven.classpath"的类路径对象,其中包含pom文件中定义的所有maven依赖项.您只需要将maven ant任务jar放在ant的lib目录中.

Maven使您的构建过程依赖于您的网络连接.

默认依赖项和插件获取过程取决于网络连接,是的,但仅适用于初始构建(或者如果您更改正在使用的依赖项或插件).之后,所有罐子都在本地缓存.如果你想强制没有网络连接,你可以告诉maven使用离线模式.

它从一开始就强加于你的结构.

目前尚不清楚这是指文件格式还是"约定与配置"问题.对于后者,有许多不可见的默认值,如java源文件和资源的预期位置,或源的兼容性.但这并不是刚性,它为您提供合理的默认值,因此您无需明确定义它们.所有设置都可以很容易地被覆盖(虽然对于初学者来说,在文档中很难找到如何更改某些内容).

如果您正在谈论文件格式,那么在下一部分的响应中已经涵盖了......

它是基于XML的,所以它和ANT一样难以阅读.

首先,我不知道你怎么能抱怨某些方面的某些方面"不比蚂蚁好",因为它有一个不好的代表的理由.其次,虽然它仍然XML中,XML的格式很多更明确.此外,因为它如此定义,所以更容易为POM制作合理的胖客户端编辑器.我已经看过很长的蚂蚁构建脚本,这些脚本遍布整个地方.任何ant构建脚本编辑器都不会让它变得更加可口,只是以稍微不同的方式呈现的另一长串互连任务.

话虽如此,我在这里看到的一些投诉已经或者有一些真空,最大的存在

  • 文档很差/缺失
  • 可重复的构建
  • Eclipse集成很糟糕
  • 错误

我的回答是双重的.首先,Maven是一个比Ant或Make更年轻的工具,所以你不得不期望它需要时间才能达到这些应用程序的成熟度.第二,如果你不喜欢它,那么解决它.它是一个开源项目并使用它,然后抱怨任何人可以帮助解决的事情对我来说似乎相当讽刺.不喜欢文档?有助于它使初学者更清晰,更完整或更容易获得.

可重现的构建问题分为两个问题,版本范围和自动maven插件更新.对于插件更新,除非您确定一年后重建项目时使用的是完全相同的JDK和完全相同的Ant版本,否则这就是使用不同名称的同一问题.对于版本范围,我建议使用一个插件,该插件将为所有直接和传递依赖项生成具有锁定版本的临时pom,并使其成为maven发布生命周期的一部分.这样你的发布版本poms总是对所有依赖项的精确描述.


小智 11

它应该得到它的声誉.并非所有人都需要Maven开发人员认为适合每个项目的严格结构.它太不灵活了.对于许多人来说,依赖管理的"专业"是恕我直言,它是最大的"骗局".我绝对不喜欢maven从网络下载jar并因不兼容而失眠(是的,离线模式存在,但那为什么我应该拥有所有那些数百个xml文件和校验和).我决定使用哪些库,许多项目都严重关注依赖于网络连接的构建.

更糟糕的是,当事情不起作用时,你绝对会迷失方向.文档糟透了,社区无能为力.

  • 我同意这一点.我认为依赖管理的价值被夸大了.当一切正常时,它确实很整洁,但它引入了几个潜在的失败点(更不用说潜在的安全漏洞).您可以设置自己的存储库服务器以稍微缓解问题,并锁定版本号以避免意外更新,但我仍然更喜欢将依赖项添加到版本控制,因为它们不会经常更改它并且它保证了可重复的构建. (4认同)

Zac*_*son 8

一年后,我想更新一下:我不再对Maven社区有这样的看法.如果今天提出这个问题,我不会写这个答案.我将把我目前的意见添加为一个单独的答案.


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

我喜欢Maven,我越喜欢它就越了解它.然而,影响我对它的感受的一件事是:maven社区主要围绕Sonatype("maven公司",它是许多Maven honchos工作的地方),而Sonatype正在积极推动其企业产品在社区上.

一个例子:"Maven Book"twitter流链接到存储库管理的假设介绍.

对不起,但"介绍"是Nexus的半信息,一半销售推销.流行测验:除了Nexus和Nexus Pro之外还有其他任何回购经理吗?此外,这与所谓的开源Maven书有什么关系?哦,是的,关于存储库管理的章节已被分拆成一本单独的书......关于Nexus.呵呵.如果我为Maven书做出贡献,如果我的Nexus销售额增加,我会得到推荐费吗?

想象一下,如果您参与Java开发论坛,很明显Sun讨论Java的员工将抓住每一个可能的机会来讨论NetBeans和"NetBeans Pro".过了一会儿,它失去了一些社区的感觉.我从来没有像Ant这样的经历.

说完所有这些之后,我确实认为Maven是一个非常有趣且有用的系统(我不是把它称为工具,比如Ant,Maven比那更广泛)用于软件开发配置和构建管理.依赖管理有时是一种祝福和诅咒,但它令人耳目一新 - 当然也不是Maven提供的唯一优势.我可能对Sonatype先令的反应有点太强烈了,但在我看来,它会通过联想伤害Maven.我不知道这个意见是否被其他人共享.

  • 扎克,你知道我想知道你是否想了解更多有关Nexus Professional的信息.:-) (2认同)

Pau*_*ier 7

我认为Maven得到了一个糟糕的说唱,因为它在你的项目中强加了结构,而其他工具如Ant允许你以任何你想要的方式完全定义结构.同意文档也不好,但我认为主要是Maven得到的糟糕说唱是因为人们习惯于Ant.

  • 事实并非如此,Maven允许您更改项目结构,它只是建议一个广泛使用的结构. (5认同)
  • 我不认为这是真的.关于Maven的大多数抱怨都是关于它可能失败的方式,速度有多慢或文档.我从来没有真正注意到有人在抱怨结构. (3认同)
  • 我同意最初人们可能会错过他们对Ant的控制权,但是一旦一个项目接受了Maven强加的约定,他们就会真正看到它从中获得的生产力. (2认同)

Ada*_*icz 6

太神奇了.

  • 一旦你必须在2小时内搜索网络,找出为什么某些东西不能按预期工作,这是神奇的.如果你想要一个特定的例子:为什么我的插件没有被执行?你有2个小时. (4认同)
  • 更具体一点 - 没有记录的是什么是如此神奇? (3认同)

Pas*_*ent 6

因为不满意的人做抱怨而满意的人不说他们满意.我的观点是,对maven用户的满意度远远高于未满足的用户,但后者会产生更多噪音.这实际上也是现实生活中常见的模式(ISP,电话运营商,运输等).


Rob*_*anu 5

对我来说,最重要的一个问题是Maven,如果配置不当,可能无法生成可重复的版本,原因如下:

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

与蚂蚁构造形成鲜明对比 - 虽然啰嗦和令人讨厌的IMO - 因为所有的罐子都是在当地检查的.

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

  • 使用你自己的maven存储库,这已经变得简单,我正在使用Archiva,效果很好;
  • 始终正确地版本您的依赖项.Maven已经开始锁定超级POM中的插件版本,从2.0.8或2.0.9开始,所有依赖项都应该在已发布的版本上.


小智 5

好主意 - 执行不力.

我最近将一个项目从Ant搬到了Maven.它的工作以及在最后,但我不得不用两个不同的版本Maven的组装插件和Maven-JAR-插件在同一个POM(有两个配置文件),因为什么一个版本曾在另一个被打破.

所以很头疼.文档并不总是很好但我必须承认谷歌答案相对容易.

确保始终指定您使用的插件版本.不要指望新版本会向后兼容.

我认为争议来自这样一个事实,即maven仍然在发展,而且这个过程有时是痛苦的.

问候


Car*_*icz 5

我对Maven的一些烦恼:

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

  • 在默认配置中,它总是在每次操作中搜索网络.无论这对任何事情是否有用,要求"干净"的互联网访问看起来都非常愚蠢.

  • 再次在默认情况下,如果我不小心指定确切的版本号,它将从'网络中提取最新的更新,无论这些最新版本是否引入依赖性错误.换句话说,你受到其他人依赖管理的摆布.

  • 所有这些网络访问的解决方案是通过添加-o选项将其关闭.但是如果你真的想要进行依赖关系更新,你必须记得把它关掉!

  • 另一个解决方案是为依赖项安装自己的"源代码管理"服务器.惊喜:大多数项目已经拥有源代码控制,只有在没有其他设置的情况下才有效!

  • Maven构建速度非常慢.摆弄网络更新减轻了这一点,但Maven构建仍然很慢.而且可怕的是冗长的.

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

  • Maven仍然是马车.错误消息无益.太多开发人员正在遭受这种情况的困扰.

  • 除非我使用SNAPSHOT依赖项或添加了需要某些功能的新功能,否则我从未让Maven从依赖项中获取最新信息.如果我要求1.2.3版本,并且我的本地存储库中有1.2.3,那么我再也不会得到1.2.3. (2认同)

mdm*_*dma 5

我喜欢maven.我从1.0之前就开始使用它了.它是一个功能强大的工具,总的来说节省了大量的时间,并改善了我的开发基础架构.但我能理解一些人的挫折感.我看到3种挫折感:

  1. 原因是真正关注的问题(例如,详细的POM,缺乏文件),
  2. 一些是错误的信息(例如"你必须建立一个互联网连接" - 不是真的 - 不要,这可以避免),
  3. 其中一些是在maven发泄但真正有人是有罪的("不要射击使者").

对于第一种情况,真正的问题 - 当然,有问题,POM很冗长,文档可能更好.尽管如此,有可能在短时间内与maven取得良好的效果.每次我使用ant构建项目时都会感到畏缩,并尝试将其导入到我的IDE中.设置目录结构可能需要很长时间.使用maven,它只是在IDE中打开POM文件的情况.

对于第二种情况,Maven是复杂的,误解是司空见惯的.如果maven 3可以找到一种方法来解决这种复杂性(甚至是感知到的复杂性),那将是很好的.maven确实需要投入大量资金,但根据我的经验,投资可以快速收回成本.

最后一点,我认为对maven的传递依赖关系的抱怨可能是最着名的例子.

传递依赖性是使用重用的真实软件的本质.Windows DLL,Debian软件包,java软件包,OSGi软件包,甚至C++头文件都包含所有依赖项并遭受依赖性问题.如果你有两个依赖关系,并且每个都使用同一个东西的不同版本,那么你必须尝试以某种方式解决它.Maven不会尝试解决依赖性问题,而是将其置于最前沿,并提供帮助管理问题的工具,例如通过报告冲突并为项目层次结构提供一致的依赖性,并实际上提供绝对控制项目的依赖关系.

The approach of manually including dependencies with each project (one poster says he checks all dependencies into source control) is runing the risk of using the wrong dependency, such as overlooked updates when a library is updated without checking in updates for it's dependencies. For a project of any size, managing dependencies manually is surely going to lead to errors. With maven, you can update the library version you use and the correct dependencies are included. For change management, you can compare the old set of dependencies (for your project as a whole) with the new set, and any changes can be carefully scrutinized, tested etc.

Maven isn't the cause of the dependency problem, but makes it more visible. In tackling dependency issues, maven makes any dependency "tweaks" explicit (a change to your POM overriding the dependency), rather than implicit, as is the case with manually managed jars in version control, where the jars are simply present, with nothing to support weather they are the correct dependency or not.


Zac*_*son 5

我相信Maven有一个糟糕的代表,因为大多数批评者没有观察到Maven + Hudson + Sonar的组合.如果他们有,他们会问"我该如何开始"?