Maven 学习
Maven简介
Maven是一个项目管理和构建的自动化工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期 (Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件 (plugin)目标(goal)的逻辑。
推荐书籍: 目前中文版对maven介绍比较全的书籍是《Maven实战》
核心概念
- POM (Project Object Model)
- Maven 插件
- Maven 生命周期
- Maven 依赖管理
- Maven 库
- Maven Profiles
POM
一般,maven 的 archetype 插件建立了一个工程目录,其中有一个 Project Object Model(POM) 文件 pom.xml 。这个文件用于描述项目,配置插件和管理依赖关系。
|
|
Maven 插件
当我们刚开始构建项目时,可以用mvn archetype:generate
命令来生成一个项目。那么这里的 archetype:generate
是什么意思呢?archetype 是一个插件的名字,generate是目标(goal)的名字。这个命令的意思是告诉 maven 执行 archetype 插件的 generate 目标。
一个目标是一个工作单元,而插件则是一个或者多个目标的集合。比如说Jar插件,Compiler插件,Surefire插件等。从看名字就能知道,Jar 插件包含建立Jar文件的目标, Compiler 插件包含编译源代码和单元测试代码的目标。Surefire 插件的话,则是运行单元测试。
所以,其实mvn 本身不会做太多的事情,它不知道怎么样编译或者怎么样打包。它把构建的任务交给插件去做。插件定义了常用的构建逻辑,并且能够被重复利用。
Maven 生命周期
项目中,我们经常用到mvn install或者mvn test等等,这些命令就是Maven对构建(build)的过程进行了抽象和定义,这个过程被称为构建的生命周期(lifecycle)。生命周期由多个阶段(phase)组成,每个阶段(phase)会挂接一到多个goal。goal是maven里定义任务的最小单元,相当于ant里的target。
如果你没有对它进行任何的插件配置或者定制的话,那么mvn deploy 会依次执行默认生命周期中包括编译,测试,打包,部署阶段。
生命周期更多内容,请参考Introduction to the Build Lifecycle,常见的生命周期如下:
- process-resources #复制并处理资源文件,至目标目录,准备打包。
- compile #编译项目的源代码。
- test #使用合适的单元测试框架运行测试。
- package #接受编译好的代码,打包成可发布的格式,如 JAR。
- install #将包安装至本地仓库,以让其它项目依赖。
- deploy #将最终的包复制到远程的仓库,以让其它开发人员与项目共享
Maven 依赖管理
maven 坐标能够确定一个项目。换句话说,我们可以用它来解决依赖关系。在 POM 中,依赖关系是在 dependencies 部分中定义的。
如例子中maven 不但会下载junit-4.11.jar,还下载了它的 POM 文件。这样 maven 就能检查 junit 的依赖关系,把它所需要的依赖也包括进来。
在 POM 的 dependencies 部分中,scope 决定了依赖关系的适用范围。我们的例子中 junit 的 scope 是 test,那么它只会在执行 compiler:testCompile and surefire:test 目标的时候才会被加到 classpath 中,在执行 compiler:compile 目标时是拿不到 junit 的。常见的scope如下:
- compile ,缺省值,适用于所有阶段,会随着项目一起发布。
- provided ,类似 compile ,期望 JDK 、容器或使用者会提供这个依赖。如servlet.jar 。
- runtime ,只在运行时使用,如 JDBC 驱动,适用运行和测试阶段。
- test ,只在测试时使用,用于编译和运行测试代码。不会随项目发布。
Maven 库
当第一次运行 maven 命令的时候,你需要 Internet 连接,因为它要从网上下载一些文件。那么它从哪里下载呢?它是从 maven 默认的远程库(http://search.maven.org/) 下载的。这个远程库有 maven 的核心插件和可供下载的 jar 文件。同时我们可以通过Maven Repository找到想要的架包和插件。
本地库是指 maven 下载了插件或者 jar 文件后存放在本地机器上的拷贝。在 Linux 上,它的位置在 ~/.m2/repository,在 Windows XP 上,在 C:\Documents and Settings\username.m2\repository ,在 Windows 7 上,在 C:\Users\username.m2\repository。当 maven 查找需要的 jar 文件时,它会先在本地库中寻找,只有在找不到的情况下,才会去远程库中找。
Maven Profiles
Profiles是maven的一个很关键的术语:profile是用来定义一些在build lifecycle中使用的environmental variations,profile可以设置成在不同的环境下激活不同的profile(例如:不同的OS激活不同的profile,不同的JVM激活不同的profile,不同的dabase激活不同的profile,不同的开发环境如Dev、QA、CI、Staging、Production等等)。
使用:当使用Maven命令打包的时候要指定你要使用哪一个profiles id来装配你的项目,命令如下mvn clean package -P development ,其中-p是指启用哪一个profiles id.具体参见三. Maven管理单元测试与功能测试
Maven管理单元测试和集成测试
将会在下一篇博客中提到,详见:Maven分离单元测试和集成测试
Maven常用命令
- 编译源代码: mvn compile
- 编译测试代码:mvn test-compile
- 运行测试:mvn test
- 产生site:mvn site
- 打包:mvn package
- 在本地Repository中安装jar:mvn install
- 清除产生的项目:mvn clean
- 生成eclipse项目:mvn eclipse:eclipse
- 生成idea项目:mvn idea:idea
- 组合使用goal命令,如只打包不测试:mvn -Dtest package
- 编译测试的内容:mvn test-compile
- 只打jar包: mvn jar:jar
- 只测试而不编译,也不测试编译:mvn test -skipping compile -skipping test-compile
( -skipping 的灵活运用,当然也可以用于其他组合命令) - 清除eclipse的一些系统设置:mvn eclipse:clean
- 查看架包依赖关系:mvn dependency:tree