1. 什么是maven
从字面解释maven是知识渊博、经验丰富的专家或怪才的意思。深入研究和使用maven,确实让人感到它确实沉淀了Java项目构建领域中的丰富知识和经验,并以一种高度可复用的形式出现在你的面前。maven的开发者在他们开发网站上指出,maven的目标是要使得项目的构建更加容易,它把编译、打包、测试、发布等开发过程中的不同环节有机的串联了起来,并产生一致的、高质量的项目信息,使得项目成员能够及时地得到反馈。maven有效地支持了测试优先、持续集成,体现了鼓励沟通,及时反馈的软件开发理念。如果说Ant的复用是建立在"拷贝--粘贴"的基础上的,那么Maven通过插件的机制实现了项目构建逻辑的真正复用。
2. maven的主要概念
- Goal: 类似于ant中的target,指完成一定功能的一个任务
- Artifact:项目产生物,主要有jar, war, maven插件
- Plug-in:插件,可复用的功能模块比如,middlegen,statcvs
- POM:项目对象模型(Project Object Model),是项目的一些关键元信息的集合。主要包含项目管理信息、具体的项目描述、开发小组的构 成、源代码库(如CVS)和邮件列表、项目依赖的库文件(开发时刻依赖和运行时刻依赖)、源代码、单元测试代码和资源文件的位置、项目报告
3. maven的依赖管理
maven对项目依赖的库文件进行集中管理,所有库文件都以一定结构存放在repository中,并用artifactId,groupId, version三个属性来标示它们。当项目需要某些库文件时,只要指明这三个属性即可。库文件在repository中存储结构也和这三个属性紧密相关,其关系为${mave.repo.remote}/ / s/ - . 。也就是假定repository的根目录为/javarepository那么 groupId为spring,artifactId为spring-orm,版本(version)为1.1.3的jar的库文件的存储路径为 /javarepository/spring/jars/spring-orm-1.1.3.jar。
maven的repository通常放在对公众开放的主机上,并由众多的镜像构成,最主要的是http://www.ibiblio.org/maven/。选择哪些repository是通过 Java系统变量maven.repo.remote。比如下面的配置maven.repo.remote=http://ultra/maven/, http://www.ibiblio.org/maven/,http://boss.bekk.no/maven/,http://mirrors.sunsite.dk/maven, http://www.ganet.org/maven将使maven从www.ibiblio.org,boss.bekk.no, mirrors.sunsite.dk,www.ganet.org四个站点依次寻找依赖的文件。该变量可以在四个地方设置:
- project.properties,
- build.properties,
- ${maven.home.local}/build.properties
- -D maven命令行,
3. maven的主要功能
maven是个构建工具的集成平台,所有功能都是通过插件实现的。maven内置和第三方扩展工具提供了大量功能,除了包括基本的编译、打包、java文档生成、运行单元测试外,还有j2ee项目支持,代码生成,产生测试覆盖率报告,项目开发过程各种文档的发布。
4. 使用maven的案例分析
背景,轻量级J2EE项目,dhtml+struts+spring+hibernate+dbunit,使用ER模型进行数据库设计
工具需求:
- 生成各种IDE(如eclipse, InteliJ Idea, JBuilder)的项目工程文件
- 从设计好的数据库表反向生成Hibernate mapping和POJO、
- 导入导出excel的测试数据
- 项目开发小组还希望能够通过一个统一的入口迅捷地了解和获取项目开发过程的产生物和状态报告,比如项目管理者想了解单元测试的结果和测试覆盖率、代码贡献率;而设计人员系统通过这样一个渠道及时把设计的结果发布给编码人员,如需求描述的文档、数据库表结构、对象模型等;资深开发人员则想通过该入口能够快捷的浏览、评审代码。
- 对于需求1可以使用maven的eclipse, idea, jbuilder插件,这些插件可以生成相应的项目工程文件;
- 对于需求2可使用maven-middlegen插件数据库反向工程生成各个实体的Hibernate影射文件,再用maven-hibernate插件将这些文件按模块组合成单个文件;
- 对于需求3可使用maven-dbunit插件的export-xls和import-xls功能;
- 对于需求4可使用site插件生成并发布项目信息和项目的各种报告如:代码交叉引用报告、单元测试报告、CVS代码状态报告等。
5. maven的经验总结
- 在局域网内设置maven repository的镜像站点,以便用maven管理开发组织内部的artifact,或其他无法在公共maven repository站点发布的artifact。并在${maven.home.local}/build.properties中,设置 maven.repo.remote属性使其指向该mirror。
- 尽可能使项目的构建自动化,一个比较好的工具是crusiecontrol。