Maven 简介
Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。 当你使用Maven的时候,你用一个明确定义的项目对象模型来描述你的项目,然后 Maven 可以应用横切的逻辑,这些逻辑来自一组共享的(或者自定义的)插件。
Maven 提供了构建工具(如:Ant)所提供功能的超集。 除了提供构建功能,Maven还可以生成报告,生成Web站点,并且帮助推动工作团队成员间的交流。
约定优于配置(Convention Over Configuration)
约定优于配置是一个简单的概念。 系统,类库,框架应该假定明智合理的默认值,而非总是要求提供不必要的配置。
Maven通过给项目提供明智的默认行为来融合这个概念。 在没有自定义的情况下,有下列默认配置:
一、源代码存放目录:/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/content-zh/src/main/java
二、资源文件存放目录:/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/content-zh/src/main/resources
三、测试代码存放目录:/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/content-zh/src/test
四、编译好的字节码存放目录:/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/content-zh/target/classes
五、项目假定会产生一个 JAR 文件。故 Maven会在 /usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/content-zh/target 创建一个可分发的 JAR 文件。
比如,在我本机,用的是 Windows XP 系统,登录系统的用户名为 chenlong ,我有一个项目叫 simple-weather,我本机的相关路径如下:
六、源代码存放目录:C:\Documents and Settings\chenlong\simple-weather\src\main\java
七、资源文件存放目录:C:\Documents and Settings\chenlong\simple-weather\src\main\resources
八、测试代码存放目录:C:\Documents and Settings\chenlong\simple-weather\src\test\java
九、测试资源存放目录:C:\Documents and Settings\chenlong\simple-weather\src\test\resources
十、编译好的字节码存放目录:C:\Documents and Settings\chenlong\simple-weather\target\classes
十一、JAR 文件存放目录:C:\Documents and Settings\chenlong\simple-weather\target
目录结构如图所示:
Maven 对约定优于配置的应用不仅仅是简单的目录位置,Maven 的核心插件使用了一组通用的约定,以用来编译源代码,打包可分发的构件,生成 web 站点,还有许多其他的过程。 Maven 的力量来自它的"武断",它有一个定义好的生命周期和一组知道如何构建和装配软件的通用插件。如果你遵循这些约定,Maven 只需要你做几乎为零的工作——仅仅是将你的源代码放到正确的目录,然后Maven 将会帮你处理剩下的事情。当然如果你不想遵循约定,Maven 也会允许你自定义默认值来适应你的需求。
一个一般的接口
Maven 为构建软件提供一个一般的或者说通用的接口。 如果你想参与一个新的项目或者是从头编译构建一个开源项目,只要这个项目是使用 Maven 来管理的,那么你就无需花时间去学习这个项目的构建系统,因为他们都遵循 Maven 定义的相同的规范。例如,你从 Subversion 检出一个项目如 Apache Wicket,然后你只需要运行一下 mvn install 命令来构建它,一切就 OK 了。
基于Maven插件的全局性重用
Maven 有很多优点,包括依赖管理和通过插件重用一般的构建逻辑。Maven 将一般的构建任务抽象成插件,同时这些插件得到了很好的维护以及全局的共享,你不需要从头开始自定义你项目的构建系统。这就是基于 Maven 插件的全局性重用。
一个“项目”的概念模型
Maven 维护了一个项目的模型,你不仅仅需要把源码编译成字节码,你还需要开发软件项目的描述信息,为项目指定一组唯一的坐标。你要描述项目的的属性。项目的许可证是什么?谁开发这个项目,为这个项目做贡献?这个项目依赖于其它什么项目没有?Maven不仅仅是一个“构建工具”,它不仅仅是在类似于 make 和 Ant 的工具上的改进,它是包含了一组关于软件项目和软件开发的语义规则的平台。这个基于每一个项目定义的模型实现了如下特征:
依赖管理
由于项目是根据一个包含组标识符,构件标识符和版本的唯一的坐标定义的,故项目间可以使用这些坐标来声明依赖。
远程仓库
和项目依赖相关的,我们可以使用定义在项目对象模型(POM)中的坐标来创建 Maven 构件的仓库。
全局性构建逻辑重用
插件被编写成和项目对象模型(POM)一起工作,它们没有被设计成操作某一个已知位置的特定文件。一切都被抽象到模型中,插件配置和自定义行为都在模型中进行。
工具可移植性/集成
像 Eclipse,NetBeans,和 InteliJ 这样的工具现在有共同的地方来找到项目的信息。在 Maven 出现之前,每个 IDE 都有不同的方法来存储实际上是自定义项目对象模型(POM)的信息。Maven 标准化了这种描述,而虽然每个 IDE 仍然继续维护它的自定义项目文件,但这些文件现在可以很容易的由模型生成。
便于搜索和过滤构件
像 Nexus 这样的工具允许你使用存储在 POM 中的信息对仓库中的内容进行索引和搜索。
一些小技巧:
从命令行运行 mvn install 命令 Maven 就会自动处理资源文件,编译源代码,运行单元测试,创建一个 JAR ,然后把这个 JAR 安装到本地仓库以为其它项目提供重用性。不用做任何修改,你可以运行 mvn site ,然后在 target/site 目录找到一个 index.html 文件,这个文件链接了 JavaDoc 和一些关于源代码的报告。
如果你想要运行单元测试,你需要做的只是编写测试类并放到测试目录,添加一个对于 TestNG 或者 JUnit 的测试范围依赖,然后运行 mvn test 。