Maven是什么?
Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project's build, reporting and documentation from a central piece of information.
是一个软件(特别是Java软件)项目管理及自动构建工具,由Apache软件基金会所提供。基于项目对象模型(缩写:POM)概念,Maven利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤。
简单地说,Maven是一个构建工具,能够帮助我们自动化构建构成,从清理、编译、测试到生成报告,再到打包和部署。使用Maven配置好项目后,输入简单的命令,如:mvn clean install,Maven会帮我们处理那些繁琐的任务。Maven可以帮助我们标准化构建过程.所有的项目都是简单一致的,简化了学习成本。Maven还是一个依赖管理工具和项目信息聚合工具,他还提供了中央仓库,能帮我们自动下载构件。
下载与配置Maven
Maven是一个Java工具,所以你必须安装Java环境。(注意maven的版本和JDK版本发布时间相差太远可能导致maven不能用)
- 官网下载解压安装
- path中加入maven安装目录下的bin目录路径
- 测试安装成功:cmd中执行mvn -v
- 修改配置文件————打开apache-maven-xxx\conf目录下的settings文件
-
(可选,默认在C盘的用户目录下)找到
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">样子的代码,在下面插入本地仓库的地址:
<localRepository>d:\mvn\repo</localRepository>里面填自己的仓库的地址
-
由于用于maven搜索下载全球的global仓库是在外国搭建的,不稳定,为了加速可以使用国内的镜像仓库,可以使maven加载速度大大提高,在标签之间插入下面代码 (极速之选,不选龟速)修改mirrors,在标签下加入以下配置,启动阿里云的镜像
<mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </
-
创建与简单运行
在cmd中如下输入:
mvn archetype:generate -DarchetypeCatalog=internal -DgroupId=com.chinasofti.build -DartifactId=demo
mvn clean compile exec:java -Dexec.mainClass="com.chinasofti.build.App"
生命周期
Maven对构建的过程进行了抽象和定义,这个过程被称为构建的生命周期。
生命周期由多个阶段(phase)组成,每个阶段会挂接一到多个goal。goal是Maven里定义任务的最小单位。

Maven坐标
Maven定义了这样一组规制:世界上任何一个构件都可以使用Maven坐标唯一标识,Maven坐标的元素包括groupId、artifactId、version、packaging、classifier。现在,我们只要提供正确的坐标元素,Maven就能找到对应的构件。
坐标详情
- groupId:定义当前Maven项目隶属的实际项目。
- artifactId:该元素定义实际项目中的一个Maven项目(模块)。
- version:该元素定义Maven项目当前所处的版本。
- packaging:该元素定义Maven项目的打包方式。
- classifier:该元素用来帮助定义构件输出的一些附属构件。
依赖
- 依赖:引用第三方的jar包或库
- 依赖的配置
<project> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <type>...</type> <scope>test</scope> <optional>...</optional> <exclusions> <exclusion> <groupId>...</groupId> <artifactId>...</artifactId> </exclusion> </exclusions> </dependency> </dependencies> </project>
根元素下project下的dependencies可以包含一个或者多个dependency元素,以声明一个或者多个项目依赖。每个依赖可以包含的元素有:
- groupId,artifactId和version:依赖的基本坐标,对于任何一个依赖来说,基本坐标是最重要的,Maven根据坐标才能找到需要的依赖。
- type:依赖的类型,对应于项目坐标定义的packaging。大部分情况下,该元素不必声明,其默认值是jar。
- scope:依赖的范围,后面会进行详解。
- optional:标记依赖是否可选。
- exclusions:用来排除传递性依赖
- 依赖范围
-
compile:编译依赖范围。使用此依赖范围的Maven依赖,对于编译、测试、运行的classpath都有效,依赖在所有阶段都可以获得,这是默认值。
-
provided:已提供依赖范围。 提供的依赖范围用来编译应用程序,但无需部署。若你用到jdk或者应用服务器提供的JAR,则使用此范围,servlet APIs就属于这个依赖范围。测试时,此依赖范围也加入到classpath。但在生成包时,由于容器已经存在该jar包,再打包可能会有冲突,所以生成包时不会加入,运行时自然也没效果。
-
runtime:运行依赖范围。在编译阶段是不需要的,对于测试和运行classpath有效,比如JDBC驱动程序。
-
test:测试范围依赖使用此依赖范围的Maven依赖,只对于测试classpath有效比如:Junit。
-
system 该依赖范围与provided所表示的依赖范围一致,对于编译和测试有效,但在运行时无效。只是使用system范围依赖时必须通过systemPath元素显式地指定依赖文件的路径。由于此类依赖不是通过Maven仓库解析的,而且往往与本机系统绑定,可能造成构建的不可移植,因此应该谨慎使用。
依赖范围 编译 测试 打包 运行 compile Y Y Y Y provided Y Y N N runtime N Y Y Y test N Y N N system Y Y N N
- 依赖传递
- 假如有Maven项目A,项目B依赖A,项目C依赖B。那么我们可以说 C依赖A。也就是说,依赖的关系为:C—>B—>A。那么我们执行项目C时,会自动把B、A都下载导入到C项目的jar包文件夹中。这就是依赖的传递性。
- A->B->C
简单传递依赖:A->C - A->B-C(0.1)
A->C(0.2)
最短路径优先原则: A->C(0.2) - A->B->C(0.1)
A->E->C(0.2)
第一声明优先原则:最终依赖C(0.1)