为什么很less有人使用Maven? 有其他的工具吗?

我是Java的新手,当我开始开发时,我的朋友推荐Maven进行项目pipe理。 我几乎立即意识到这是一个不可或缺的工具,那时我正在想所有的程序员都用它。 但是当我在NetBeans网站上看到统计信息时,我感到很震惊:67%的开发人员没有使用Maven。 为什么? 是否有一些替代工具使项目pipe理变得简单?

UPDATE

我同意feicipet在100%。

  1. IDE独立的,这是非常好的。 这是根据我自己的经validation明的。 首先,我们的团队使用了Eclipse,然后我们决定切换到使用IDEA帮助我们的NetBeans。 这并不重要,因为即使使用控制台,项目也可以运行:)

  2. 结构良好,清洁的项目。 我认为Maven结构约定是非常有帮助的,因为testing和主代码是分开的。

  3. 项目pipe理。 Maven不仅是构build工具 ,它还使您能够configuration环境,运行unit testing以及创build报告。

对于我来说,当有经验的编程谈论Maven的困难的时候,当我看到Ant在Maven的一个项目中向我展示了一个奇迹时,感到惊讶。 所有关于从Ant过渡的复杂性的评论都很奇怪。 这是两种不同的逻辑,你期望什么?

文档有一些问题,这真的很糟糕。 但我认为这种情况会好转

有很多的select – 在Java和ruby社区。 有关此图片的概述

在这里输入图像说明

IMO Maven是一个过度devise的Rube Goldberg机器 ,或者用Graeme Rocher( Grails项目负责人)的话来说就是“构build工具的EJB2” 。

我认为Maven项目的目标非常值得。 公约的configuration? 大! 自动依赖解决? 超! 但不幸的是,这种做法与理论有很大的不同。 根据我的经验,将Maven引入到以前使用Ant构build的项目中总会产生比解决问题更多的问题。 在一个案例中,Maven开始占用我们很多的时间,最终我们又回到了Ant。

我认为,如果你正在构build大量互相依赖的项目,Maven可能是值得的,开发也是广泛分布的。 但是,如果你正在构build一个单一的应用程序,并且只想做一些简单的事情,比如“从这些目录中的东西构build一个WAR”,那么我将会从Maven运行一英里。

我对Maven的一个问题是,如果你需要做一些与Maven的约定相反的事情,那么它实际上是非常不灵活的。 尽pipe你可以在一些微不足道的情况下重写这些约定(例如,将源文件夹的名称从src改为source ),但是其中一些约定似乎被设置为一成不变,例如每个项目有一个工件。 以一个Maven Web项目为例,其工件是一个.war文件。 现在想象一下,我们希望在.war文件名中包含当前的SVN修订版本号。 这似乎并不是特别难以实现的,但除非你能find一个已经这样做的插件,否则你可能不得不编写你自己的插件来实现它,这不是一件小事,因为它需要您了解Maven的生命周期和目标模型。

回答关于备选scheme的第二部分问题:我没有亲自使用它,但是听说过关于Gradle的很好的东西。 以前使用Maven构build的Spring和Hibernate等许多高调的JVM项目最近都转向了Gradle。

我喜欢Maven,几乎全部用在我的公司。 但是我可以certificate我这样做的理由:

  1. 我经营一个开发团队,我们需要结构。 我需要我的大部分开发人员遵循一定的约定到项目布局。 这是为了在磨损发生时更容易切换。
  2. Maven原型在这方面是一个主要的祝福。 老年人只会为某些项目模板创build特定的原型,而所有的开发人员只是将他们的项目放在他们的项目上。 对于那些我们无法满足的情况,有一个非常简单的通用方法。 从SVN检出基于ant的布局在这方面不太直观,因为开发人员在检出之后仍然需要删除原始的.svn元数据。
  3. Maven帮助我们保持IDE不可知论。 我不希望将我的招聘政策放在开发人员喜欢使用的IDE的基础上。 至less有两个主要的IDE(Eclipse和NetBeans)已经很好地集成到了Maven中,这样一个pom.xml文件已经是IDE项目定义了。 我可以告诉任何新开发者,只要构build系统本身基于Maven,他就可以使用他喜欢的任何IDE。
  4. 我发现,当我切换到Maven时,中途拾取事物的开发引导过程大幅度减less。 新开发人员,即使是那些不熟悉手头项目的开发人员,也能够在半小时内对项目进行汇编,打包和部署。 支持人员(通常不擅长技术)能够集中精力解决问题,而不用担心项目的build设,这是一个不必要的烦恼。

总而言之,Maven非常适合我的需求。 我在某种程度上同意一个拥有自己的工作stream程和项目pipe理实践的独立开发人员可能从中获益不大,但是我们这里的任何一个人都无法自行工作。

我遇到的很多Maven抱怨都在这个博客条目中列出和回答。 我的经验是,Java开发人员习惯于完全控制他们的项目。 他们反对Maven的许多原因基本上是“它不是ant”,或者我不能像ant那样做X。

当然有一些有效的抱怨。 文档通常是可悲的,学习曲线可能陡峭,configuration冗长。 因为涉及到这么多的约定,所以当出现错误时,可能很难确定它是你的错还是插件中的一个特性/错误。

所以,考虑到消极因素,可以理解的是,当你可以随你所知(ant / make / whatever),继续“做这份工作”的时候,人们会不愿意投入时间和精力build造一个工具,客户不关心你的构build过程是多么的性感。

在将许多项目迁移到maven(从纯java到纯javascript和xslt项目)之后,我认为使用maven的优点是50:50。 最重要的缺点是:

  • 速度非常慢
  • 大大减缓了开发 – 部署 – testing周期
  • 有荒谬的项目结构。 除非你开发纯Java项目,否则结构是没有意义的。
  • 构build过程是声明式指定的。 更清楚的是: <copy from="" to=""/>或注册mvn插件并指定吨属性?
  • mvn作者倾向于build设性的批评

我认为与像Ant这样的工具相比,Maven的进入门槛相对较高。 早期版本的困难和2.0的复杂性一直让我失望。 这不是100%必要的,特别是如果你有一个好的IDE。

对于另一种工具,我提供了Gradle 。 它build立在Ant和Maven之上,支持所有的标准目标(编译,unit testing等)。 关键的好处是,configuration是在Groovy中,这使得stream畅,简洁的文件。 (也就是说,一定要学习Groovy)。

关键在于,像许多人一样,把Ant-Ivy和Maven相提并论,这是一种错误的二分法。 我在这里博客了这个。 (请注意,自博客文章以来,Gradle已经取代了Gant作为一个通用的构build工具。)

Maven绝对可以把你的风格抽筋。 我把一个ant构build过来交给了maven,因为我有很多相互依赖的项目。 我得到了构build,但我仍然不觉得我的头在兽附近。

很多问题归结为文档。 规范指南往往是一个完全不同的问题,你刚刚发生的论坛post或stackoverflow答案。

就像这个使用货物的指南: 在maven集成testing期间开始外部过程 ,我没有从maven-cargo插件网站上find,但是因为我恰巧是在通过计算器翻阅。

但是当你看到那个魔咒,然后是货物页面,这对于一般的(读我)开发者来说真的很容易理解吗?

也许毛主席就像资本主义,除了一切之外,毛主席是最糟糕的。

我很震惊:67%的开发者没有使用Maven。 为什么?

当你学习一些新东西时,一切看起来都很有光泽,而正确的介绍,Maven(或者任何工具)看起来都很棒。 当你有一些已经存在的,可能不完美的东西,也就是现有的非Maven项目时,试图在它上面贴上Maven就是一个PITA。

是否有一些替代工具使项目pipe理变得简单?

谷歌这样说。 Ant,Gradle,Gant,Ivy,Rake,SBT。 我个人更喜欢Gradle和Gant。 SBT可以是猪,但是一旦你运行起来,它是甜的。 我会用Maven的Ant来处理任何新的或现有的项目。

不要误解我的意思,我已经使用了Maven,而且我可以精通它。 问题在于,它的插件体系结构实际上是一个问题。 尝试做一些开箱即用的事情,这变得非常麻烦。

对于我来说,当有经验的编程谈论Maven的困难的时候,当我看到Ant在某个项目Maven给我看了一个奇迹

也许那些有经验的程序员正在进行一些事 国际海事组织,了解Maven,你首先必须了解ant,以及Maven试图或试图解决的问题。

ant

Ant被认为是不好的代表,因为大多数人都是蹩脚的程序员,他们在创buildAnt构build系统的时候采取了蹩脚的做法。

不好的程序员做以下事情:

他们要么过度简化事物,要么创build不能应付项目变更的构build系统(任何现实生活中的复杂系统体验变化)

或者因为黑森林而使事情过度复杂化,黑暗的antbuild造队伍遍布整个地方,没有任何连贯的想法。 通常情况下,这是错误的去耦合的结果,这实际上导致了我所说的分布式超级耦合 :一切都依赖于其他任何工作,而没有任何保证。

ant几乎跟在一个名为GIGO的模型:垃圾进,垃圾出。 创buildAnt脚本时,需要具有重要的预见性。

这对于一个好的开发者来说不是问题。 可悲的是,对于那些糟糕的开发人员来说,他们造成了这些怪胎,并且责怪这个工具。 这就像把你的屁股放在烧烤架上,并指责它烧你。

Maven的

inputMaven。 它试图通过提供项目骨架和搭build脚手架来解决超级复杂的怪物。 Maven称之为原型。 你调用Maven来创build一个使用maven-archetype-webapp原型的新项目,然后为它构build一个完整的项目脚本,包括目录结构,部署描述符和什么。

但是,如果现有的系统不一定符合原型,会发生什么? 如果你想要或需要不同的布局会发生什么?

有解决scheme(.ie创build自己的原型),但事情不再那么简单。 然后是整个版本库。 很多时候,你可以简单地使用默认的仓库,并通过电线拉出你需要的东西。

在其他时候,你根本无法进入后勤领域。 你把你的仓库放在哪里? 你是否有一个为整个业务,或不同的项目有自己的(由于法律或地理要求)? 你是否版本库的内容或版本库?

如果是这样的话,当你在法律上/合同上被要求使用像ClearCase这样的源代码控制库的时候会发生什么情况,你必须在更改之前明确地检查一下事情吗? 肮脏的后勤事物,甚至不应该出现在图片和开发人员的脑海里。

有一些实际的(也是愚蠢的)理由,比Ant更喜欢Ant,反之亦然。 它恰好发生在分裂发生在赞成Maven和赞成Ant的2/3左右。 这个分割与我从零开始看到的新项目和现有项目的比率非常相似。

一个重要的原因是要避免(或至less有客观的第二个想法)Maven是关于它的文档。 它有所改善,但它曾经吸吮。 这导致后勤问题。 如果我是一名招聘经理,我需要考虑一些工具来获得更广泛的知识。

它恰好发生了比Maven开发者(好与坏)更多的Ant意识开发者(好与坏)。这是我将认真考虑的事情。

再次,我曾在Maven项目中工作过,并且我没有任何问题将它用于常规和自定义的原型。 我只是不想。 也许我的眼镜因ant使用时间长(实际上是两年)而着色。

这样说的话,我会用Gradle来创build一个新的系统(或者如果我拥有权限,那么我们可以重写一个Ant或者Maven构build系统,而且我周围的开发人员至less是半职的)。

与Ant和Maven相比,它只是一个优秀的构build系统。

如前所述,进入壁垒很高。 还有很多已经build立完善的构build脚本/工具的旧项目 – 在大多数情况下,replace已经与maven一起工作的东西是没有意义的。

缺乏/分散的文档也无济于事 – 唯一真正优秀的maven教程是一个由sonatype编写的完整的书…这是很多问人读,然后去学习如何插件工作的唯一目的是build立/pipe理一个pom.xml来定义一个项目如何build立/pipe理。

尽pipe如此,maven是一个很好的工具(即使它本身太复杂了)。

我在不同地区的多个团队从事大型开发项目。 现在我已经跑了几次,几天之后我总是感到沮丧,每次尝试时,我都会把手放在空中放弃。 我可以使用Antmacros来检查我的源代码库中的依赖项。

当然,我宁愿使用maven,但太难以脱身。

该计算器在幻灯片规则上是一个巨大的进步,因为它更容易使用(除了能够解决更多的问题之外)。 虽然maven可能会解决一些问题,但也会自行产生问题(主要是使简单任务更加困难 – 特别是更难以debugging和排除故障)。

对于普通开发人员来说,学习曲线太陡。 除非你在项目上有一个火箭科学家(和传道者),否则就忘记了。 您的普通开发人员无法投入时间来自己学习maven。 团队中的某个人需要成为专家,其余人员才能真正开发软件。

我只有一件事要说:太多的抱怨…也许不是一个完美的工具,但肯定有很多抱怨…确实,这增加了一些复杂性,你可以打一些路障(我们没有find任何无法解决的问题),但最终你会看到好处。

几个星期前,我读了一些关于花费500多个小时(这是他声称的)试图使用Maven的人…您可以在500个小时内编写一些Maven插件并构build您的应用程序。

顺便说一下,这是开源的,如果你发现问题,请报告或修复它

  • 如果确实是一个问题,我相信它会被修复。
  • 如果这是一个很好的build议,我相信它会被考虑在内。

PS。 我不是Maven团队的成员,只是一个普通用户,没有其他的东西。

我同意,我不明白为什么使用Maven的人会select其他工具。

我认为差距归结为命令性与宣告性。 程序员开始学习命令式编程,那就是Ant,即使需要更长的脚本文件,仍然有一个舒适的区域停留在命令式语言中,你总觉得你总是可以改变它。 Maven是声明式的,你必须相信事情被正确地声明,当他们不按照你期望的方式工作时,你会做什么? 这加上logging不完整的插件没有帮助。 这就是为什么这些其他具有maven特性,但使用命令式风格的工具非常受欢迎。

我会使用Wicket / Tapestry相同的JSP参数,为什么有人在声明组件时使用JSP脚本样式? 它回到舒适区。 我认为声明式将会变得更加stream行,Maven是推动信封的技术之一,但是随着我们获得大规模的可扩展计算机,声明性语言和技术将变得更加舒适和标准。

Maven是一个伟大的工具,它提出的概念和worlflow是一个巨大的飞跃,从不那么远,当我们只是把磁带代码捆绑在一起来创build软件(我现在只是潜水在一个超过1M LOC的传统Deplhi应用程序。嘿,痛苦…我想念Maven多less)

这就是说..恕我直言maven仍处于起步阶段,虽然比以前更好,但文件仍然很less,很难得到。 插件控件仍然有一些扭曲,因为它可能很难完全控制你的构build环境。 而且系统的行为仍然从一个版本变化到另一个版本,所以很难保证稳定的构build。

所以我可以看到为什么人们会退出来自Ant的Maven。 对于一个Ant用户来说,Maven有很多魔法属性和行为,会产生令人不舒服的不确定光环,这与我们开始将应用程序部署到客户端并希望稳定版本化时所产生的典型构build主要偏执狂并不一致。

尽pipe这一切都走在了正确的轨道上,而且它所看到的渗透缓慢实际上是一件“好事”,因为它将使系统的发展保持在可控的范围之内,从而及时解决问题。

将Ant作为构build系统学习可能是更好的第一步,因为它可以帮助您了解构build中的要求和困难。 另外如果Maven没有按照你想要的方式行事,你总是可以回到Ant,然后整合到Maven的大图中。

Maven试图实现的目标是值得赞扬的,道路是非常复杂的。 但是如果你让你的思想推断出信息时代的世界会是什么样的,那么你很快就会意识到,手动处理依赖关系只是Maven的一个方面,很快我就不可能了。

如果Maven由于缺乏采用而失败了,只留下了惯例而不是configuration的想法,它已经实现了一个伟大的事情…

…但是,这是更多的。

长话短说 :

  • 像工具的Maven是必不可less的,但要密切关注它,它会咬你成熟
  • 在构build机制中保持健康的多样性,如果Maven不能满足某个特定的需求,那么您总是可以回到其他更简单的方法。
  • 订阅新闻组,阅读其他人的经验,写文档需要时间,而且几乎总是过时的,特别是在像Maven那样的工具方面。
  • 幸存您早期的挫折,您的努力将及时奖励你丰富。

我的2分

我曾在2005年左右的一家公司工作过,曾经有过大约80个子项目的Ant构build。 他们认识到团队pipe理testing和发布是多么的重要,所以必须有一个可重复的构build,但是模块的依赖关系对于任何人来说都是复杂和困难的,没有graphics化的工具。

他们所做的是当时相当新颖。 认识到他们可以检查Eclipse元数据和元数据(如XML)很容易parsing,他们编写了一个Ant插件来读取.classpath文件,并以这种方式构build正式构build的依赖关系。

有趣的是,公司里没有人知道其中的任何一个是如何工作的,他们只知道如果有人把他们的Eclipse构build搞乱了,检查它,一切都会中断。 发行版pipe理人员知道这些工件是如何生成和打包的,开发人员知道这个版本是一个可以在Eclipse中调整的黑盒子,但是这两个小组都不了解对方的域名。

有趣的是,他们把MacGyvered Maven放在一起,甚至没有意识到这一点。

这个故事有几个重要的原因。 首先,对于不了解Maven的商店而言,Maven可能会过度杀伤。 如果没有Maven,我认为在几十个模块之上的构build会变得困难。 其次,尽pipeMaven可能看起来像是“文档logging不足”,“接pipe了构build”,但事实上,98%的本地构build的定制程序在这里build立的文档比文档更多。 有了Maven构build,任何知道Maven的人都可以被雇佣来工作,这取决于你通过内部神职人员对综合性工作安全的看法。 最后,虽然许多明星开发人员使用Eclipse,但不会因为您为他们find工作而开始启动。 他们经常会去别的地方

Maven绝对需要投资才能学习,但事实certificate,如果在大规模构build中考虑所有其他内容(如存储库和文档),则不会有更多的投资。 当今时代最重要的是与Maven Central Repository的互操作性,最终需要POM。 使用SBT和Gradle等工具综合POM是可能的,但是如果团队中的某个人需要知道如何debugging他们以发布内容,那么不学习Maven就没有什么意义了。

有一天Maven Central不会那么重要,但是在那之前…

无论如何,对Maven有很多原因。 这事实上在那里build立的,否则其他的构build工具不会像他们那样依赖Maven Central。

使用基于Maven的项目结构,您可以轻松实施SoC(分离关注) 。 如果你做错了,并得到循环依赖,maven不会build立。

与版本,分离关注和依赖pipe理一起使用的Maven是一门学科。

如果你想“破解”它,你可以。 但是,再次,我会build议使用Maven作为一门学科。 你可以驾驶一个训练有素的队伍。 如果你采用多种学科(比如你在Maven中构build一个项目,在Gradle中构build一个项目),那么你的生活会变得越来越难。

转向新的学科需要公司广泛的理解其存在的理由。 除非你是一个小团队,否则坚持一个经过时间考验的纪律。 Maven已经

至于Netbeans的开发者,不要这样做,因为别人这样做。 这就像是相信上帝,因为别人也这么做。

如果大家都在,请尝试Gradle。

那么,首先,考虑到你在NetBeans页面上看到这个调查是不准确的。 如果是由NetBeans(而不是from NetBeans提供的链接)进行的,那么大多数not运行NetBeans的开发者更可能会错过它。 与Ant相比,Maven的使用率要低一些,但是低了多less还不知道。

另一方面,Apache Ant首先出现。 今天它仍然非常有用,因为它提供了强大的function和灵活性。 Maven鼓励对项目结构和构build采用传统的或标准化的方法。 大多数现有的项目都不符合Maven的惯例,因此,许多项目根本不用花费精力将已经精心devise的Ant构build系统迁移到另一个项目中,特别是如果Maven没有提供Ant构build已经可以做到的任何事情。

关于替代方法,除了使用Ant的本地系统外,我唯一知道的就是Apache Ivy

我对Maven的问题是它所做的主要事情之一不是最佳做法。 Maven会出去下载你拥有的任何依赖项的最新版本。 虽然这听起来不错,但这是一个不好的做法。 我想在我的项目中的项目的依赖关系,因为我不希望每个开发人员有不同版本的jar文件,我绝对不希望部署到产品时使用未经testing的依赖项。

If maven had an easy way to allow me to package the dependencies with the project and not download them for me, I'd use it. For now, I only have it installed because some code I deal with forces me to use it.

Yes, I know that it is possible put a dependency repository in my project and make my project use it, but that is a huge pain. I just want a lib folder in my project and tell maven that those are the jars I'm using. period. I'd much rather write an ant build.xml file than spend tons of times writing pom.xml files.

I think maven is like object oriented programming in that it is hard to master after years of structured programming but it has strong benefits over imperative tools like Ant. I love maven even though I must admit it took me around 3 days to learn it to a sub-comfortable level and implement it with existing eclipse wtp projects with dependent projects and lots of external jars, and with eclipse and m2e. Once learned and implemented, it is way easier now and much more cleaner and organized.

I think that Maven has been massively adopted and I have to disagree with the statement that "so few people use Maven". If one googles for MVN Respository, or visit the SpringSource.org site one finds how many useful libraries and projects are built with Maven.

Maven has a pretty stiff learning curve. Its upside down from most build control systems. The majority pif those are descend from Make and are, to one degree or another, change sensitive script engines. You tell it what the build operations are in a scripted fashion.

Maven, on the other hand, works off a standard build model that you match your code to.

Its quite powerful but NOT easy to use. Its best feature is remote repositories, and this is coming back into the other types of build tools now.

Maven makes Project Managers and other (non-developer) human interferences obsolete. So why not? Ok there are some issues and some shortcomings, but for now only ivy gets close enough. Upcoming releases should include a Functional Analysis generation Mojo or even extended integration of continuos build platforms and system set-up Mojo's. Personally I' m really fond of the grails way of handling project dependencies and plugins since a while now. Just love it.

I believe Maven can do almost everything that Ant can do, still if your code is coupled much with Ant then you can still call Ant from within Maven.

I only problem I see is that documentation is not that good, but will improve over time.

希望这可以帮助。 Brief about Maven, Comparison between Ant & Maven

EBuild is a modern alternative to Maven.

We use it for all our development. It's really good. However, I must qualify that by stating that my brother wrote it.

It simply manages / builds all your projects for you. You check out a project, and ebuild handles the rest. It fetches all dependencies and builds them. When you are ready to release, the release script then produces the build for you.

Currently it is geared to being used with Eclipse and only works with SVN (designed with the intention to support other SCMs such as GIT etc).