`
flashing
  • 浏览: 350111 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

关于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。
分享到:
评论
32 楼 dhxyu 2008-10-20  
能有权利使用maven的人才需要去使用它
如果你不是一个manager,那肯定用不上,或者说你的任务不是这个!
工具都是为了方便自己,用熟悉了,哪个都不是问题,关键问题是你使用这个工具的熟悉度,就像DDD,国外已经领先10多年了,中国还是一小毛孩!!
31 楼 dengzi725 2008-10-14  
我觉得我们开发一个项目, 不是一堆小毛孩在堆积木。 总有一个强悍的人。可以做设计,可以做配置管理。 这些工作可以交给配置管理。 每个人去cvs,svn上更新好了。
如果项目在开发过程中还有这个包要换,那个包要换。 这个项目怎么能开发好。100人的队伍怎么能带好。
我觉得这些属于配置管理的问题,在项目正式开发前是已经配置好的。

从项目成功的角度来说,每个人必须服从项目成功上线是唯一的硬道理。而不是这个人今天发现这个技术好,所以临时改变技术实现方案。明天又是另外一个人发现。 那这个项目没有办法做了!!!

30 楼 dengzi725 2008-10-14  
对于楼主说的问题。我们在开发过程中也遇到到。 也很苦恼。用了maven 有很多东西还必须依赖他。
29 楼 pipilu 2008-08-27  
谢谢楼主发起这个讨论,我感觉从各位的回复中学到很多自己原来不了解的东西。
我很喜欢使用maven。一个开发团队是需要有个自己的repository服务器。
如果有网上无法下载的jar包,肯定不能直接拷到自己机器上就了事了。应该上传到服务器上供开发团队通过maven下载。
像包的依赖关系,打发布包时需要哪个jar包,不需要哪个jar包,需要哪个版本的,哪些包是调试程序时需要但打包时就不用的。这些用maven管理减少了很多出错的机会。
在有相互依赖的多个工程的情况下,maven也帮了大忙。
28 楼 cyberblue 2008-08-27  
murainwood 写道
cyberblue 写道
jobs 写道

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


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

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


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

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

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


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

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

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


我没觉得,我感觉一个团队如果在非常有钱的公司里,用maven很不错,可以体现出版本管理人员的价值,但如果所在的公司没有那么有钱,还是ant这种简单明了的工具比合适。
25 楼 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种武器之一。
24 楼 laiseeme 2008-04-16  
从来都用myeclipse不知ant啥的是何物
23 楼 protti 2008-03-25  
工具不是应该越简单越容易上手越好么?

22 楼 protti 2008-03-25  
引用

Maven N宗罪:
在公司内开发项目时,类库定下来后,为了稳定基本也不会升级了,所以它的最大优势体现不出来
需要搭建私服,简直没事找事儿
插件比Ant少
学习成本高
强制用它的目录结构
与IDE集成不好
配置麻烦

21 楼 xiaotiaotiao 2008-03-24  
hehe,ide集成的插件不好用
但是可以用eclipse生成一个maven的外部工具,工具里添加eclipse:eclipe等命令就可以了,另外可以按需要加入ant:ant然后用ant来执行其他步骤。
一个外部工具都可以搞定了
20 楼 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集成的,都是敲命令行的,对单元测试什么的也有很好的支持。
19 楼 agile_boy 2008-03-13  
呵呵,用gant(groovy ant),脚本编写,简单而强大
18 楼 MarkDong 2008-03-13  
Maven2的功能还是很好用的,配合artifactory这一完美的私服,简直所向无敌了。
楼主所说的各种问题其实还是没有充分挖掘pom的配置,例如要屏蔽某个包中对其它包的低版本的依赖,你可以通过<exclusion>标签来实现。对于pom配置标签的说明光看apache的文档是不够的,最好还是多看看其它包的pom文件,例如spring的pom配置文件,你会发现很多你原来不知道但是很有用的配置标签。
17 楼 YRHYRH 2008-03-11  
平时也用 EDITPLUS调用ANT ...很有意思。。把新来的小毛孩吓傻了。。
16 楼 YRHYRH 2008-03-11  
本人精通ANT ..但是我是指定JAR包版本号。然后用ANT 去固定的地址下载。。


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

一般实施mvn都会在内网建立私服,一来可以加快速度防止死链,二来也可以避免外部文件的变化导致项目的依赖风险,毕竟别人的服务器不是你的,你怎么能保证他们服务器的文件一直是可靠的呢,三呢,如果你度省事,又对依赖的兼容性绝对放心,那你可以自定义版本号来定义依赖,如果依赖有升级的话,你只要更新你的私服上的文件就可以了。
14 楼 litchi 2008-03-07  
我用ant为公司写了一个daily build system,其实也不是非常复杂啦,而且非常的灵活:)
13 楼 welllove53 2008-03-06  
为什么不用IVY呢,我们都用它。又方便又实用。。。
恩,我看行

相关推荐

    maven安装maven安装maven安装maven安装maven安装

    maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装...

    关于maven的资料关于maven的资料

    关于maven的资料关于maven的资料关于maven的资料关于maven的资料

    Maven 命令Maven 命令Maven 命令

    Maven 命令Maven 命令Maven 命令Maven 命令Maven 命令Maven 命令Maven 命令Maven 命令Maven 命令Maven 命令Maven 命令Maven 命令Maven 命令Maven 命令Maven 命令Maven 命令Maven 命令

    maven3.0 maven3.0

    maven3.0maven3.0maven3.0maven3.0maven3.0maven3.0maven3.0maven3.0maven3.0maven3.0

    开源工具Maven3.9.4版本压缩包

    Maven3.9.4版本压缩包,仅供学习参考,更新版本请前往Maven官方下载;Maven3.9.4版本压缩包,仅供学习参考,更新版本请前往Maven官方下载;Maven3.9.4版本压缩包,仅供学习参考,更新版本请前往Maven官方下载;Maven...

    maven 3.5.2 maven 3.5.2 maven 3.5.2

    maven 工具 maven 工具 maven 工具 maven 工具 maven 工具

    maven教程-maven教程-maven教程

    maven教程maven教程maven教程maven教程maven教程maven教程maven教程maven教程maven教程maven教程maven教程maven教程maven教程maven教程

    maven历史版本下载

    maven

    Maven全版本资源,Maven 3.0.5-3.8.5,每个版本包含4个文件,Maven3全资源打包下载,Maven全集

    apache-maven-3.0.5 apache-maven-3.1.1 apache-maven-3.2.5 apache-maven-3.3.9 apache-maven-3.5.4 apache-maven-3.6.3 apache-maven-3.8.5 每个版本包含4个文件: apache-maven-3.8.5-bin.tar.gz apache-maven-...

    maven API maven API

    maven api

    Maven常用命令 Maven Maven学习

    Maven常用命令 Maven Maven学习

    apache-maven-3.8.6.zip

    apache-maven-3.8.6-bin.zip apache-maven-3.8.6-bin.zip apache-maven-3.8.6-bin.zip apache-maven-3.8.6-bin.zip apache-maven-3.8.6-bin.zip apache-maven-3.8.6-bin.zip apache-maven-3.8.6-bin.zip apache-...

    maven3.6maven3.6maven3.6

    maven3.6maven3.6maven3.6

    maven 3.8.8 解压安装版

    Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件。 Maven 除了以程序构建能力为特色之外,还提供高级项目管理工具。由于 Maven 的缺省构建规则有较高的可重用性,...

    maven打包 maven打jar包详细步骤

    maven打包 maven打jar包详细步骤

    chm版本Maven教程

    maven教程,目录如下: Maven安装配置 Maven启用代理访问 Maven本地资源库 Maven中央存储库 如何从Maven远程存储库下载? Maven添加远程仓库 Maven依赖机制 定制库到Maven本地资源库 使用Maven创建Java项目 使用...

    maven3.2.5安装包下载

    Maven最新版是款项目管理和构建自动化工具。Maven包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System)。 安装...

    maven资源包maven资源包

    maven资源包maven资源包maven资源包maven资源包maven资源包maven资源包maven资源包maven资源包maven资源包maven资源包

    maven学习笔记maven学习笔记

    maven学习笔记maven学习笔记maven学习笔记

    apache-maven-3.8.5

    Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件。 Maven 除了以程序构建能力为特色之外,还提供高级项目管理工具。由于 Maven 的缺省构建规则有较高的可重用性,...

Global site tag (gtag.js) - Google Analytics