为什么是maven?有什么好处?

tri*_*rix 131 java build-process build maven

与让我们说蚂蚁相比,使用maven的主要好处是什么?它看起来更像是一种烦恼而不是一种有用的工具.我使用maven 2,使用普通的Eclipse Java EE(没有m2eclipse)和tomcat.

maven的支持者相信这一点

  1. Maven可以让您轻松获得包依赖性

  2. Maven强制您拥有标准的目录结构

在我的经验中

  1. 弄清楚包依赖关系并不是那么难.无论如何你很少这样做.可能在项目设置期间一次,在升级期间更多.使用maven,你最终会修复不匹配的依赖关系,写得不好的poms以及无论如何都要进行包排除.

  2. 缓慢的FIX-COMPILE-DEPLOY-DEBUG循环,可以降低生产率.这是我的主要抱怨.你做了一个改变,你必须等待maven build进入并等待它部署.没有任何热门部署.

或者我只是做错了?请指出正确的方向,我全都耳朵.

Pas*_*ent 108

弄清楚包依赖关系并不是那么难.无论如何你很少这样做.可能在项目设置期间一次,在升级期间更多.使用maven,你最终会修复不匹配的依赖关系,写得不好的poms以及无论如何都要进行包排除.

对玩具项目来说并不难.但是我工作的项目中有很多很多,我很高兴能让它们过渡,为它们制定标准化的命名方案.手动管理所有这些将是一场噩梦.

是的,有时您必须致力于依赖性的融合.但想想它两次,这不是Maven固有的,这是任何使用依赖的系统所固有的(我在这里谈论的是Java依赖).

所以使用Ant,你必须做同样的工作,除了你必须手动完成所有事情:抓住项目A及其依赖项的某个版本,获取项目B及其依赖项的某些版本,弄清楚自己使用的确切版本,检查它们没有重叠,检查它们是否不相容等等.欢迎来到地狱.

另一方面,Maven支持依赖管理并将为我传递检索它们并为我提供管理依赖管理固有的复杂性所需的工具:我可以分析依赖树,控制传递依赖中使用的版本,排除一些如果需要,他们控制跨模块的融合等.没有魔力.但至少你有支持.

并且不要忘记依赖管理只是Maven提供的一小部分,还有更多(甚至没有提到与Maven很好地集成的其他工具,例如Sonar).

缓慢的FIX-COMPILE-DEPLOY-DEBUG循环,可以降低生产率.这是我的主要抱怨.你做了一个改变,你必须等待maven build进入并等待它部署.没有任何热门部署.

首先,你为什么这样使用Maven?我不.我使用我的IDE编写测试,代码直到它们通过,重构,部署,热部署并在我完成之前运行本地Maven构建,然后提交,以确保我不会破坏连续构建.

其次,我不确定使用Ant会让事情变得更好.根据我的经验,使用二进制依赖项的模块化Maven构建比典型的单片Ant构建提供了更快的构建时间.无论如何,看看Maven Shell是否已准备好(重新)使用Maven环境(顺便说一句,它很棒).

所以最后,我很遗憾地这么说,并不是真的Maven会扼杀你的生产力,而是你误用了你的工具.如果你对它不满意,那么,我能说什么,不要使用它.就个人而言,我从2003年开始使用Maven而且我从未回头.

  • 你不得不承认,大多数项目都是玩具项目,也就是简单的依赖项.这只是统计法则. (4认同)
  • @trix,关于热部署ant与maven的关系:如果你没有为热部署进行ant build,你为什么要使用Maven呢?我想如果你使用相同的蚂蚁,它至少需要相同的时间......不是吗? (2认同)
  • 那么Pascal,您能否告诉我们您如何将项目配置为Maven性质并且不使用构建过程进行部署?这是最初问题的第2点.我想知道如何做到这一点,所以如果你能给我们一个明确的解释,真的很感激. (2认同)

YoK*_*YoK 20

Maven可以被视为完整的项目开发工具,而不仅仅是像Ant这样的构建工具.您应该使用带有maven插件的Eclipse IDE来解决所有问题.

以下是Maven的一些优点,引用了使用Maven页面的好处:

亨宁

  • 快速项目设置,没有复杂的build.xml文件,只是一个POM和去
  • 由于集中式POM,项目中的所有开发人员都使用相同的jar依赖项.
  • 为"免费"项目获取大量报告和指标
  • 减少源分布的大小,因为罐子可以从中心位置拉出

伊曼纽尔维尼斯

  • 很多目标都是可用的,因此没有必要开发一些特定的构建过程部分,与ANT相反,我们可以在构建过程中使用antrun插件重用现有的ANT任务

杰西麦克康纳

  • 促进代码的模块化设计.通过简化管理多个项目,它允许将设计布局成多个逻辑部分,通过在pom文件中使用依赖性跟踪将这些部分编织在一起.
  • 强制执行代码的模块化设计.很容易为模块化代码支付口碑服务,但是当代码在单独的编译项目中时,除非你在依赖管理中特别允许它,否则不可能在代码模块之间交叉授粉...没有'我会'现在就这样做,并在以后的实施中修复它.
  • 明确宣布依赖管理.使用依赖关系管理机制你必须尝试搞砸你的jar版本......没有任何经典问题'这个供应商jar的哪个版本是这个?' 如果它存在,当你被迫在你的存储库中制作"未知"版本来启动并运行时,在现有项目中设置它会破坏现有混乱的顶部......或者说你自己知道ABC.jar的实际版本.
  • 强类型生命周期有一个强大的生命周期,软件系统从构建的开始到结束......用户可以将他们的系统混合和匹配到生命周期,而不是拼凑他们自己的生命周期.这样做的另一个好处是允许人们从一个项目转移到另一个项目,并在软件构建方面使用相同的词汇表

文森特马索尔

  • 更大的动力:Ant现在已经成为传统,并没有快速前进.Maven正在快速发展,并且有可能围绕Maven(CI,Dashboard项目,IDE集成等)拥有大量高价值工具.

  • 虽然向下投票请提供理由,这是关于stackoverflow的不说但是道德规则. (5认同)

Ste*_*n C 10

找出小项目的依赖关系并不难.但是一旦你开始处理具有数百个依赖关系的依赖树,事情很容易就会失控.(我是根据这里的经验说的......)

另一点是,如果您使用具有渐进式编译和Maven支持的IDE(如Eclipse + m2eclipse),那么您应该能够设置编辑/编译/热部署和测试.

我个人不这样做,因为我过去因为糟糕的经历(Maven之前)而不相信这种发展模式.也许有人可以评论这是否真的适用于Eclipse + m2eclipse.

  • Ughh.这不是Maven的设计使用方式.Maven的一大好处是避免将依赖库检查到版本控制中.使用您的方法,您将使用大量二进制文件的许多版本来混乱您的VCS.有些VCS在处理二进制文件方面特别糟糕. (4认同)
  • 我想你可以.但是,如果您更新了项目的依赖项,或者您的项目依赖于快照,则可能会中断. (2认同)
  • 一般来说,在编写程序时,你会学到很难对任何一种魔法感到厌倦:-S (2认同)

Tho*_*sen 9

Maven是你需要事先决定你喜欢它并想要使用它的工具之一,因为你将花费相当多的时间来学习它,并且做出一劳永逸的决定将允许你跳过所有类型学习时的疑问(因为你喜欢希望使用它)!

强大的惯例在许多地方都有帮助 - 比如哈德森可以用Maven项目创造奇迹 - 但最初可能很难看到.

编辑:截至2016年,Maven是唯一的Java构建工具,所有三个主要IDE都可以使用开箱即用的源代码.换句话说,使用maven会使您的构建与IDE无关.这允许例如使用Netbeans分析,即使您通常在eclipse中工作


Luc*_*tti 9

Maven优于蚂蚁的优势很多.我试着在这里总结一下.

约定配置
Maven使用独特的方法进行项目布局和启动,这样可以轻松地跳转到项目中.通常它只需要checkount和maven命令来获取项目的工件.

项目模块化
项目约定建议(或更好地,强制)开发人员模块化项目.您通常不得不将项目划分为较小的子组件,而不是整体项目,这样可以更轻松地调试和管理整个项目结构

依赖关系管理和项目生命周期
总体而言,通过良好的SCM配置和内部存储库,依赖关系管理非常简单,您再次被迫考虑项目生命周期 - 组件版本,发布管理等.比蚂蚁更复杂一点,但同样,项目质量的提高.

maven有什么问题?
Maven并不容易.POM中的构建周期(完成的内容和时间)并不那么明确.此外,一些问题出现在组件的质量和公共存储库中缺少依赖性.
对我来说,最好的方法是拥有一个内部存储库,用于缓存(和保持)依赖关系,并应用于组件的发布管理.对于比书中的示例项目更大的项目,您将在之前或之后感谢maven


小智 6

Maven可以通过采用标准惯例和实践来加速您的开发周期,同时帮助您获得更高的成功率,从而为您的构建过程带来好处.有关Maven如何帮助您完成开发过程的更详细信息,请参阅使用Maven的好处.