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_HOME export 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.0
http://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中,处理冲突有两个原则:
短路径优先原则
A > B > C-1.0.jar A > C-1.1.jar
在上述情况中,最终生效的依赖是C-1.1.jar
先声明优先原则
A > B > C-1.0.jar A > B > C-1.1.jar
在上述情况中,最终生效的依赖是C-1.0.jar
Maven 在 IDE 中的使用
Eclipse
在新版本的 Eclipse 中,已经内置了 Maven ,不需要额外的下载。
IntelliJ IDEA
在 IDEA 中,已经内置了 Maven ,不需要额外的下载。
部分内容参考以下文章: