Dan*_*Dan 99 java build-automation build-process maven-2
互联网上有很多关于Maven如何糟糕的话题.我已经使用Maven的一些功能已经有几年了,我认为最重要的好处是依赖管理.
Maven文档不够充分,但通常当我需要完成某些事情时我会弄清楚它然后它可以工作(例如当我实现签署jar时).我不认为Maven是伟大的,但它确实解决了一些问题,没有它将是一个真正的痛苦.
那么,为什么Maven会有如此糟糕的代表,以及Maven在未来会遇到什么问题呢?也许还有更多我不了解的替代方案?(例如,我从未详细看过常春藤.)
注意:这不是导致争论的尝试.这是尝试清除FUD.
Kev*_*son 140
大约六个月前我调查了maven.我们正在开始一个新项目,并没有任何遗产支持.那说:
我不喜欢maven的很大一部分可以通过以下来自Better Builds with Maven的摘录来解释:
当有人想知道Maven是什么时,他们通常会问"Maven究竟是什么?",他们希望得到一个简短的声音答案."好吧,它是一个构建工具或一个脚本框架"Maven是三个以上无聊,没有吸引力的单词.它是思想,标准和软件的结合,并且不可能将Maven的定义提炼为简单的消化声音.革命性的想法通常难以用语言传达.
我的建议是:如果你不能用文字传达这些想法,你就不应该试着写一本关于这个主题的书,因为我不会心灵感应地吸收这些想法.
izb*_*izb 109
Dom*_*ell 96
我过去肯定会对maven抱怨和呻吟.但现在,我不会没有它.我觉得这些好处远远超过任何问题.主要:
我的缺点主要是:
我真的相信花一点时间去认识maven是值得的.
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尽可能远.而且,当他们的年龄是一个主要的数字时,倡导者往往是那些在他们的生日庆祝额外的人.随意投票给我:-)
Cug*_*uga 46
Maven很棒.在我看来,其声誉的原因与陡峭的学习曲线有关.(我终于接近了)
文档有点粗糙,只是因为在开始有意义之前感觉有很多文本和新事物需要理解.我说Maven需要的时间才能得到更广泛的赞扬.
Apo*_*isp 24
因为Maven是一种减少成年男子啜泣绝对恐怖的装置.
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
优点:
缺点:
竞争:
一句话:我们所有的项目都已经用Maven完成了好几年了.
Ste*_* B. 16
我的经历使这里的许多帖子感到沮丧.Maven的问题在于它在寻求最终的自动化优势时包装和隐藏了构建管理的细节.如果它破裂,这会让你几乎无助.
我的经验是,maven的任何问题很快就会变成一个多小时的狙击狩猎,通过嵌套的xml文件网络,体验类似于根管.
我也曾经在严重依赖Maven的商店里工作过,喜欢它的人(喜欢"按下按钮,完成所有工作")的人都不理解.maven构建有一百万个自动目标,如果我觉得花时间阅读他们所做的事情,我肯定会有用.更好的2个目标,你完全理解的工作.
警告:2年前最后与Maven合作,现在可能会更好.
Gui*_*ume 14
像格伦一样,我不认为Maven有不好的代表,但是混合代表.我已经工作了6个月,专门尝试将一个相当大的项目项目迁移到Maven,它清楚地显示了该工具的局限性.
根据我的经验,Maven适合:
它有一些问题:
为了给出一些背景信息,大约有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构建脚本编辑器都不会让它变得更加可口,只是以稍微不同的方式呈现的另一长串互连任务.
话虽如此,我在这里看到的一些投诉已经或者有一些真空,最大的存在
我的回答是双重的.首先,Maven是一个比Ant或Make更年轻的工具,所以你不得不期望它需要时间才能达到这些应用程序的成熟度.第二,如果你不喜欢它,那么解决它.它是一个开源项目并使用它,然后抱怨任何人可以帮助解决的事情对我来说似乎相当讽刺.不喜欢文档?有助于它使初学者更清晰,更完整或更容易获得.
可重现的构建问题分为两个问题,版本范围和自动maven插件更新.对于插件更新,除非您确定一年后重建项目时使用的是完全相同的JDK和完全相同的Ant版本,否则这就是使用不同名称的同一问题.对于版本范围,我建议使用一个插件,该插件将为所有直接和传递依赖项生成具有锁定版本的临时pom,并使其成为maven发布生命周期的一部分.这样你的发布版本poms总是对所有依赖项的精确描述.
小智 11
它应该得到它的声誉.并非所有人都需要Maven开发人员认为适合每个项目的严格结构.它太不灵活了.对于许多人来说,依赖管理的"专业"是恕我直言,它是最大的"骗局".我绝对不喜欢maven从网络下载jar并因不兼容而失眠(是的,离线模式存在,但那为什么我应该拥有所有那些数百个xml文件和校验和).我决定使用哪些库,许多项目都严重关注依赖于网络连接的构建.
更糟糕的是,当事情不起作用时,你绝对会迷失方向.文档糟透了,社区无能为力.
一年后,我想更新一下:我不再对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.我不知道这个意见是否被其他人共享.
我认为Maven得到了一个糟糕的说唱,因为它在你的项目中强加了结构,而其他工具如Ant允许你以任何你想要的方式完全定义结构.同意文档也不好,但我认为主要是Maven得到的糟糕说唱是因为人们习惯于Ant.
太神奇了.
因为不满意的人做抱怨而满意的人不说他们满意.我的观点是,对maven用户的满意度远远高于未满足的用户,但后者会产生更多噪音.这实际上也是现实生活中常见的模式(ISP,电话运营商,运输等).
小智 5
好主意 - 执行不力.
我最近将一个项目从Ant搬到了Maven.它的工作以及在最后,但我不得不用两个不同的版本Maven的组装插件和Maven-JAR-插件在同一个POM(有两个配置文件),因为什么一个版本曾在另一个被打破.
所以很头疼.文档并不总是很好但我必须承认谷歌答案相对容易.
确保始终指定您使用的插件版本.不要指望新版本会向后兼容.
我认为争议来自这样一个事实,即maven仍然在发展,而且这个过程有时是痛苦的.
问候
诉
我对Maven的一些烦恼:
XML定义非常笨拙和冗长.他们从来没有听说过属性吗?
在默认配置中,它总是在每次操作中搜索网络.无论这对任何事情是否有用,要求"干净"的互联网访问看起来都非常愚蠢.
再次在默认情况下,如果我不小心指定确切的版本号,它将从'网络中提取最新的更新,无论这些最新版本是否引入依赖性错误.换句话说,你受到其他人依赖管理的摆布.
所有这些网络访问的解决方案是通过添加-o
选项将其关闭.但是如果你真的想要进行依赖关系更新,你必须记得把它关掉!
另一个解决方案是为依赖项安装自己的"源代码管理"服务器.惊喜:大多数项目已经拥有源代码控制,只有在没有其他设置的情况下才有效!
Maven构建速度非常慢.摆弄网络更新减轻了这一点,但Maven构建仍然很慢.而且可怕的是冗长的.
Maven插件(M2Eclipse)与Eclipse集成最差.Eclipse与版本控制软件和Ant相当顺利地集成.相比之下,Maven集成非常笨重和丑陋.我提到慢吗?
Maven仍然是马车.错误消息无益.太多开发人员正在遭受这种情况的困扰.
我喜欢maven.我从1.0之前就开始使用它了.它是一个功能强大的工具,总的来说节省了大量的时间,并改善了我的开发基础架构.但我能理解一些人的挫折感.我看到3种挫折感:
对于第一种情况,真正的问题 - 当然,有问题,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.