`
yinwufeng
  • 浏览: 277734 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

从antx到maven的过渡

阅读更多

 

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中  。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics