Fork me on GitHub
文章目录
  1. 1. Maven简介
  2. 2. 核心概念
    1. 2.1. POM
    2. 2.2. Maven 插件
    3. 2.3. Maven 生命周期
    4. 2.4. Maven 依赖管理
    5. 2.5. Maven 库
    6. 2.6. Maven Profiles
  3. 3. Maven管理单元测试和集成测试
  4. 4. 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 。这个文件用于描述项目,配置插件和管理依赖关系。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<project>
#该项目的坐标,其他项目可根据这个标识找到
<groupId>bookshelf</groupId>
<artifactId>bookshelf</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
</plugin>
</plugins>
</build>
</project>

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如下:

  1. compile ,缺省值,适用于所有阶段,会随着项目一起发布。
  2. provided ,类似 compile ,期望 JDK 、容器或使用者会提供这个依赖。如servlet.jar 。
  3. runtime ,只在运行时使用,如 JDBC 驱动,适用运行和测试阶段。
  4. 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常用命令

  1. 编译源代码: mvn compile
  2. 编译测试代码:mvn test-compile
  3. 运行测试:mvn test
  4. 产生site:mvn site
  5. 打包:mvn package
  6. 在本地Repository中安装jar:mvn install
  7. 清除产生的项目:mvn clean
  8. 生成eclipse项目:mvn eclipse:eclipse
  9. 生成idea项目:mvn idea:idea
  10. 组合使用goal命令,如只打包不测试:mvn -Dtest package
  11. 编译测试的内容:mvn test-compile
  12. 只打jar包: mvn jar:jar
  13. 只测试而不编译,也不测试编译:mvn test -skipping compile -skipping test-compile
    ( -skipping 的灵活运用,当然也可以用于其他组合命令)
  14. 清除eclipse的一些系统设置:mvn eclipse:clean
  15. 查看架包依赖关系:mvn dependency:tree
文章目录
  1. 1. Maven简介
  2. 2. 核心概念
    1. 2.1. POM
    2. 2.2. Maven 插件
    3. 2.3. Maven 生命周期
    4. 2.4. Maven 依赖管理
    5. 2.5. Maven 库
    6. 2.6. Maven Profiles
  3. 3. Maven管理单元测试和集成测试
  4. 4. Maven常用命令