我正在考虑将Maven用于我管理的Java开源项目.
然而,在过去,Maven并不总是拥有最好的声誉.你现在对Maven有什么印象?
对于一个开源项目,Maven有一些优势,特别是对于你的贡献者(例如mvn eclipse:eclipse).
如果你选择Maven,那么你必须遵循的一条规则就是:不要对抗这个工具.按照Maven建议的方式布置项目,遵循其所有约定和最佳实践.您与Maven进行的每一场小小的斗争都是您不会为您的项目编写代码的一天.
还要事先考虑要部署工件的位置(您是否要托管自己的存储库?).
并且不要害怕使用Maven以外的其他东西(例如Ant).项目本身的成功将是项目本身,而不是它的构建工具(只要你选择Ant和Maven都是最好的构建工具).
就个人而言,我不是粉丝.我同意查尔斯米勒关于它被设计破坏的大部分内容.它确实解决了一些问题,但它也引入了其他问题.
Ant远非完美,但它更强大,更好记录.虽然以模块化方式使用它确实需要一些纪律(这是Maven试图解决的问题之一).我认为发明比Ant和Maven更好的东西并不会那么困难,但这个工具似乎还不存在.
如果你喜欢Maven的依赖管理而不是Maven,你可以使用Ivy在Ant中获得类似的东西.我对这种依赖管理方式的问题在于,由于您无法控制的因素而导致脆弱.确实有意义的一个用例是,您的组织内部有许多相互依赖的项目.在这种情况下,一切都在你的控制之下,它可能会很好地工作.
编辑:我忘了添加即使你不喜欢Maven,你也不能忽视它.如果您编写其他人使用的开源库,他们会希望它们可以在Maven存储库中使用,以便他们可以从Maven构建中轻松使用它们.
编辑2:既然你已经澄清了你的主要兴趣是为其他Maven用户提供一个开源库,那么值得注意的是你不必使用Maven来实现这一点.有一组Ant任务可以发布到Maven存储库.因此,如果您想继续使用Ant来构建项目,您可以这样做,但仍然可以满足您使用Maven的用户.
如果您的项目"简单",那么maven可以让您快速启动并运行.简单来说,我的意思是你有一堆代码,一些资源,一些测试类,所有这些都与一些第三方罐子一起制作一个应用程序.
当你想要以某种方式特定于你自己的项目做一些不寻常的事情时,那么你最终会花费所有的时间来让maven做你想做的事,而没有时间在你的代码上工作.这对我来说无法使用聪明的构建系统.
Maven在帮助您解决问题时也很糟糕.构建脚本是不可读的不直观和不自然的xml screeds,当然可能是你喜欢和正在寻找的(如果你有ant-vision).
我喜欢maven.Maven充满了善良和承诺.我也讨厌maven.
编辑:
噢,日食的maven插件非常精彩.
当Maven从1.x过渡到2.x时,我不幸与Maven合作.它几乎消耗了我们一个更高级团队成员的100%的时间.我们最终取消了它.
然而,最近我有机会重新审视maven,我会说它已经有所改善.我的一个主要问题是缺乏良好的文档,但在阅读"Maven:权威指南"之后,我会说它更容易理解.
与eclipse 的m2eclipse插件一起,管理依赖项变得轻而易举 - 它具有出色的依赖性可视化工具.
总的来说,我会说Maven是一个开始项目的好工具,但是一旦你的构建开始变得复杂,它可能会开始迷失方向.
有关maven的一些非常好的事情:
Archetypes:一种很多人制作的启动(基础)项目(非常有用).在那些倾向于一遍又一遍地重建同类东西的企业中,它非常实用.
依赖管理:你真的必须尝试去爱它.Ivy也是一个很好的兼容工具.
生命周期管理:如果没有整个IDE,您可以使用maven命令行完成所有操作,我的意思是:编译,打包,测试,部署等等.并且可能会依赖于其他步骤.虽然我认为默认值不是最好的,但这部分是可自定义的.
另外,maven还可以做一些蚂蚁.
对我来说,不利的一面是,很难将项目移植到它上面.最好从头开始.此外,maven广泛使用插件来完成它的工作,但并不是所有的东西在这方面都是完美的,并且还没有插件.
使用任何构建工具的主要原因之一是获得可重现的构建.也就是说,您今天所做的构建可以在几年内完全复制.根据我的经验,Maven在创建可重现的构建的测试中失败了.
这些问题源于一个拥有许多活动部件的庞大而复杂的野兽.每个部分都有自己的发布周期,版本经常相互冲突并破坏您的构建.试图调试这样的事情非常复杂.
我使用Maven进行开源工作,因为它可以相对快速地生成合理的网站.这是非开源开发人员很少感兴趣的东西.即使有这项任务,我也经常花费很长时间试图解决为什么事情没有按预期运作.对于开源工作,我通常使用ant实际生成构建(jar),因为它是可靠的.
最后一点.如果您正在编写一个开源项目,则可能必须以某种方式使用Maven.如果您的项目很受欢迎,那么您需要在中央Maven存储库中获取它,如果您不使用Maven,这将更加棘手.