Manven 介绍与基本使用
Maven 介绍
Apache Maven是一个软件项目管理和综合工具。基于项目对象模型(POM)的概念,Maven可以从一个中心资料片管理项目构建,报告和文件。
Maven是一个采用纯Java编写的开源项目管理工具。Maven采用了一种被称之为project object model (POM)概念来管理项目,所有的项目配置信息都被定义在一个叫做POM.xml的文件中,通过该文件,Maven可以管理项目的整个声明周期,包括编 译,构建,测试,发布,报告等等。
Maven 除了以程序构建能力为特色之外,还提供高级项目管理工具。由于 Maven 的缺省构建规则有较高的可重用性,所以常常用两三行 Maven 构建脚本就可以构建简单的项目。由于 Maven 的面向项目的方法,许多 Apache Jakarta 项目发文时使用 Maven,而且公司项目采用 Maven 的比例在持续增长。
Maven 和 Ant 的不同
| Maven | Ant | |
|---|---|---|
| 标准构建文件 | project.xml 和 maven.xml | build.xml |
| 特性处理顺序 | ${maven.home}/bin/driver.properties ${project.home}/project.properties ${project.home}/project.properties ${project.home}/project.properties ${project.home}/project.properties ${project.home}/build.properties ${user.home}/build.properties 通过 -D 命令行选项定义的系统特性 最后一个定义起决定作用。 | 通过 -D 命令行选项定义的系统特性 由 任务装入的特性 第一个定义最先被处理。 |
| 构建规则 | 构建规则更为动态(类似于编程语言);它们是基于 Jelly 的可执行 XML。 | 构建规则或多或少是静态的,除非使用<script>任务。 |
| 扩展语言 | 插件是用 Jelly(XML)编写的。 | 插件是用 Java 语言编写的。 |
| 构建规则可扩展性 | 通过定义 <preGoal> 和 <postGoal> 使构建 goal 可扩展。 | 构建规则不易扩展;可通过使用 <script> 任务模拟 <preGoal> 和 <postGoal> 所起的作用。 |
Maven 的常用命令
- mvn -version 查看 Maven版本
- mvn archetype:generate 创建Maven项目
- mvn compile 编译源代码
- mvn deploy 发布项目
- mvn test-compile 编译测试源代码
- mvn test 运行应用程序中的单元测试
- mvn site 生成项目相关信息的网站
- mvn clean 清除项目目录中的生成结果
- mvn package 根据项目生成的jar
- mvn install 在本地Repository中安装jar
- mvn eclipse:eclipse 生成eclipse项目文件
- mvnjetty:run 启动jetty服务
- mvntomcat:run 启动tomcat服务
- mvn clean package -Dmaven.test.skip=true: 清除以前的包后重新打包,跳过测试类
Maven 的下载安装
下载地址
官网下载地址:http://maven.apache.org/release-notes-all.html
准备工作
Apache Maven 是使用纯 Java 开发的,因此需要提前安装好 Java 运行环境并设置好环境变量 JAVA_HOME 。
解压安装及设置
将下载好的 Maven 文件,解压到任意目录。
添加环境变量
Windows
打开计算机属性 > 系统属性 > 高级 > 环境变量
在系统变量中新建 M2_HOME 变量,值为解压的Maven目录
修改系统变量 path,添加 %M2_HOME%\bin 。Linux
修改 /etc/profile 文件,在尾部添加以下内容:MAVEN_HOME=/usr/local/maven # Maven 解压路径export MAVEN_HOMEexport PATH=${PATH}:${MAVEN_HOME}/bin
使用 source 命令更新环境变量
source /etc/profile
使用 mvn -version 命令来验证是否安装成功
Maven 的基本配置
修改 Maven 本地库目录
默认位置
- Windows:~/.m2
- Linux:C:\Documents and Settings{用户名}.m2
修改配置文件 setting.xml,该文件默认在maven解压路径下的 conf 文件夹下,找到<localRepository>标签,取消其注释,修改本地库目录。
<localRepository>/usr/local/maven-repository</localRepository>
修改中央仓库地址
修改配置文件 setting.xml,找到<mirror>标签,取消其注释,修改中央仓库地址。
<mirror><id>nexus-aliyun</id><mirrorOf>*</mirrorOf><name>Nexus aliyun</name><url>http://maven.aliyun.com/nexus/content/groups/public</url></mirror>
启用代理访问
修改配置文件 setting.xml,找到<proxy>标签,取消其注释,修改代理访问参数,启动代理访问。
<proxy><id>optional</id><active>true</active><protocol>http</protocol><username>proxyuser</</username><password>proxypass</password><host>proxy.host.net</host><port>80</port><nonProxyHosts>local.net|some.host.com</nonProxyHosts></proxy>
Maven 的基本目录
Maven 的基本目录如下:
src|----main|----|----java|----|----|----package|----test|----|----java|----|----|----package|----resources
Maven 创建目录的方式
- 手动创建上述目录结构
- archetype:generate 按照提示进行输入创建
- archetype:generate -DgroupId=${groupId} -DartifactId=${artifactId} -Dversion={version} -Dpackage={Dpackage}
- DgroupId:组织名,一般是公司域名的反写
- DartifactId:一般为 项目名-模块名
- Dversion:版本名
- Dpackage:项目的包名
Maven 生命周期
一个完整的项目构建过程包括:清理、编译、测试、打包、集成测试、验证部署。
Maven强大的一个重要的原因是它有一个十分完善的生命周期模型(lifecycle),这个生命周期可以从两方面来理解,第一,顾名思义,运行Maven的每个步骤都由它来定义的,这种预定义的默认行为使得我们使用Maven变得简单,相比而言,Ant的每个步骤都要你手工去定义。第二,这个模型是一种标准,在不同的项目中,使用Maven的接口是一样的,这样就不用去仔细理解每个项目的构建了,一般情况下,mvn clean install 这样的命令是通用的。
Maven有三个相互独立的生命周期
- Clean Lifecycle:在进行真正的构建之前进行一些清理工作;
- pre-clean:执行清理前的工作
- clean:清理上一次构建生成的所有文件
- post-clean:执行清理后的文件
- Default Lifecycle:构建的核心部分,编译,测试,打包,部署等等,包含:compile test package install 等命令;
- Site Lifecycle:生成项目报告,站点,发布站点;
- pre-site:在生成项目站点前要完成的工作
- site: 生成项目的站点文档
- post-site:在生成项目站点后要完成的工作
- site-deploy:发布生成的站点文档到服务器上
运行任何一个阶段的时候,在它前面的所有阶段都会被运行,例如运行 mvn install 的时候,代码会被编译,测试,打包。
pom.xml
POM代表项目对象模型。它是 Maven 中工作的基本单位,这是一个 XML 文件。它始终保存在该项目基本目录中的 pom.xml 文件。
POM 包含的项目是使用 Maven 来构建的,它用来包含各种配置信息。
POM 也包含了目标和插件。在执行任务或目标时,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.0http://maven.apache.org/xsd/maven-4.0.0.xsd"><!-- --><!-- 指定当前pom的版本 --><modelVersion>4.0.0</modelVersion><!-- 域名反写 + 项目名 --><groupId>com.yeskery.sprout</groupId><!-- 项目名 + 模块名 --><artifactId>sprout-core</artifactId><!-- 版本名 --><version>0.0.1-SNAPSHOT</version><!-- 打包方式 默认为jar 其它值 war zip pom --><packing>jar</packing><!-- 项目描述名称 --><name></name><!-- 项目地址 --><url></url><!-- 项目描述 --><description></description><!-- 项目开发人员--><developers></developers><!-- 许可证 --><licenses></licenses><!-- 组织 --><organization></organization><!-- 子模块继承父模块 --><parent></parent><!-- 配置常量 --><properties></properties><!-- 依赖列表 --><dependcies><!-- 设置依赖是否可选 --><option></option><!-- 排除依赖传递列表 --><exclusions></exclusions><!-- 依赖 --><dependency></dependency></dependcies><!-- 依赖的管理 --><dependciesManagement></dependciesManagement><!-- 构建 --><build><!-- 插件列表 --><plugins></plugins></build><!-- 聚合多个模块 --><modules></modules><project>
依赖的 <scope> 设置
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><scope>test</scope></dependency>
Maven 有三种范围的classpath
- 编译
- 测试
- 运行
通过 <scope> 的值,可以确定该依赖在什么阶段进行导入到classpath中。
<scope> 的值有以下几种:
- compile:默认的范围,在编译、测试、运行范围下都有效;
- provided:在编译和测试范围有效;
- runtime:在测试和运行范围有效;
- test:只在测试范围有效;
- system:与本机系统相关联,可移植性差;
- import:导入的范围,只使用在<dependciesManagement>中,表示从其它pom中导入 dependcy 配置。
依赖冲突
在依赖设置中,经常会出先依赖冲突,尤其在通用工具类、日志类依赖中出现。
在Maven中,处理冲突有两个原则:
- 短路径优先原则
在上述情况中,最终生效的依赖是C-1.1.jarA > B > C-1.0.jarA > C-1.1.jar
- 先声明优先原则
在上述情况中,最终生效的依赖是C-1.0.jarA > B > C-1.0.jarA > B > C-1.1.jar
Maven 在 IDE 中的使用
Eclipse
在新版本的 Eclipse 中,已经内置了 Maven ,不需要额外的下载。
IntelliJ IDEA
在 IDEA 中,已经内置了 Maven ,不需要额外的下载。
部分内容参考以下文章:








评论