让我们从开发一个十分简单的例子开始探究Maven的核心概念。通过学习,你将会对构建生命周期 (buildlifecycle),Maven仓库 (repositories),依赖管理 (dependency management)和项目对象模型 (Project Object Model)有一个基本的理解。

1.mvn创建项目
(1) JAVA项目 mvn archetype:create - DgroupId=net.bwda -DartifactId=common
(2) web 项目 mvn archetype:create - DgroupId=net.bwda -DartifactId=web-app - DarchetypeArtifactId=maven-archetype- webapp
默认情况下:
源代码在{basedir}/src/main/java
资源文件在{basedir}/src/main/resources
测试代码是在 {basedir}/src/test

2.创建一个简单的项目
mvn archetype:create -DgroupId=org.sonatype.mavenbook.ch03 -DartifactId=simple -DpackageName=org.sonatype.mavenbook
mvn 是Maven2的命令。archetype:create称为一个Maven目标 (goal),像-Dname=value这样的对是将会被传到目标中
的参数,它们使用-D属性这样的形式,类似于你通过命令行向Java虚拟机传递系统属性。archetype:create这个目标的目的通过archetype快速创建一个项目。在这里,一个archetype被定义为“一个原始的模型或者类型,在它之后其它类似的东西与之匹配;一个原型(prototype)”。Maven有许多可用的archetype,从生成一个简单的Swing应用,到一个复杂的Web应用。本章我们用最基本的archetype来创建一个入门项目的骨架。这个插件的前缀是“archetype”,目标为”create”。
通过上面,我们已经创建了一个基本的mvn项目。查看simple文件夹,目录层次如下:
simple/
simple/pom.xml
/src/
/src/main/
/main/java
/src/test/
/test/java
以上的目录层次为mvn的标准目录布局
(1) maven Archtype插件创建了一个与artifactId匹配的目录——simple
(2) pom.xml:每个项目都有一个pom.xml,里面有它的项目对象模型 (POM)。这个文件描述了这个项目,配置了插件,声明了依赖。也就是说配置jar包依赖关系,仓库地址等都是通过这个文件配置。
(3) src/main目录:用于存放项目的源码了资源文件。这个目录包含了一下java类和一些配置文件。在其它的项目中,它
可能是web应用的文档根目录,或者还放一些应用服务器的配置文件。在一个Java项目中,Java类放在src/main/java下面,而classpath资源文件放在src/main/resources下面。
(4) src/test:存放项目的测试用例。在这个目录下面,src/test/java存放像使用JUnit这样的Java测试类。目录src/test/resources下存放测试classpath资源文件。

3.构建项目
(1) 进入控制台,cmd进入simple目录,
(2) 输入 mvn install命令,执行构建。
(3)生成eclipse工程项目,输入: mvn eclipse:eclipse,然后将工程导入到eclipse工程即可。

3.mvn基础概念介绍
任何您想build的事物,Maven都可以认为它们是工程。 这些工程被定义为工程对象模型(POM,Poject Object Model)。 一个工程可以依赖其它的工程;一个工程也可以由多个子工程构成。
(1)Maven坐标
Archetype插件通过名字为pom.xml的文件创建了一个项目。这就是项目对象模型(POM),一个项目的声明性描述。当Maven运行一个目标的时候,每个目标都会访问定义在项目POM里的信息。当jar:jar目标需要创建一个JAR文件的时候,它通过观察POM来找出这个Jar文件的名字。当compiler:compile任务编译Java源代码为字节码的时候,它通过观察POM来看是否有编译目标的参数。目标在POM的上下文中运行。目标是我们希望针对项目运行的动作,而项目是通过POM定义的。POM为项目命名,提供了项目的一组唯一标识符(坐标),并且通过依赖 (dependencies) ,父 (parents) 和先决条件
(prerequisite) 来定义和其它项目的关系。POM也可以自定义插件行为,提供项目相关的社区和开发人员的信息。
Maven坐标定义了一组标识,它们可以用来唯一标识一个项目,一个依赖,或者MavenPOM里的一个插件。下面,我们通过查看pom.xml来了解mvn包含的一些元素的定义说明。

<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>org.sonatype.mavenbook.ch03</groupId>
<artifactId>simple</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>

<name>simple</name>
<url>http://maven.apache.org</url>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

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

GroupId:团体,公司,小组,组织,项目,或者其它团体。groupId是一个工程的在全局中唯一的标识符,一般 地,它就是工程名。groupId有利于使用一个完全的包名,将一个工程从其它有类似名称的工程里区别出来。

Artifact:在groupId下的表示一个单独项目的唯一标识符。artifact是工程将要产生或需要使用的文件,它可以是 jar文件,源文件,二进制文件,war文件,甚至是pom文件。每 个artifact都由groupId和artifactId组合的标识符唯一识别。需要 被使用(依赖)的artifact都要放在仓库(见Repository)中,否则 Maven无法找到(识别)它们。

version:一个项目的特定版本。发布的项目有一个固定的版本标识来指向该项目的某一个特定的版本。而正在开发中的项目可以用一个特殊的标识,这种标识给版本加上一个“SNAPSHOT”的标记。
项目的打包格式也是Maven坐标的重要组成部分,但是它不是项目唯一标识符的一个部
分。一个项目的groupId:artifactId:version使之成为一个独一无二的项目;你不能同
时有一个拥有同样的groupId, artifactId和version标识的项目。

packaging项目的类型,默认是jar,描述了项目打包后的输出。类型为jar的项目产生一个JAR文件,类型为war的项目产生一个web应用。包括EAR、WAR、JAR、ZIP、EJB几种类型。

Dependency:为了能够build或运行,一个典型的Java工程会 依赖其它的包。在Maven中,这些被依赖的包就被称为
dependency。dependency一般是其它工程的artifact。

Plug-in:Maven是由插件组织的,它的每一个功能都是由插件 提供的。插件提供goal(类似于Ant中的target),并根据在POM中 找到的元数据去完成工作。主要的Maven插件要是由Java写成 的,但它也支持用Beanshell或Ant脚本写成的插件。

Repository:仓库用于存放artifact,它可以是本地仓库,也可 以是远程仓库。Maven有一个默认的远程仓库--central,可以下载其中的artifact。在Windows 平台上,本地仓库的默认地址是User_Home.m2 epository。

Snapshot:工程中可以(也应该)有一个特殊版本,它的版本号 包括SNAPSHOT字样。该版本可以告诉Maven,该工程正处于开发阶段,会经常更新(但还未发布)。当其它工程使用此类型版本的artifact时,Maven会在仓库中寻找该artifact的最新版本,并自动下载、使用该最新版。

(2)Maven仓库(Repositories)
当你第一次运行Maven的时候,你会注意到Maven从一个远程的Maven仓库下载了许多文件。如果这个简单的项目是你第一次运行Maven,它首先会做的事情是去下载最新版本的Resources插件。在Maven中,构件和插件是在它们被需要的时候从远程的仓库取来的。Maven自带了一个用来下载Maven核心插件和依赖的远程仓库地址(http://repo1.maven.org/maven2),现已变更到http://search.maven.org/。
Maven仓库是通过结构来定义的在一个Maven仓库中,所有的东西存储在一个与Maven项目坐标十分匹配的目录结构中。
你可以访问Maven仓库http://search.maven.org/,搜索commons-io,你能在结果中找到相应的commons-io所对应的pom.xml,将该配置拷贝到你本地的pom即可在Windows XP上,你的本地仓库在C:\Documents and Settings\USERNAME\.m2\repository,在Unix系统上,你的本地仓库在~/.m2/repository。
当你执行mvn install时,把你项目的构件安装到你的本地仓库。Maven会从远程仓库下载构件和插件到你本机上,存储在你的本地Maven仓库里。一旦Maven已经从远程仓库下载了一个构件,它将永远不需要再下载一次,因为maven会首先在本地仓库查找插件,然后才从其他设置的仓库获取。

(3)Maven依赖管理
上面的例子中,Maven处理了JUnit依赖的坐标——junit:junit:3.8.1,指向本地Maven仓库中的/junit/junit/3.8.1/junit-3.8.1.jar。这种基于Maven坐标的定位构件的能力能让我们在项目的POM中定义依赖。如果你检查simple项目的pom.xml文件,你会看到有一个文件中有一个段专门处理dependencies,那里面包含了一个单独的依赖——JUnit。
一个复杂的项目将会包含很多依赖,也有可能包含依赖于其它构件的依赖。这是Maven最强大的特征之一,它支持了传递性依赖(transitive dependencies)。假如你的项目依赖于一个库,而这个库又依赖于五个或者十个其它的库(就像Spring或者
Hibernate那样)。你不必找出所有这些依赖然后把它们写在你的pom.xml里,你只需要加上你直接依赖的那些库,Maven会隐式的把这些库间接依赖的库也加入到你的项目中。Maven也会处理这些依赖中的冲突,同时能让你自定义默认行为,或者排除一些特定的传递性依赖。