参考: http://www.infoq.com/cn/minibooks/maven-in-action
http://hzbook.group.iteye.com/group/wiki/2872-Maven-in-action 

作者: 许晓斌(Juven Xu)


Apache组织中的一个颇为成功的开源项目,Maven主要服务于基于Java平台的项目构建、依赖管理和项目信息管理。无论是小型的开源类库项目,还是大型的企业级应用;无论是传统的瀑布式开发,还是流行的敏捷模式,Maven都能大显身手。

一、Maven的优点
1. 帮我们自动化构建过程,从清理、编译、测试到生成报告,再到打包和部署;
2. 抽象构建过程,提供构建任务实现, 标准化构建过程
3.Maven是跨平台的,无论是在Windows、Linux还是Mac上,都使用同样的命令;
4.Maven 通过一个坐标系统准确地定位每一个构件(artifact),也就是通过一组坐标Maven能够找到任何一个Java类库(如jar文件);
5. Maven还为全世界的Java开发者提供了一个免费的中央仓库,在其中几乎可以找到任何的流行开源类库。通过一些Maven的衍生工具(如Nexus),我们还能对其进行快速地搜索。只要定位了坐标,Maven就能够帮我们自动下载,省去了手工劳动;
6. 帮助我们管理原本分散在项目中各个角落的项目信息,包括项目描述、开发者列表、版本控制系统地址、许可证、缺陷管理系统地址等;

二、Maven的安装和配置
2.1 windows平台
1.检查是否安装必要的jdk
echo %JAVA_HOME% --指向jdk目录
java -version --查看jdk版本
2.下载maven,推荐使用3.0,解压即可  http://maven.apache.org/download.html
3.设置环境变量
M2_HOME  D:\bin\apache-maven-3.0(安装目录)
Path  %M2_HOME%\bin;

Ps.Path环境变量的作用:在cmd输入命令时,windows首先在当前路径寻找可执行文件或脚本,没有找到的话会接着遍历Path的路径,直到找到为止。
同样可以使用echo %M2_HOME%和 mvn -version 查看maven的安装目录和版本
2.2 Unix平台
与windows平台基本类似
设置环境变量(如下或者添加到profile文件里):
export M2_HOME=/home/juven/bin/apache-maven
export PATH=$PATH:$M2_HOME/bin

三、安装目录
3.1 M2_HOME
bin
boot
conf
lib
LICENSE.txt
NOTICE.txt
README.txt
  • Bin: 该目录包含了mvn运行的脚本,这些脚本用来配置Java命令,准备好classpath和相关的Java系统属性,然后执行Java命令。其中mvn是基于UNIX平台的shell脚本,mvn.bat是基于Windows平台的bat脚本。在命令行输入任何一条mvn命令时,实际上就是在调用这些脚本。该目录还包含了mvnDebugmvnDebug.bat两个文件,同样,前者是UNIX平台的shell脚本,后者是windows的bat脚本。那么mvn和mvnDebug有什么区别和关系呢?打开文件我们就可以看到,两者基本是一样的,只是mvnDebug多了一条MAVEN_DEBUG_OPTS配置,作用就是在运行Maven时开启debug,以便调试Maven本身。此外,该目录还包含m2.conf文件,这是classworlds的配置文件,稍微会介绍classworlds。
  • Boot: 该目录只包含一个文件,以maven 3.0为例,该文件为plexus-classworlds-2.2.3.jar。plexus-classworlds是一个类加载器框架,相对于默认的java类加载器,它提供了更丰富的语法以方便配置,Maven使用该框架加载自己的类库。更多关于classworlds的信息请参考http://classworlds.codehaus.org/。对于一般的Maven用户来说,不必关心该文件。
  • Conf: 该目录包含了一个非常重要的文件settings.xml。直接修改该文件,就能在机器上全局地定制Maven的行为。一般情况下,我们更偏向于复制该文件至~/.m2/目录下(这里~表示用户目录),然后修改该文件,在用户范围定制Maven的行为。本书的后面将会多次提到该settings.xml,并逐步分析其中的各个元素。
  • Lib: 该目录包含了所有Maven运行时需要的Java类库,Maven本身是分模块开发的,因此用户能看到诸如mavn-core-3.0.jar、maven-model-3.0.jar之类的文件,此外这里还包含一些Maven用到的第三方依赖如common-cli-1.2.jar、google-collection-1.0.jar等等。(对于Maven 2来说,该目录只包含一个如maven-2.2.1-uber.jar的文件原本各为独立JAR文件的Maven模块和第三方类库都被拆解后重新合并到了这个JAR文件中)。可以说,这个lib目录就是真正的Maven。关于该文件,还有一点值得一提的是,用户可以在这个目录中找到Maven内置的超级POM,这一点在8.5小节详细解释。其他: LICENSE.txt记录了Maven使用的软件许可证Apache License Version 2.0;NOTICE.txt记录了Maven包含的第三方软件;而README.txt则包含了Maven的简要介绍,包括安装需求及如何安装的简要指令等等。
3.2 ~/.m2
mvn help:system 。该命令会打印出所有的 Java 系统属性和环境变量,这些信息对我们日常的编程工作很有帮助。
在用户目录下,我们可以发现 .m2 文件夹。默认情况下,该文件夹下放置了 Maven 本地仓库 .m2/repository 。所有的 Maven 构件( artifact )都被存储到该仓库中,以方便重用。
默认情况下, ~/.m2 目录下除了 repository 仓库之外就没有其他目录和文件了,不过大多数 Maven 用户需要复制 M2_HOME/conf/settings.xml 文件到 ~/.m2/settings.xml

四、设置HTTP代理
ping repo1.maven.org  检查网络

编辑 ~/.m2/settings.xml 文件(如果没有该文件,则复制 $M2_HOME/conf/settings.xml
添加代理配置如下:
<settings>
…  
<proxies>
    <proxy>
      <id>my-proxy</id>
      <active>true</active>
      <protocol>http</protocol>
      <host>218.14.227.197</host>
      <port>3128</port>
      <!--
      <username>***</username>
      <password>***</password>
      <nonProxyHosts>repository.mycom.com|*.google.com</nonProxyHosts>
      -->
    </proxy>
  </proxies>
  …
</settings>


五、安装m2eclipse
m2e - http://m2eclipse.sonatype.org/sites/m2e
这款插件可以使eclipse直接导入或创建Maven项目,项目右键Run as可以直接使用或定制maven命令。

六、使用入门
Maven 项目的核心是 pom.xml POM Project Object Model ,项目对象模型)定义了项目的基本信息,用于描述项目如何构建,声明项目依赖,等等。
Maven 最主要的命令: mvn clean compile 、mvn clean test 、mvn clean package 、mvn clean install 。执行 test 之前是会先执行 compile 的,执行 package 之前是会先执行 test 的,而类似地, install 之前会执行 package 。我们可以在任何一个 Maven 项目中执行这些命令,而且我们已经清楚它们是用来做什么的。

七、使用Archetype生成项目骨架 

如果是Maven 3,简单的运行:
mvn archetype:generate
如果是Maven 2,最好运行如下命令:
mvn org.apache.maven.plugins:maven-archetype-plugin:2.0-alpha-5:generate

Define value for groupId: : com.letica.myapp    
Define value for artifactId: : hello-world    
Define value for version:    1.0-SNAPSHOT: :    
Define value for package:    com.letica.myapp: : com.letica.myapp.helloworld    
Confirm properties configuration:    
groupId:  com.letica.myapp     
artifactId: hello-world    
version: 1.0-SNAPSHOT    
package:  com.letica.myapp.helloworld    
Y: : Y