1.Maven概念

Maven是目前市场上最流行的包管理工具、项目构建工具。
通过maven可以管理整个项目从创建、开发到编译、测试、打包、发布的整个流程,进行标准化开发。
特别是通过依赖机制可以优雅的解决项目开发中包的依赖问题,大大简化了项目开发、管理流程。
Maven基于项目对象模型(POM)概念,利用中央信息片段管理一个项目的构建,生成,报告等等步骤;
是目前最主流的项目构建工具。

maven并不是市场上唯一的项目构建工具,但是是目前最流行的项目构建工具。

常见的项目管理工具

Android gradle maven 镜像 maven镜像的作用_本地库

2.Maven的基本概念

a. 库(repository)
maven使用库的概念来管理项目资源。
maven库又分为本地库和远程库,远程库可以细分为中央库、镜像库(代理库)和私服。
i. 中央库
指的是maven官方管理维护的库,是全世界最大的maven仓库,管理着大量的资源。
ii. 镜像库(代理库)
为了分摊中央库的访问压力、为了使全世界不同地区的用户都可以有较好的下载体验,除了中央库,全世界范围内还有多镜像库存在,镜像库可以认为是对中央库全部或部分资源的拷贝,全世界开发者可以选择去连接速度最优的镜像库获取资源。
国内比较知名的maven镜像库有网易镜像库和阿里镜像库。
iii. 私服
公司或个人也可以利用maven的机制搭建在一定范围内使用的类似中央库的库,在一定范围内管理项目资源,这样的库只在一定范围内起作用,且不一定和中央库互通,这样的库称之为私服库。
iv. 本地库
在当前机器内部保存资源的库。

maven在工作时优先从本地库寻找资源,如果找不到就去从配置的镜像库或私服或中央库中自动下载资源,下载的资源保存在本地库中,以便于重复使用。

Android gradle maven 镜像 maven镜像的作用_maven_02

3. 库中的资源定位

在maven库中管理着大量的资源,如何唯一的标识这些资源是一个基本的问题。maven中是通过资源的坐标地址来解决这个问题的。

Android gradle maven 镜像 maven镜像的作用_本地库_03


其中

Android gradle maven 镜像 maven镜像的作用_maven_04

4.Maven的安装配置

a. 下载

http://maven.apache.org/download.cgi b. 安装

i. 安装好jdk

maven3.6以上的版本至少需要jdk8,配置好JAVA_HOME环境变量。

ii. 安装maven

解压maven到任意目录,注意目录路径中不要出现中文或空格。

iii. 配置环境变量

配置MAVEN_HOME环境变量指向maven的安装目录

配置PATH环境变量指向maven安装目录中的bin目录

Android gradle maven 镜像 maven镜像的作用_java_05


iv. 配置maven

maven的核心配置文件是conf/settings.xml

在正式使用maven之前需要配置这个文件

主要需要指定本地库和镜像库的地址

Android gradle maven 镜像 maven镜像的作用_jar_06

5.maven的使用

可以利用maven管理项目的整个生命周期,这是通过maven的不同命令来实现的。

Android gradle maven 镜像 maven镜像的作用_jar_07

Android gradle maven 镜像 maven镜像的作用_本地库_08


Android gradle maven 镜像 maven镜像的作用_本地库_09


Android gradle maven 镜像 maven镜像的作用_java_10


Android gradle maven 镜像 maven镜像的作用_本地库_11

b. mvn compile
会自动导入pom文件中指定的依赖。
会将当src/main目录下的源码和资源编译后存放到target/classes下。
**注意,test文件夹下的所有内容在编译,打包,安装过程都不参加,但是会参加测试过程。
c. mvn test
通过此命令可以执行test文件夹下的测试用的内容,实现项目测试
首先会将src/test目录下的源码和资源编译后存放到target/test-classes下,之后执行其中的测试代码,输出测试结果到控制台,同时测试结果保存一份到target/surefire-reports中
d. mvn clean
清理mvn命令,此命令可以清除target文件夹,在其他mvn命令执行之前,通常都建议大家先执行一次mvn clean,这样可以将之前其他操作产生的结果清除,防止对本次执行的命令产生影响。

e. mvn package 默认是jar包

打包命令,会将编译完成的资源打包成指定格式(jar包/war包),具体怎样打包取决于pom.xml文件中的配置

如下配置指定了项目打成什么样的包:

jar

mvn package命令同时隐含了编译 测试 打包过程,建议在执行此命令之前最好先执行一次mvn clean 防止之前其他命令产生target内容影响此次命令执行的结果。

Android gradle maven 镜像 maven镜像的作用_jar_12


f. mvn install

maven项目安装,这会将打包好的包及其相关的资源文件存放到本地库中由maven进行管理,成为了maven所管理的一个资源。

maven install命令会隐含进行编译 测试 打包 安装,建议在执行此命令之前最好先执行一次mvn clean 防止之前其他命令产生 的target影响此次命令执行的结果。

Android gradle maven 镜像 maven镜像的作用_本地库_13

g. mvn deploy

maven项目发布,将maven本地库中管理的资源发布到远程库中。

但是无论是中央库还是镜像库都不允许随意上传部署,所以无法在中央库和镜像库中实现这个过程。

但是如果是自己搭建的私服,是可以通过这个过程完成资源发布的。

h.真实开发过程

Android gradle maven 镜像 maven镜像的作用_maven_14


6.pom文件的编写

maven管理的项目中,通过项目根目录下的pom.xml文件进行核心配置。

a.项目的基本信息

<modelVersion>4.0.0</modelVersion>

<!--当前项目的maven资源坐标-->
<groupId>cn.tedu</groupId>
<artifactId>MVNDemo01</artifactId>
<version>1.0-SNAPSHOT</version>

<!--此项目在mvn package的过程中,要打成什么样的包,通常是jar或war-->
<packaging>jar</packaging>

<!--项目名称-->
<name>MVNDemo01</name>
<!--项目主页-->
<url>http://maven.apache.org</url>

<!--参数配置-->
<properties>
	<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

b.依赖信息
声明当前项目所依赖的资源,maven根据此配置自动导入相关资源。
可以查询需要导入的资源的官网,通常会提供dependency的写法,或者也可以去maven中央库的网页版(https://mvnrepository.com/)中搜索,同样可以找到相应资源的依赖配置方法。

Android gradle maven 镜像 maven镜像的作用_maven_15


可选配置:

i. scope属性

Android gradle maven 镜像 maven镜像的作用_java_16


在项目中导入的依赖并不一定在项目全生命周期中都要用,此时可以通过scope属性指定依赖应用的范围。

Android gradle maven 镜像 maven镜像的作用_本地库_17


ii. exclusions移除依赖传递

在项目中导入A依赖,单A本身又依赖B和C,B又依赖的D,则Maven会智能的自动导入B、C和D,这样依赖就被传递了开来,这个过程就称之为依赖的传递。

依赖传递是一个非常优良的特性,可以省去maven使用过程中的大量配置细节,但这种智能的自动导入过程偶尔也会造成包引入的冲突,造成程序运行出错。此时可以通过配置exclusions来打断依赖的传递来解决问题。

简单来说配置的exclustions就是在告诉maven在导入某个包的过程中,指定的依赖传递不要自动导入。

Android gradle maven 镜像 maven镜像的作用_maven_18


c.插件信息

可以额外的增强maven的功能,实现一些特殊效果

i. main插件

用来指定打包出来的jar中的入口方法

Android gradle maven 镜像 maven镜像的作用_jar_19

ii. 打源码插件

用来额外打包源代码

Android gradle maven 镜像 maven镜像的作用_maven_20

7.IEDA下Maven的使用

a.基于骨架创建maven项目

Android gradle maven 镜像 maven镜像的作用_maven_21


b.指定项目资源坐标

Android gradle maven 镜像 maven镜像的作用_jar_22


c.配置maven信息

Android gradle maven 镜像 maven镜像的作用_maven_23


d.配置项目信息

Android gradle maven 镜像 maven镜像的作用_java_24


e.创建缺失的文件夹

Android gradle maven 镜像 maven镜像的作用_本地库_25


f.配置POM文件

Android gradle maven 镜像 maven镜像的作用_java_26


g.应用POM文件 修改/使用MAVEN命令

Android gradle maven 镜像 maven镜像的作用_本地库_27