http://blog.csdn.net/ghost_t/article/details/5709640

一.Maven与Antx概况:

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关系:

1. Antx仓库到Maven仓库管理
Antx是通过svn来管理第二方库和第三方库的,Maven也是通过第三方工具来实现,目前比较流行的仓库管理软件是Nexus,通过 Maven仓库管理,我们既可以对第三方库进行统一管理,又可以对第二方库甚至SNAPSHOT库进行管理。我们为什么要建立一个本地仓库呢,当然你可以 通过远程的Maven仓库来获取你所需要的jar,但是建立本地仓库更高效,更利于我们的管理,我们在本地,甚至整个公司,集团建立这样一个统一仓库以 后,我们不再需要把所有的jar包都存在本地开发机了,通过Maven我们可以通过很简单的命令来发布我们的第二方库到仓库管理器。这里简单说一下 SNAPSHOT,简而言之,SNAPSHOT就是一个临时版本,Maven可以像管理其他Release版本一样管理它,它在两个模块依赖开发的时候是 相当有价值的,这点我会在“版本管理”一文当中详细描述。
 
2. 转换Antx的第二方库和第三方库到Maven仓库
1)发布第二方库到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中,然后处理其依赖。
 
4. 依赖管理问题
1)Maven中的依赖和继承
Maven和antx的思想是类似的,所以项目的依赖和继承的功能他们都支持。Maven中的比较常见的做法是,定义一个parent POM,里面定义 了常用的插件,Maven库的地址,部署的目标库地址,Validate白名单等。项目的的总控文件,继承自这个Parent POM,可以简化项目的配置。
2)依赖冲突问题
• 一种的依赖冲突是不用关心的,比如两个开源的三方库,引用了不同的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 插件实现,
6. Maven怎么支持autoconfig
auto-config中会把需要filtering的资源文件的路径列在script中,maven中使用resources插件来做这件事 情,需要将其列入pom.xml中。
 
三.Maven安装
Maven 下载地址:
 
准备工作:
JDK1.4以上,在你的操作系统中需要设置JAVA_HOME
 
Windows 2000/XP
 
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
6. 需要设置JAVA_HOME
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
3.export M2=$M2_HOME/bin
4.(Optional)可选环境变量MAVEN_OPTS,比如如果你想改变java heap(堆)的大小那么可以设置其值为:-Xms256m -Xmx512m,这个选项在某些情况下是非常有用的,实际操作过程中,当你使用mvn site生成站点的时候需要的heap大小会比较大,这个时候你可能需要设置这个值,java启动默认的heap值大小为64M. 比如:export MAVEN_OPTS=”-Xms256m -Xmx512m”
5.export PATH=$M2:$PATH
6.设置JAVA_HOME
7. 运行 mvn –version ,如果成功出现版本号,那么恭喜你,安装成功。
 
 
四.在Eclipse下安装Maven

在 Eclipse 下使用 Maven 
在 Eclipse 下使用 Maven 是通过叫做 m2e 的插件来实现的,在说如何使用之前,简单说一下 m2e 具 有哪些特性:

  1. 从 SCM 签出项目
  2. 利用预定义 Archetype 创建项目
  3. 创建 Maven 模块
  4. 导入 Maven 项目
  5. m2eclipse 有 POM 编辑器,可以不用手工编辑 POM
  6. m2eclipse 内置了对中央 Maven 仓库的搜索功能
  7. 依赖树功能 , 能够很方便的查看 ,jar 包 之间的依赖关系

有了这些特性,你可以很容易的开始在 Eclipse 中开发你的 Maven 项目,没有繁琐的命令,根据向导一步步点击就行了。

安装 m2e 

在Eclipse中,从Help菜单选择 Software Updates。在Software Updates and Add-ons 对话框中,点击 Available Software 按钮,然后点击 Add Site 添加更新站点URL: http://m2eclipse.sonatype.org/update/。在你添加了该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选项卡查看项目依赖图。点击图中的一个节点会标亮该节点并强调项目依赖中该构件和其它构件的关系。

Maven与Antx(整理)的更多相关文章

  1. Maven使用常见问题整理

    Maven使用常见问题整理  1.更新eclipse的classpath加入新依赖  1.在dependencyManagement里面加入包括版本在内的依赖信息,如:   <dependenc ...

  2. maven学习心得整理

    maven的学习心得 已经接触了maven项目有一段时间了,开始时仅仅会使用,在使用中发现了它的强大和方便,于是决心研究一下: 首先,普及一下maven参数: -D:传入属性参数 -P:使用POM中指 ...

  3. Maven 命令参数 整理

    命令参数 备注 mvn -v --version 显示版本信息; mvn -V --show-version 显示版本信息后继续执行Maven其他目标; mvn -h --help 显示帮助信息; m ...

  4. Maven 常见知识点整理

    认识 Maven Maven 的作用? 1.添加第三方jar包 2.解决jar包之间的依赖关系 3.获取第三方jar包 4.将项目拆成多个工程模块 Maven 是什么? 是Apache软件基金会组织维 ...

  5. Maven常用插件整理

    maven内置变量 ${basedir}表示项目根目录,即包含pom.xml文件的目录; ${version}表示项目版本; ${project.basedir}同${basedir}; ${proj ...

  6. 《Maven实战》整理

    一.maven介绍 Maven是优秀的构建工具,能够帮我们自动化构建过程,从清理.编译.测试到生成报告,再到打包和部署. Maven能帮助我们标准化构建过程.在Maven之前,十个项目可能有十种构建方 ...

  7. Maven打包方式整理

    方法一 maven-jar-plugin和maven-dependency-plugin插件打包 <build> <plugins> <plugin> <gr ...

  8. 2.Maven 使用

    1 Maven使用 1.1 编写POM 就像Make的Makefile,Ant的build.xml一样,Maven项目的核心是pom.xml. 首先创建一个名为hello-world的文件夹(本书中各 ...

  9. 1.Maven的安装及配置

    1 Maven 介绍 Maven这个词可以翻译为“知识的积累”,也可以翻译为“专家”或“内行”.本书将介绍Maven这一跨平台的项目管理工具.作为Apache组织中的一个颇为成功的开源项目,Maven ...

随机推荐

  1. 在Delphi中使用C++对象(转)

    源:http://blog.csdn.net/henreash/article/details/7352335 Delphi是市场上最好的RAD工具,但是现在C++占据着主导地位,有时针对一个问题很难 ...

  2. C#+QI的例子

    COM中,和我们打交道的是接口,也就是说类对我们是隐形的,那么我们要做开发,要使用这些功能,我们只能通过接口,通过接口暴露出来的方法,COM是一种服务器端/客户端架构,服务器端定义了操作的法,客户端通 ...

  3. [Big Data]Hadoop详解一

    从数据爆炸开始... 一. 第三次工业革命        第一次:18世纪60年代,手工工厂向机器大生产过渡,以蒸汽机的发明和使用为标志.      第二次:19世纪70年代,各种新技术新发明不断被应 ...

  4. 写插件时遇到的一个小问题,关于animate和css3的问题

    昨天写代码时,偶然想到了如果我们把css3属性放在animate中,指定时间.能否实现动画呢.举个例子吧: <script> $(".box").animate({ & ...

  5. Ubuntu iptables 设置

    在ubuntu中由于不存在 /etc/init.d/iptales文件,所以无法使用service等命令来启动iptables,需要用modprobe命令. 启动iptables modprobe i ...

  6. Deep learning:三十八(Stacked CNN简单介绍)

    http://www.cnblogs.com/tornadomeet/archive/2013/05/05/3061457.html 前言: 本节主要是来简单介绍下stacked CNN(深度卷积网络 ...

  7. 漂亮的HTML表格 - ebirdfighter的日志 - 网易博客

    一个像素边框的表格: Info Header 1 Info Header 2 Info Header 3 Text 1A Text 1B Text 1C Text 2A Text 2B Text 2C ...

  8. losbyday Linux下的强大工具之一akw(转),Shell必备

    简单使用:awk :对于文件中一行行的独处来执行操作 .awk -F :'{print $1,$4}'   :使用‘:’来分割这一行,把这一行的第一第四个域打印出来 .  详细介绍:AWK命令介绍 a ...

  9. RAC(ReactiveCocoa)

    什么是 ReactiveCocoa ReactiveCocoa(其简称为 RAC)是由 Github 开源的一个应用于 iOS 和 OS X 开发的新框架.RAC 具有函数式编程和响应式编程的特性.它 ...

  10. (简单) POJ 3159 Candies,Dijkstra+差分约束。

    Description During the kindergarten days, flymouse was the monitor of his class. Occasionally the he ...