1. Maven概述
1.1 Maven是什么
Maven是一个强大的Java项目构建工具。
当然,你也可以使用其它工具来构建项目,但由于Maven是用Java开发的,因此Maven被更多的用于Java项目中。
Maven 曾是 Jakarta 项目的子项目,现为由 Apache 软件基金会主持的独立 Apache 项目。
1.2 Maven的作用
Maven的定位是项目构建工具,因此需要了解什么是项目构建工具。
构建工具是将软件项目构建相关的过程自动化的工具。
构建一个软件项目通常包含以下一个或多个过程:
-
生成源码(如果项目使用自动生成源码);
-
从源码生成项目文档;
-
编译源码;
-
将编译后的代码打包成JAR文件或者ZIP文件;
-
将打包好的代码安装到服务器、仓库或者其它的地方;
有些项目可能需要更多的过程才能完成构建,这些过程一般也可以整合到构建工具中,因此它们也可以实现自动化。
自动化构建过程的好处是将手动构建过程中犯错的风险降到最低。而且,自动构建工具通常要比手动执行同样的构建过程要快。
2. Maven的安装与配置
2.1 安装
-
下载并解压Maven;
-
添加环境变量
M2_HOME
,并设置为解压后的目录; -
将M2环境变量设置为
M2_HOME/bin
(在Windows上是%M2_HOME%/bin
,在Unix上是$M2_HOME/bin
); -
将M2添加到
PATH
环境变量中(Windows上是%M2%
,Unix上是$M2
); -
打开终端输入
mvn
,然后回车;
输入mvn
命令后,终端上回显示错误信息,不要担心这个错误,因为你没有给Maven传入pom文件,因此出现该错误信息是意料之中的。显示Maven错误信息说明Maven已经安装好了。
注意:Maven运行需要Java环境
2.2 配置
1.本地仓库
编辑$M2_HOME/conf/settings.xml
<localRepository>${user.home}/dev/maven_repository</localRepository>
2.国内镜像
编辑$M2_HOME/conf/settings.xml
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
3. 创建Maven项目
3.1 IDEA创建Maven项目
-
新建项目,左侧选择Maven,勾选
create from archetype
,并在下方列表中选中org.apache.maven.archetypes:maven-archetype-quickstart
-
填写项目名称、GroupId、ArtifactId以及Version,GroupId通常为公司域名倒置,ArtifactId通常与项目名保持一致,Version为项目版本号,此三项被称为Maven三大坐标,后面详细说。
-
确认各项配置
-
创建项目后需要一段时间自动下载Maven所需要的资源,BUILD SUCCESS代表创建完成。
3.2 Maven项目结构
-
新创建的Maven项目结构如下:
-
在main目录下创建两个新的目录
java
和resources
,并分别标记为Sources Root
和Resources Root
-
最终目录结构如下,
java
目录中存放java源代码,resources
目录存放资源文件,通常为配置文件。
4. pom详解
4.1 pom是什么
Maven项目中最重要的是pom.xml
文件,所谓pom意为Project Object Model,即项目对象模型。
Maven体现了面向对象的思想,将每个项目看作是一个对象,并用一个pom文件来具体描述。
每个项目有自己的属性,项目之间也会有一些关系,比如依赖、继承、聚合。
4.2 项目三大坐标
在项目pom的属性中,有三个属性是最重要的,分别是groupId、artifactId以及version,它们统称为Maven三大坐标,我们可以通过这三个属性来查找、定位到某个具体的项目。
-
groupId
Maven对项目是分组管理的,groupId通常为项目所属公司或组织的域名倒置,比如
com.codingfuture
。 -
artifactId
用来表示项目ID,即为项目名。
-
version
项目的版本号,可以为任意值,有两个常用的后缀方式需要了解:
-
RELEASE:发行版、正式版
-
SNAPSHOT:快照版、测试版
-
4.3 依赖
依赖是Maven中项目之间的一种关系,比如A项目的运行需要引入B项目,如果不使用Maven,我们需要在A项目中引入B项目的jar包,而在Maven中,我们只需要在pom中配置项目A与项目B之间的依赖关系就好,实际的引入操作由Maven来帮我们完成。
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
上面这段配置即为该项目的依赖配置,<dependencies></dependencies>
内为所有依赖,每一对<dependency></dependency>
标签即为本项目的一个依赖项,其中三大坐标是必填项,用来定位所依赖的具体项目,<scope></scope>
为依赖的作用域,具体可选值如下:
-
compile
默认就是compile,什么都不配置也就是意味着compile。compile表示被依赖项目需要参与当前项目的编译,当然后续的测试,运行周期也参与其中,是一个比较强的依赖。打包的时候通常需要包含进去。
-
test
scope为test表示依赖项目仅仅参与测试相关的工作,包括测试代码的编译,执行。比较典型的如junit。
-
runtime
runtime表示被依赖项目无需参与项目的编译,不过后期的测试和运行周期需要其参与。通常来说项目之间通过反射进行依赖则可以设置为runtime,最典型的就是mysql驱动。
-
provided
provided意味着打包的时候可以不用包进去,别的设施(Web Container)会提供。事实上该依赖理论上可以参与编译,测试,运行等周期。相当于compile,但是在打包阶段做了exclude的动作。
-
system
从参与度来说,也provided相同,不过被依赖项不会从maven仓库抓,而是从本地文件系统拿,一定需要配合systemPath属性使用。