您的位置:首页 > 其它

Maven基础简介

2017-01-03 00:00 363 查看
摘要: 本文主要摘自 徐晓斌先生的 “Maven实践”一书。

写此文的目的就是将自己一直以来对Maven的困惑的地方整理并配以官方解答。

本文编写的环境:

Windows系统、Maven 3.0、JDK 5、IDEA

一、序言

Maven是跨平台项目管理工具,主要服务 基于Java平台的项目构建、依赖管理、项目信息管理。

Maven是优秀的构建工具,能够帮助我们自动化构建过程,

从清理clean、编译compile、测试test到自动生成报告,再到打包package和部署deploy。

它是跨平台的,在Windows、Linux、Mac上都可以使用同样的命令。

Maven不仅是构建工具,还是一个依赖管理工具和项目信息管理工具,它提供了中央仓库,能帮助我们自动下载构件。

Maven官网http://maven.apache.org/index.html

二、Maven的安装和配置

在windows上安装Maven需要检查JDK,maven可以运行在JDK 1.4及以上版本。

2.1、Maven安装完后 需要配置Path环境变量



2.2、M2_HOME

看一下该目录的结构和内容:



bin:该目录包含mvn运行的脚本,准备好classpath和相关的java系统属性,然后执行java命令,

其中mvn是基于unix平台的脚本,mvn.bat是基于windows的脚本;

m2.conf文件,这是classworlds的配置文件;

boot:只包含一个文件 plexus-classworlds-2.4.2.jar 。plexus-classworlds是一个类加载器框架,相当于默认的java类加载器;

conf:该目录包含了一个非常重要的文件 setting.xml,直接修改该文件,就能在机器上全局的定制Maven的行为;

lib:该目录包含了Maven运行时需要的Java类库;

LICENSE.txt:记录了Maven使用的软件许可证;

NOTICE.txt:记录了Maven包含的第三方软件;

README.txt:包含了Maven的简单介绍,包括安装需求和如何安装的简要指令等。

2.3、设置MAVEN_OPTS环境变量

因为Java默认的最大可用内存往往不能满足Maven运行的需要,

经常会java.lang.OutOfMemeoryError,

因此通常需要设置MAVEN_OPTS的值为“- Xms128m - Xmx512m”。

方法:将MAVEN_OPTS设定为环境变量,一次制定,一劳永逸。

win7下设置方法如下:

1 右键我的电脑,选择属性
2 选择 高级系统设置
3 在 高级 tab页下,点击 环境变量 按钮
4 创建一个用户变量,变量名是MAVEN_OPTS 值为 - Xms128m - Xmx512m
5 保存...


2.4、配置用户范围,setting.xml

安装路径下/conf/setting.xml : 全局范围,整台机器上所有用户都会直接受到该配置的影响。

~/.m2/setting.xml : 是用户范围的,只有当前用户才会受到该配置的影响。

其中setting.xml中,localRepository:表示Maven用来在本地储存信息的本地仓库的目录。

默认是用户目录下面的.m2/repository目录。



三、Maven的POM【Project Object Model(项目对象模型) 】

Maven项目的核心是pom.xml。

POM:定义了项目的基本信息,用于描述项目如何构建,声明项目依赖等等。

3.1、新建pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<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>com.movitech.mavenDemo</groupId>
<artifactId>maven-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>Maven Demo Project</name>
</project>

第一行:XML头,指定了该xml文档的版本和编码格式;

project元素:是所有xml的根元素,它还声明了一些POM相关命名空间和xsd元素;

modelVersion子元素:指定了当前POM模型的版本;

groupId子元素:定义了项目是属于哪一个组,一般和项目所在的组织和公司存在关联;

artifactId子元素:定义了当前Maven项目在组中唯一的ID;

version子元素:指定了当前项目的版本,SNAPSHOT意为快照,说明该项目处于开发中,随着项目的发展,version会不断升级更新;

name子元素:声明了一个对于用户更为友好的项目名称,方便交流。

其中【groupId】、【artifactId】、【version】是任何一个Maven项目最基本的坐标。

3.2、为项目添加依赖 dependencies

<?xml version="1.0" encoding="UTF-8"?>
<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>com.movitech.mavenDemo</groupId>
<artifactId>maven-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>Maven Demo Project</name>

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

代码中添加dependencies元素,该元素下可以包含多个dependency元素以声明项目的依赖,

有了这段声明,Maven会自动下载junit-4.11.jar。

(Maven会自动访问中央仓库【http://repo1.maven.org/maven2/】下载需要的jar)

上述POM代码中还有子元素scope,为依赖范围,就是用来控制依赖与classpath(编译classpath、测试classpath、运行classpath)的关系。

Maven有以下集中依赖范围:

compile:编译依赖范围,如果没有指定,就会默认使用该依赖范围,此依赖范围对于编译、测试、运行三种classpath都有效。

test:测试依赖范围,只对测试classpath有效,在编译主代码或者运行项目的使用时将无法使用此类依赖。

provided:已提供依赖范围,对于编译和测试classpath有效,但在运行时无效。

runtime:运行时依赖范围,对于测试和运行classpath有效,但在编译主代码时无效。

四、Maven仓库

在maven世界中,任何一个依赖、插件或者项目构建的输入,都可以称为构件。

4.1、仓库布局

任何构件都有其唯一的坐标,根据这个坐标可以定义其在仓库中唯一存储路径,这便是Maven的仓库布局方式,

例如,log4j:log4j:1.2.15这一依赖,其对应的仓库路径为log4j/log4j/1.2.15/log4j-1.2.15.jar,

该路径与坐标的大致对应关系为groupId/artifactId/version/artifactId-version.packaging。

4.2、仓库分类

对于Maven来说,仓库分为两类:本地仓库和远程仓库。

当Maven根据坐标寻找构件的时候,它首先查本地仓库,如果本地仓库存在此构件,则直接使用,

否则会去远程仓库寻找,并且下载到本地再使用,

如果本地和远程都不存在,Maven就会报错。

五、生命周期 Lifecycle

Maven的生命周期就是为了对所有的构建过程进行抽象和统一。

包括项目清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成 等几乎所有构建步骤。

Maven拥有三套互相独立的生命周期,分别是:clean、default、site。

clean生命周期是清理项目;

default生命周期是构建项目;

site生命周期是简历项目站点。

5.1、clean生命周期的三个阶段

pre-clean:执行一些清理前需要完成的工作;

clean:清理上一次构建生成的文件;

post-clean:执行一些清理后需要完成的工作。

5.2、default生命周期

default生命周期定义了真正构建时所需要执行的所有步骤,是生命周期中最核心的部分

以下命令详细使用规则也可以参照官网:

http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html

validate:validate the project is correct and all necessary information is available.

initialize:initialize build state, e.g. set properties or create directories.

generate-sources:generate any source code for inclusion in compilation.

process-source:处理项目主资源文件,一般来说,是对src/main/resources目录的内容进行变量替换等工作后,复制到项目输出的主classpath目录中。

generate-resources:generate resources for inclusion in the package.

process-resources:copy and process the resources into the destination directory, ready for packaging.

compile:编译项目的主源码,一般来说,是编译src/main/java目录下的Java文件至项目输出的主classpath目录中。

process-classes:post-process the generated files from compilation, for example to do bytecode enhancement on Java classes.

generate-test-sources:generate any test source code for inclusion in compilation.

process-test-sources:处理项目测试资源文件。一般来说,是对src/test/resources目录的内容进行变量替换等工作后,复制到项目输出的测试classpath目录中。

generate-test-resources:create resources for testing.

process-test-resources:copy and process the resources into the test destination directory.

test-compile:编译项目的测试代码,一般来说,是编译src/test/java目录下的Java文件至项目输出的测试classpath目录中。

process-test-classes:post-process the generated files from test compilation, for example to do bytecode enhancement on Java classes.

test:使用单元测试框架运行测试,测试代码不会被打包或者部署

prepare-package:perform any operations necessary to prepare a package before the actual packaging.

package:接受编译好的代码,打包成可发布的格式,如JAR、WAR

pre-integration-test:perform actions required before integration tests are executed. This may involve things such as setting up the required environment.

integration-test:process and deploy the package if necessary into an environment where integration tests can be run.

post-integration-test:perform actions required after integration tests have been executed. This may including cleaning up the environment.

varify:run any checks to verify the package is valid and meets quality criteria.

install:将包安装到Maven本地仓库,共本地其他Maven项目使用

deploy:将最终的包复制到远程仓库,供其他人员或者Maven项目使用

5.3、site生命周期

site生命周期的目的是建立和发布项目站点,Maven能够基于POM所包含的信息,自动生成一个友好的站点,方便团队交流和发布项目信息,

pre-site:执行一些在生成站点前需要完成的工作;

site:生成项目站点文档;

post-site:执行一些在生成站点后需要完成的工作;

site-deploy:将生成的项目站点发布发哦服务器上。

六、Maven插件 Plugins

Maven的核心仅仅是定义了抽象的生命周期,具体任务是交给插件完成的,插件以独立构建形式完成。

6.1、插件绑定

Maven的生命周期是和插件互相绑定的,用以完成实际的构建任务。

clean生命周期与对应插件

生命周期阶段插件目标
pre-clean、cean、post-clean
maven-clean-plugin:clean
default生命周期与插件及具体任务

生命周期阶段插件目标执行任务
process-resourcesmaven-resources-plugin:resources复制主资源文件至主输出目录
compilemaven-compiler-plugin:compile编译主代码至主输出目录
process-test-resourcesmaven-resources-plugin:testResources复制测试资源文件至测试输出目录
test-compilemaven-compiler-plugin:testCompile编译测试代码至测试输出目录
testmaven-surefire-plugin:test执行测试用例
packagemaven-jar-plugin:jar创建项目JAR包
installmaven-install-plugin:install将项目输出构建安装到本地仓库
deploymaven-deploy-plugin:deploy将项目输出构建部署到远程仓库
site生命周期与对应插件

生命周期阶段插件目标
pre-site、site、post-site
maven-site-plugin:site
site-deploy
maven-site-plugin:deploy
如果用IDEA打开Maven项目,在右边栏Maven Projects中有一些常用的Lifecycle和Plugins

可以直接双击执行命令



未完待续......

以上内容如有问题,请帮忙评论告知,不胜感谢!

附件图片来自于徐晓斌先生的 “Maven实践”一书:











内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Maven