参考: http://www.infoq.com/cn/minibooks/maven-in-action
http://hzbook.group.iteye.com/group/wiki/2872-Maven-in-action
…
my-proxy
true
http
218.14.227.197
3128
…
作者:
许晓斌(Juven Xu)
blog: http://www.juvenxu.com/
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
export PATH=$PATH:$M2_HOME/bin
三、安装目录
3.1 M2_HOME
bin
boot
conf
lib
LICENSE.txt
NOTICE.txt
README.txt
boot
conf
lib
LICENSE.txt
NOTICE.txt
README.txt
- Bin: 该目录包含了mvn运行的脚本,这些脚本用来配置Java命令,准备好classpath和相关的Java系统属性,然后执行Java命令。其中mvn是基于UNIX平台的shell脚本,mvn.bat是基于Windows平台的bat脚本。在命令行输入任何一条mvn命令时,实际上就是在调用这些脚本。该目录还包含了mvnDebug和mvnDebug.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
)
添加代理配置如下:
…
…
五、安装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
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