http://blog.csdn.net/ghost_t/article/details/5709640
一.Maven与Antx概况:
在讲为什么使用maven之前我想说一下,antx,很多人知道ant,其实antx是阿里人自己搞的一套基于ant扩展的在某些方面类似于 mavnen的工具,我们甚至有eclipse的antx插件,可想而知antx在阿里的项目管理中的重要地位。它有很多优秀之处:
1. 可以比较好的支持第二方库
2. 支持项目之间的依赖和继承
3. antx可以用jelly来写插件
4. car包的支持,这里简单介绍下car包:
car是war包的一种中间格式,在打包的时候包含vm页面,webx.xml,classes等资源,但是没有包含
WEB-INF/lib,一个war包能包含多个car 包,在war包打包的时候,能够把web工程依赖的car中的jar
包,包括传递依赖的jar包,一起合并到WEB-INF/lib下
5. auto config: auto-config.xml配置项目中需要被替换的资源
为什么要引入maven
先说一下Antx在存在哪些问题:
1. Antx第三方库的管理比较复杂,如果某个项目需要一个新的jar包或者新版本的jar包,则需要走一个严格申请流程,并且需要自己提交相关的jar包
2. Antx对jar包的版本控制,changelist等没有工具上的支持,导致很多项目都是1.0-SNAPSHOT从头用到尾,导致包版本比较不好控 制。
3. Antx对SCM打包部署的支持不是很强。
4. Antx在于IDE的兼容性上存在问题,为了让eclipse支持antx,我们需要单独写一个antx插件来让eclipse支持antx,对于其他的 一些比较好的IDE比如Intellij IDEA,是不支持antx的。
5. 现在IDE很多都有一键式DEBUG的功能,包括集成对应用服务器的支持,antx在这方面存在不足。
Maven能解决这些问题么,还有更好的优势么, 答案是YES
1. Maven的库是由开源组织维护,不需要我们再花精力去管第三方库,即使自己维护,也比较方便。
2. Maven对jar包的版本管理有工具上的支持,比如将Release版本和Snapshot版本区分开,有利于SCM管理。
3. Maven是标准,用过的人多,不需要额外培训。
4. Maven的plugin比较多,可以有更多功能,Maven现有体系比较开放,采用的技术相对比较通用和成熟,plugin的机制也可以便于我们扩展更 多功能。
5. Maven的库下载是即用即下,不需要实现全部down下来。Maven的插件也是自动升级,可以方便的
我们扩展新功能。
6. 可以很方便的与eclipse, IDEA这样的主流的IDE集成
7. 仓库管理器:它的出现有两个目的:首先它的角色是一个高度可配置的介于你的组织与公开Maven仓库之间的代理,其次它为你的组织提供了一个可部署你组织 内部生成的构件(第二方库)的地方。
8. 版本管理功能,这里的版本管理不是指第三方库的版本管理,而是项目的版本管理
9. 站点功能:它的出现让我们可以对项目的状态一目了然,可以自动的把项目的状态和各种报表以站点的形式发布到内部网或者外部网,可以随时随地查看项目状态。 有很多中报表可以选择,包括,doc生成,代码规范的检查,自动bug检查,单元测试报表,单元测试的代码覆盖率报表
二.Maven 与Antx关系:
Antx是通过svn来管理第二方库和第三方库的,Maven也是通过第三方工具来实现,目前比较流行的仓库管理软件是Nexus,通过 Maven仓库管理,我们既可以对第三方库进行统一管理,又可以对第二方库甚至SNAPSHOT库进行管理。我们为什么要建立一个本地仓库呢,当然你可以 通过远程的Maven仓库来获取你所需要的jar,但是建立本地仓库更高效,更利于我们的管理,我们在本地,甚至整个公司,集团建立这样一个统一仓库以 后,我们不再需要把所有的jar包都存在本地开发机了,通过Maven我们可以通过很简单的命令来发布我们的第二方库到仓库管理器。这里简单说一下 SNAPSHOT,简而言之,SNAPSHOT就是一个临时版本,Maven可以像管理其他Release版本一样管理它,它在两个模块依赖开发的时候是 相当有价值的,这点我会在“版本管理”一文当中详细描述。
2. 转换Antx的第二方库和第三方库到Maven仓库 2)第三方库,比如apache的log4j.jarMaven会自动从Maven的中央仓库下载
3)转换module.xml到pom.xml,Maven根据module的多少只需要一个或者多个pom文件,我们需要根据依赖关系把相应 的依赖以Maven的格式做相应的转换。
3. 从Project.xml到pom.xml antx使用Project.xml来描述项目的基本信息比如依赖,结构等,使用project.jelly来描述项目的目标,比如 default=”jar”,表示本project.xml的默认目标是生成一个jar包, antx根据工程目标来调用不同的插件。Maven2.0中不再支持jelly的功能,Maven用绑定lifecycle来代替jelly中的 default goal的概念,maven将项目构建定义了一些标准的lifecycle, 简单列举,比如分为validate->initialize->compile->process- reslources->test-comile->process-test-resources->test->package->install->deploy maven的插件如果需要隐式执行,需要将插件绑定到Lifecycle的某个阶段。比如我们要将autoconfig的内容同步到 antx.properties,我们可以写一个插件并将其绑定到initilize的生命周期,按antx现有的策略同步autoconfig到 antx.properties,而在Install phase,autoconfig会根据antx.properties 的配置WAR,EAR,或JAR中的vm模板按antx.properties的配置项生成实际的值。
可能的问题: 1)将Project.xml中对二方库和三方库的依赖转换到对Maven Repository中的依赖。 对二方库的依赖可以直接按自己定义的规则转化,对三方库的转换依赖比较麻烦,有的需要手动处理。
2)将Jelly脚本中的内容使用不同的插件来实现。
3)有的三方库中的有的Jar被我们修改过,这种依赖需要手动处理上传到我们的Artifactory中,然后处理其依赖。
1)Maven中的依赖和继承Maven和antx的思想是类似的,所以项目的依赖和继承的功能他们都支持。Maven中的比较常见的做法是,定义一个parent POM,里面定义 了常用的插件,Maven库的地址,部署的目标库地址,Validate白名单等。项目的的总控文件,继承自这个Parent POM,可以简化项目的配置。
• 一种的依赖冲突是不用关心的,比如两个开源的三方库,引用了不同的Log4j,因为log4j的新版本可以兼容旧版本。我们可以认为这样的依赖冲突是可以 自动解决的。
• 另一种是我们关心的,比如ice 3.1和3.2,新版本将TCP连接方式改成了短连接,如果这种依赖升级,必须通过严格的测试,包括压力测试才能同意升级。
解决这样问题的方案是:我们可以做一个检查版本依赖检查的插件,必须通过依赖检查才能打包发布。 我们会在Parent POM中配置一个白名单,只有在白名单中中指明的jar包,比如log4j,commonlogging,即使有冲突,也能通过检查。 如果不在白名单中的冲突,我们会报出详细的错误信息,并且现在的Maven的Eclipse插件已经能用图形化的方式将依赖以及依赖冲突表示出来,方便我 们解决冲突。而Parent POM的修改权,会放给SCM或技术负责人,只有他们才能强制指定构建版本号,开发人员如果遇到版本冲突需要强制指定版本号,必须通过SCM或技术负责人 修改才能够通过构建。 做到对依赖冲突的强制指定至少是心中有数。比如 refund-domain依赖了mina-core 1.1.5,而notify-client依赖了1.2.3,会用红色箭头标出冲突的依赖,如果mina没有在我们的白名单中,那么这次构建是不会成功 的。
5. Maven怎么支持Jelly的功能Maven不支持jelly,但是可以通过插件完成相同的功能。 现在在Antx中的Jelly使用场景有:
• (1)在Project.jelly中指定default goal,比如jar,ear,car,在执行reactor的时候,会根据defaultgoal调用不同的插件来打包。 Maven中可以有一个对应的概念Packaging,可以实现相同的功能。Packaging不一样,在Maven Package阶段,Maven也会调用不同的插件来实现 打包的功能。
• (2)有的Jelly中在部署阶段实现了一些Copy文件的功能,我查看TradeManager和Denali中的Jelly文件, 都是部署的时候,比如将密钥文件从一个地方copy到项目中,然后打包。 Maven中的Reasource插件可以实现同样的功能,比如将外部资源文件Copy到target/class目录,然后打包,如果还有的jelly 插件实现,
auto-config中会把需要filtering的资源文件的路径列在script中,maven中使用resources插件来做这件事 情,需要将其列入pom.xml中。
JDK1.4以上,在你的操作系统中需要设置JAVA_HOME
1. 解压 apache-maven-2.0.10-bin.zip 到你想要的目录,比如c:/apache,那么解压后的目录为c:/apache/apache-maven-2.0.10
2. 添加环境变量 M2_HOME 到你的系统中,按照步骤1中的例子,环境变量 M2_HOME的值为c:/apache/apache-maven-2.0.10
3. 添加环境变量 M2 到你的系统中,值为%M2_HOME%/bin
4. (Optional)可选环境变量MAVEN_OPTS,比如如果你想改变java heap(堆)的大小那么可以设置其值为:-Xms256m -Xmx512m,这个选项在某些情况下是非常有用的,实际操作过程中,当你使用mvn site生成站点的时候需要的heap大小会比较大,这个时候你可能需要设置这个值,java启动默认的heap值大小为64M.
5. 在把M2加到path里面去,这样,在命令行模式下你才能够使用mvn
7. 开一个命令行客户端,运行 mvn –version ,如果成功出现版本号,那么恭喜 你,安装成功。
Unix-based Operating Systems (Linux, Solaris and Mac OS X)
1. 解压 apache-maven-2.0.10-bin.zip 到你想要的目录,比如/usr/local/apache-maven, 那么解压后的目录为/usr/local/apache-maven/apache-maven-2.0.10
2. export M2_HOME=/usr/local/apache-maven/apache-maven-2.0.10
4.(Optional)可选环境变量MAVEN_OPTS,比如如果你想改变java heap(堆)的大小那么可以设置其值为:-Xms256m -Xmx512m,这个选项在某些情况下是非常有用的,实际操作过程中,当你使用mvn site生成站点的时候需要的heap大小会比较大,这个时候你可能需要设置这个值,java启动默认的heap值大小为64M. 比如:export MAVEN_OPTS=”-Xms256m -Xmx512m”
7. 运行 mvn –version ,如果成功出现版本号,那么恭喜你,安装成功。
在 Eclipse 下使用 Maven
在 Eclipse 下使用 Maven 是通过叫做 m2e 的插件来实现的,在说如何使用之前,简单说一下 m2e 具 有哪些特性:
- 从 SCM 签出项目
- 利用预定义 Archetype 创建项目
- 创建 Maven 模块
- 导入 Maven 项目
- m2eclipse 有 POM 编辑器,可以不用手工编辑 POM
- m2eclipse 内置了对中央 Maven 仓库的搜索功能
- 依赖树功能 , 能够很方便的查看 ,jar 包 之间的依赖关系
有了这些特性,你可以很容易的开始在 Eclipse 中开发你的 Maven 项目,没有繁琐的命令,根据向导一步步点击就行了。
安装 m2e
在Eclipse中,从Help菜单选择 Software Updates。在Software Updates and Add-ons 对话框中,点击 Available Software 按钮,然后点击 Add Site 添加更新站点URL: 。在你添加了该URL之后,你将能够为你的项目添加 Maven Integration, Maven Optional Components,和Maven Project Configurators。
从 Maven archetype 创建一个 Maven 项目
Maven archetype 是一个项目模板,Maven仓库包含了很多 archetype ,包含了从web应用程序到消息组件的几乎所有类型项目。有了m2eclipse,使用Maven archetype 变得十分容易 。 要使用Maven archetype 创建一个Maven 项目,选择File -> New -> Project… , 然后在过滤字段输入maven。选择新的Maven项目然后点击Next。下一个屏幕会提供一个界面让你选择新项目的Maven archetype 。
搜索依赖和构件
从Maven仓库中快速搜索和定位依赖能极大的节省时间。有了 m2eclipse,你不再需要为一个版本的构件去找遍中央仓库。如果你需要为Maven项目添加一个构件,在项目上右击,然后选择Maven菜单下的 Add Dependency。之后,你会看到如下图的对话框。简单的输入groupId和artifactId会让m2eclipse搜索一个Maven仓库的 Nexus索引,并显示匹配的构件。快速定位构件意味着你不再需要花无数的时间在Maven仓库中点来点去,寻找一个特定的依赖构件。
分析依赖树
M2eclipse提供了一些有趣的功能让你分析并绘制项目依赖 的图表。你可以通过点击项目的pom.xml来载入POM编辑器。如果打开了一个带有很多依赖的项目,你可以点击POM编辑器的Dependency Tree选项卡,然后看到依赖显示。
如果你想要以图的形式查看依赖,点击Dependency Graph选项卡查看项目依赖图。点击图中的一个节点会标亮该节点并强调项目依赖中该构件和其它构件的关系。