2008-02-14

关于Maven,不吐不快。

关键字: 技术
今天infoq上一篇帖子,里面有句话说maven整个一个配置系统的EJB2,说到我心坎里了。
Maven有maven的好处,但是当你实际用起来maven之后,问题比你想象的要多的多,你很难驾驭它,这一切来自于混乱的仓库/版本/依赖管理和糟糕的ide插件支持。
我曾经发过帖子描述了我的需求和对maven的期待以及遇到的实际问题,newsmth上有个网友说我应该用maven1而不是maven2,我越核计越觉得不对劲,虽然那时我刚用maven,了解到的反对声音貌似很少,但是现在看看,随着对maven了解的增多,我也同时听到了越来越多的质疑声音。
主要的问题有如下几个:
第一:举例说,你有个一依赖A用到了spring-2.0.5;后来spring在仓库换地方了(这种事情太多了,看看maven混乱的仓库吧),而你需要的是最新的spring2.5.1,那么你编译的时候就会同时有一堆spring2.0.5的文件和spring2.5的文件;那么你需要手动的排除2.0.5的相关资源。问题是在maven体系里面,这种情况非常常见,大量的依赖混在一起的时候,你看着mvn install之后lib文件夹下乱七八糟的jar真是欲哭无泪啊,很多jar是同一个库的不同的版本,这些版本的依赖可能还不同,导致问题进一步的恶化。
第二:从eclipse的maven插件来说,add dependency的时候,一旦仓库更新了,你根本看不到最新的文件是是什么,比如struts2现在是2.0.11,但是你搜索的时候只能看到2.0.9,因为我是那个时候装的;加入了这个dependency之后只能手动改版本到2.0.11再编译。
第三:开发者们同步仍然有困难。如果项目依赖一个仓库里面没有的文件你就完蛋了,手动拷贝到本地目录是个常见做法,如果你有100个人参与项目我想你要加入一个依赖简直大家都要崩溃了,比如struts2的json插件这个包。幸好还有artifactory,不过你一遍遍的手动发到私服上也够烦了。
maven的支持者们,我们是活在现实世界中的生命,maven的思想很好但是java本身缺乏版本管理机制并且maven也没有切实有效的解决这个问题,只能靠meta里面maven文件夹里面的描述信息,这个信息很多时候没有经过严格测试的(我遇到过几次了!导致项目根本没法编译过去,那个包的开发人员一定也用的是他自己的私服)!如果再这样下去我想很多人会崩溃的……
我仍然是maven的用户,但是我在瞪着眼睛等待一个新的工具,取代maven和ant。
评论
pipilu 19 小时前
谢谢楼主发起这个讨论,我感觉从各位的回复中学到很多自己原来不了解的东西。
我很喜欢使用maven。一个开发团队是需要有个自己的repository服务器。
如果有网上无法下载的jar包,肯定不能直接拷到自己机器上就了事了。应该上传到服务器上供开发团队通过maven下载。
像包的依赖关系,打发布包时需要哪个jar包,不需要哪个jar包,需要哪个版本的,哪些包是调试程序时需要但打包时就不用的。这些用maven管理减少了很多出错的机会。
在有相互依赖的多个工程的情况下,maven也帮了大忙。
cyberblue 昨天
murainwood 写道
cyberblue 写道
jobs 写道

maven和svn都是趋势!享受他们带来好处的同时,但是得承受他现状的不足所带来的痛苦,但是慢慢一切都在变好。


我没觉得,我感觉一个团队如果在非常有钱的公司里,用maven很不错,可以体现出版本管理人员的价值,但如果所在的公司没有那么有钱,还是ant这种简单明了的工具比合适。

恩,这么说来,maven就是浪费钱的东西(ant能做,maven也能做,唯一的优点是支付给员工的工资更高)


也不一定,如果只用maven的默认功能,而且有人(稍微懂一点maven就可以)负责把别人的maven设置好,就没有必要花钱雇maven管理员,但是要保证默认功能足够用,如果开发人员提出一些比较苛刻的要求,那么还是暂时不要用maven的好。

实际上如果你写过ant脚本,你就发现后期写的ant脚本基本上都是重复前面的,开始一个新项目的时候也是找出以前的脚本抄一遍,一些人需要maven也是因为这个。
murainwood 昨天
cyberblue 写道
jobs 写道

maven和svn都是趋势!享受他们带来好处的同时,但是得承受他现状的不足所带来的痛苦,但是慢慢一切都在变好。


我没觉得,我感觉一个团队如果在非常有钱的公司里,用maven很不错,可以体现出版本管理人员的价值,但如果所在的公司没有那么有钱,还是ant这种简单明了的工具比合适。

恩,这么说来,maven就是浪费钱的东西(ant能做,maven也能做,唯一的优点是支付给员工的工资更高)
cyberblue 2008-08-18
jobs 写道

maven和svn都是趋势!享受他们带来好处的同时,但是得承受他现状的不足所带来的痛苦,但是慢慢一切都在变好。


我没觉得,我感觉一个团队如果在非常有钱的公司里,用maven很不错,可以体现出版本管理人员的价值,但如果所在的公司没有那么有钱,还是ant这种简单明了的工具比合适。
jobs 2008-08-18
在实际工作中用maven大约一年多了,maven的确存在一些问题,上面大家都提到了。主要有3点:
*1、学习曲线陡峭,文档不齐全
*2、不稳定
*3、IDE集成工具不稳定,不好用

maven用好了,的确能够带来巨大的方便,日构建很方便,打包比ant方便很多。有从ant到maven的,而极少从maven到ant的。hibernate被jboss收购之后从maven改成了ant,但这是商业问题,而非技术问题,是其中极少个案

详细说说上面提到的问题吧。

问题1,学习曲线陡峭,文档不齐全。maven带来全新依赖管理的概念,是一整套的,有学习成本,但采用的项目越来越多,了解和精通的人也越来越多。以前,只会在一些技术圈子里部分技术爱好者才会使用maven,最初只在开源项目中使用,现在普通的开发者也对他有一些了解。情况正在变得越来越好。

*问题2,不稳定。这个问题挺令人郁闷的。但是问题也是变得越来越好,maven至今为止,已经修正了2020个bug,已经逐步稳定下来了,snapshot更新有时候还不是很好用,但是知道这个问题的人,目前m2eclipse有update snapshots的菜单,也可以手工从.m2目录下把文件删除就好了。

*问题3,IDE支持不好。这个在Eclipse中,情况变得比较好了,目前m2eclipse的版本已经比较稳定了,08年之前,的确情况比较差,特别对web项目的支持很差,但是现在变好了,web项目仍然有一些小问题,但是也是有办法对付的。m2eclipse提交了加入Eclipse发行的提案,并得到通过,09年也许就会集成到Eclipse官方插件中。

这三个主要问题,都是maven的文档做的不够好,程序不够稳定,IDE插件不够稳定,而不是设计出现了问题。经过大量应用和测试,这三个问题都是会逐步变好的。maven是apache的核心项目之一,和tomcat是同一个级别的,人们也越来越了解maven,用maven也越来越多,一切都在变好中。

maven的问题并不会阻扰它变得更流行,现在基本大的开源项目都用maven做构建了,例如spring、apache下的大多数项目。

svn和maven的问题挺像的,svn的bug不少,IDE支持也不够好,但是一切都在改善中,成熟度和maven的现状比较相似。svn的IDE支持,例如subversive和subclipse,在一年前都是很差劲,现在问题就少多了。但是这些不会阻碍svn变得流行。

maven和svn都是趋势!享受他们带来好处的同时,但是得承受他现状的不足所带来的痛苦,但是慢慢一切都在变好。
hyysguyang 2008-08-13
MarkDong 写道
Maven2的功能还是很好用的,配合artifactory这一完美的私服,简直所向无敌了。
楼主所说的各种问题其实还是没有充分挖掘pom的配置,例如要屏蔽某个包中对其它包的低版本的依赖,你可以通过<exclusion>标签来实现。对于pom配置标签的说明光看apache的文档是不够的,最好还是多看看其它包的pom文件,例如spring的pom配置文件,你会发现很多你原来不知道但是很有用的配置标签。



看来老兄对maven把握的很好嘛,偶最初用ant,曾经一度用过make,之后,所有项目全部迁移到maven。偶现在是不会再回去用ant了,如果某个问题maven解决不了,你自己写个mojo,远比ant来的快的多。当然,偶也承认ant很强大,而且,超级强大,也是偶的N种武器之一。可以利用ant+ivy模仿maven,但是也仅仅是mock而已。

maven很强大,只不过学习曲线比较陡,这个倒是事实,但是只要你掌握了,它立刻成为你的N种武器之一。

偶其实不想说话,只是这个老兄说到点上了,因此,交流交流,请恕偶不回帖啊。
laiseeme 2008-04-16
从来都用myeclipse不知ant啥的是何物
protti 2008-03-25
工具不是应该越简单越容易上手越好么?
protti 2008-03-25
引用

Maven N宗罪:
在公司内开发项目时,类库定下来后,为了稳定基本也不会升级了,所以它的最大优势体现不出来
需要搭建私服,简直没事找事儿
插件比Ant少
学习成本高
强制用它的目录结构
与IDE集成不好
配置麻烦
xiaotiaotiao 2008-03-24
hehe,ide集成的插件不好用
但是可以用eclipse生成一个maven的外部工具,工具里添加eclipse:eclipe等命令就可以了,另外可以按需要加入ant:ant然后用ant来执行其他步骤。
一个外部工具都可以搞定了
biby 2008-03-18
rasonyang 写道
maven2实际上挺好的。
用任何东西,都是双刃剑。关键要扬长避短。
1、用maven2,最好有自己的私服。
比如,Spring 2.5.1,可能刚release,repo1.maven.org/maven2/不一定有。
你可以install到你的私服去。
2、应该结合Ant
很多maven不灵活的地方,可以用ant来解决
3、定义meta-inf的信息。
开发OSGI的Bundle,就必须定义meta-inf信息。也可以定义自己的格式。
4、不要使用maven2相关的ide。
实际上,多使用命令。比如mvn eclipse.然后,导入到eclipse工程。
有更新,再执行mvn eclipse,在刷新工程就可以。
我非常反对,过多的依赖IDE。单元测试比较难做,无法做到持续集成!
题外话:我个人强烈倾向于调式,使用mvn jetty:run;
数据库就用hsqldb,便于使用dbunit.
毕竟,现在可以使用spring,jpa/hibernate.
完全可以做到数据库无关性,应用服务器无关性。
5、依赖关系要设计好
jar和jar之间的关系,package和package之间的关系,
开发前,设计的时候就要规划好,不能什么都靠工具。工具不是万能的。
尤其是开发OSGI bundle的时候,依赖关系一定要先设计好,
一定要保证单向依赖性!

实际上,我使用maven,中间也遇到了一些问题,总的说来,帮助还是非常大。
尤其是,新来的开发人员搭建开发、测试环境、持续集成的时候,效果非常明显!
我也承认maven2是好的思路,但是实现得不好。
最重要的是,在新的工具出现前,我们只能选择它。
不过,可以结合IVY,ant,尽可能的扬长避短。



强烈同意!我使用maven2也快一年了,觉得很好用,没使用过ide集成的,都是敲命令行的,对单元测试什么的也有很好的支持。
agile_boy 2008-03-13
呵呵,用gant(groovy ant),脚本编写,简单而强大
MarkDong 2008-03-13
Maven2的功能还是很好用的,配合artifactory这一完美的私服,简直所向无敌了。
楼主所说的各种问题其实还是没有充分挖掘pom的配置,例如要屏蔽某个包中对其它包的低版本的依赖,你可以通过<exclusion>标签来实现。对于pom配置标签的说明光看apache的文档是不够的,最好还是多看看其它包的pom文件,例如spring的pom配置文件,你会发现很多你原来不知道但是很有用的配置标签。
YRHYRH 2008-03-11
平时也用 EDITPLUS调用ANT ...很有意思。。把新来的小毛孩吓傻了。。
YRHYRH 2008-03-11
本人精通ANT ..但是我是指定JAR包版本号。然后用ANT 去固定的地址下载。。


呵呵没有烦恼那。。。
pickerel 2008-03-10
依赖的版本混乱和mvn基本没什么关系,模块A用了spring2.0.5,模块2用了spring2.5,那mvn,mvn应该用那个呢?2.5么?mvn可没那么聪明能搞清楚自动用最新的之后模块A是否还能跑的正常,你也一样不知道,如果你对自己的东西要求严格的话,任何依赖更新之后你必须得测试相关的模块是否还正常然后才决定是否更新依赖。java虽然没有微软的dll hell,但它的jar hell是个更深的坑。

一般实施mvn都会在内网建立私服,一来可以加快速度防止死链,二来也可以避免外部文件的变化导致项目的依赖风险,毕竟别人的服务器不是你的,你怎么能保证他们服务器的文件一直是可靠的呢,三呢,如果你度省事,又对依赖的兼容性绝对放心,那你可以自定义版本号来定义依赖,如果依赖有升级的话,你只要更新你的私服上的文件就可以了。
litchi 2008-03-07
我用ant为公司写了一个daily build system,其实也不是非常复杂啦,而且非常的灵活:)
welllove53 2008-03-06
为什么不用IVY呢,我们都用它。又方便又实用。。。
恩,我看行
key 2008-03-05
我们项目组现在也用maven,刚开始时遇到一些问题,如jar包的依赖等,但是当整个项目组成员都熟悉以后效率就提升上来了。
另外,eclipse对maven的集成不是很好,个人倾向使用命令行
cangwu 2008-02-27
我也不喜歡現在的IDE,如果執行足夠快的話,還能用一下,但現實不是。
所以,很不喜歡現實的許多的IDE。
发表评论

提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则

您还没有登录,请登录后发表评论

flashing
搜索本博客
博客分类
最近加入圈子
最新评论