首页 > Java > 工具篇 > maven学习教程:What、How、Why
2014
04-08

maven学习教程:What、How、Why

或许你早已听说过IT技术学习的三部曲:What、How、Why,先了解该技术是干嘛的,解决了什么问题,然后学习怎么使用该技术,等你熟练之后便自然有了第三个阶段,在这个阶段你便开始思考在How阶段的每一步为什么要那样做、为什么……

本文也基于这三部曲的学习方式对maven技术进行讲解,带大家快速入手maven这一优秀的项目构建工具。

What:maven是用来干嘛的

Maven是一个基于Java平台的项目构建工具。

设计的出发点:

在进行软件开发的过程中,无论什么项目,采用何种技术,使用何种编程语言,我们要重复相同的开发步骤:编码,编译,测试,生成文档,打包发布。实际上除了编写源代码,其他步骤完全是重复一些琐碎的工作,这些琐碎的工作就是构建。

那为什么让软件开发人员去重复这些工作?开发人员的主要任务应该是关注商业逻辑并去实现它,而不是把时间浪费在学习如何在不同的环境中去打包,发布,Maven正是为了将开发人员从这些重复性的任务中解脱出来而诞生的。

Maven的优点/能做什么?

Maven是由早期为Jakarta Turbine定制的构建工具发展而来的,现在成为了一个独立的软件项目管理工具。Maven的优点:

1)Maven抽象了一个完整的构建生命周期模型,帮助我们标准化构建过程,比如:编译,测试,打包等。这使得Maven成为一款优秀的构建工具。

2)Maven不仅仅是构建工具,还是一个依赖管理工具和项目信息管理工具。Maven提供了中央仓库,通过一个坐标,可以自动下载类库并解决依赖问题。此外,Maven对于项目目录结构、测试用例命名方式都有既定的规则,只要遵循这些成熟的规则,在项目间切换的时候就免去了额外的学习成本,可以说是约定优于配置。

本节内容参考《Maven实战》

How:如何使用Maven

本节内容来源于Apache Maven主页中的一篇文章:Maven in 5 Minutes ( 5分钟快速入门),原文链接:

http://maven.apache.org/guides/getting-started/maven-in-five-minutes.html

1、前提条件

首先你需要了解如何在自己的电脑上安装软件,如果你不知道如何安装,请询问你办公室,学校里的人,或花钱找人来教你这个。 不建议给Maven的服务邮箱来发邮件寻求支持。

2、安装:

Maven是一个Java工具,所以你的电脑上必须安装了java。( 可在命令行键入java -version查看)

首先,下载Maven,按照安装说明进行操作。然后,在终端或在命令行中键入以下命令:

mvn –version

终端或命令行中应该打印出本机所安装的Maven的版本,例如:

Apache Maven 3.2.1 (ea8b2b07643dbb1b84b6d16e1f08391b666bc1e9; 2014-02-15T01:37:52+08:00)
Maven home: D:\apache-maven-3.2.1
Java version: 1.8.0, vendor: Oracle Corporation
Java home: D:\Program Files\Java\jdk1.8.0\jre
Default locale: zh_CN, platform encoding: GBK
OS name: “windows 8″, version: “6.2″, arch: “amd64″, family: “dos”

3、创建Maven项目

首先,创建存放项目的目录(例如d:\maven_proj或者/Users/xxx/maven_proj),打开终端或者命令行,进入该目录下,执行以下Maven命令:

mvn archetype:generate -DgroupId=org.flyne.demo -DartifactId=maven-demo -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

如果是刚安装了Maven的,第一次运行可能需要一段时间。这是因为Maven正在从网上下载大部分最近的artifacts (plugin jars and other files)到你的本地仓库。可能需要执行几次该命令才能成功。这是因为在下载完成之前,远程服务器的连接可能超时。

当输出了“BUILD SUCCESS”时表示项目创建成功了,你会发现,archetype:generate创建了一个目录,该目录目录即Maven项目的根目录,目录名称同artifactId。进入这个目录:

cd maven-demo

在该目录下,你将会看到如下标准的maven项目结构:

maven-demo
|– pom.xml
`– src
|– main
| `– java
|    `– org
|      `– flyne
|        `– demo
|          `– App.java
`– test
`– java
`– org
`– flyne
`– demo
`– AppTest.java

在src/main/java目录中包含了项目的源代码,src/test/java目录中包含了项目的测试代码,pom.xml文件是该项目的项目对象模型(Project Object Model),又称为POM文件。

POM文件

pom.xml文件是一个Maven项目的核心配置文件,该配置文件包含了大部分的构建一个项目所需要的信息。POM比较庞大而且比较复杂,但是即使没有完全理解,我们也能够有效地使用它。该项目的POM如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.flyne.demo</groupId>
  <artifactId>maven-demo</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>

  <name>maven-demo</name>
  <url>http://maven.apache.org</url>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

刚刚做了些什么?

刚刚我们执行了Maven的 archetype:generate目标(goal),并传入了多个参数。其中,前缀archetype是包含了目标的插件。如果你熟悉Ant ,你可以设想这类似于Ant中的任务(task)。这个目标(goal)创建了一个基于原型(archetype)的简单项目。一个插件是一系列拥有共同目的(general common purpose)的目标的集合。例如,jboss-maven-plugin插件,其目的是“处理各种JBoss项目(deal with various jboss items)” 。

构建(built)本项目

mvn package

命令行中将打印构建时的各种信息,结尾如下所示(输出了“BUILD SUCCESS”时表示项目构建成功)

[INFO] ——————————————————
[INFO] BUILD SUCCESS
[INFO] ——————————————————
[INFO] Total time: 3.086 s
[INFO] Finished at: 2014-04-08T12:46:13+08:00
[INFO] Final Memory: 13M/79M
[INFO] ——————————————————

不同于执行的第一个命令(archetype:generate),你可能会注意到第二个是简单的一个字 – package。这不是一个目标(goal),而是一个阶段(phase)。 一个阶段是一个构建的生命周期(build lifecycle)中的一步,一个构建的生命周期,可以看做是一系列阶段的有序集合。当指定了一个阶段时, Maven将顺序执行每个阶段,例如,如果我们执行编译(compile)阶段,实际被执行的各个阶段如下:

1.validate
2.generate-sources
3.process-sources
4.generate-resources
5.process-resources
6.compile

你可以使用下面的命令来测试刚刚编辑和打包的jar:

java -cp target/maven-demo-1.0-SNAPSHOT.jar org.flyne.demo.App

将会得到如下输出:Hello World!

4、运行Maven工具

Maven常用阶段(phase)

下面列出了的默认生命周期(default lifecycle)中一些经常执行的阶段。

  •   validate: 验证项目是否正确,所有必须的信息是否可用。
  •   compile: 编译项目的源码(生成maven-demo/target目录存放 .class文件)
  •   test: 使用单元测试框架对编译后的源码进行测试 , 测试代码不会被打包或部署。
  •   package: 接受编译好的代码,打包成可发布的格式,如JAR。
  •   verify: 运行任何检查,验证包是否有效且达到质量标准。
  •   install: 将包安装到Maven本地仓库,供本地其他Maven项目使用。
  •   deploy: 将最终的包复制到远程仓库,供其他开发人员和Maven项目使用。

还有值得注意的另外两个Maven的生命周期超出了上面的默认列表 ,它们是:

  •   clean: 清理上一次构建生成的文件
  •   site: 生成项目站点文档

这些阶段(phase)实际上被映射到底层的目标(goal)。每个阶段执行的具体目标依赖于项目的打包类型,例如,如果项目类型是一个JAR包的话,package 映射到的目标是 jar:jar ,而如果项目类型是 WAR 的话,执行的是 war:war。

注意的是,阶段(phase)和目标(goal)可以顺序执行,如:

mvn clean dependency:copy-dependencies package

这条命令将会清理项目(clean the project)、拷贝依赖(copy dependencies)并打包项目(package the project,即执行package之前的所有阶段来打包) 。

生成站点

mvn site

此阶段根据项目的POM文件生成了一个站点,你可以在target/site目录下看到生成的文档。

5、小结

以上只是maven的一个快速入门指南,如果你想了解更多,请看我写的另外一篇Maven博文《Maven教程》,主要介绍了在Eclipse下使用Maven,以及Maven中的概念,包括:依赖、插件、生命周期、属性、仓库等等。

Why:

本节内容欢迎您来补充。

其他学习资料

一篇不错的博文:Maven那点事儿:http://my.oschina.net/huangyong/blog/194583

一本不错的书:《Maven实战》 许晓斌 著


maven学习教程:What、How、Why》有 1 条评论

  1. qweasdzxc 说:

    很好的技术文风。

留下一个回复

你的email不会被公开。