环境
-
maven3.6.1
-
开发工具idea
-
jdk1.8
本篇内容
-
maven是如何找到我们依赖的jar的
-
什么是仓库
-
仓库的分类
-
各种类型仓库详解
-
maven中远程仓库配置详解
-
关于构件版本问题说明
-
构件文件的布局
在maven出现之前,项目中用到第三方jar包时,我们会把这些依赖的jar包拷贝到项目的lib目录中,如果我们开发了多个项目,这些jar包在各个项目目录中都有一份拷贝,这存在的一些问题:
-
不方便jar包的管理,比如jar的升级、删除等操作
-
对磁盘空间的重复占用
主要还是不方便jar包的管理,maven很好的解决了这些问题,我们来看看maven管理依赖jar包的效果。
我来提几个问题,带着问题来看本篇内容
-
maven是如何将依赖的jar引入项目的?
-
maven项目中依赖的jar是从哪里获取的?
-
我们如何掌控这些jar的获取方式?
-
maven是如何组织管理构件的?
先来看一下maven项目案例
创建一个maven项目,打开idea,点击File->New->Project
,选择Maven
,如下:
点击Next
,输入项目坐标信息,如下:
点击Next
,输入Project name 为maven-chat03
,如下:
点击Finish
,创建成功,如下:
我们看一下这个项目占用的磁盘大小:
占用 29.9KB,下面我们在pom.xml中引入fastjson的依赖:
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
</dependencies>
创建一个Demo.java,如下
package com.javacode2018;
import com.alibaba.fastjson.JSON;
public class Demo1 {
public static void main(String[] args) {
System.out.println(JSON.class);
}
}
运行一下Demo1,输出:
class com.alibaba.fastjson.JSON
说明fastjson在项目中起效了,我们再来看一下项目的大小
上面一次是39kb,这次是49kb,大小增加了10KB,我们来看一下fastjson.jar的大小
这个jar包643kb,但是项目才49kb,这说明了什么?
说明了项目目录中没有包含这个jar包,只是对这个jar包做了一个引用。
如果系统中有很多项目,都采用同一个maven来引用依赖的jar包,那么这些jar只会在磁盘中存储一份,这些jar可以被其他所有的maven项目共享,项目只需要在pom.xml中通过maven坐标的方式来对这些jar进行引用,而不用再拷贝至项目中,若对jar包进行删除、升级版本直接修改pom.xml就可以了,非常方便。
结论:maven采用引用的方式将依赖的jar引入进来,不对真实的jar进行拷贝,但是打包的时候,运行需要用到的jar都会被拷贝到安装包中。
Maven寻找依赖的jar
我们可以看到,当我们项目中需要使用某些jar时,只需要将这些jar的maven坐标添加到pom.xml中就可以了,这背后maven是如何找到这些jar的呢?
maven官方为我们提供了一个站点,这个站点中存放了很多第三方常用的构建(jar、war、zip、pom等等),当我们需要使用这些构件时,只需将其坐标加入到pom.xml中,此时maven会自动将这些构建下载到本地一个目录,然后进行自动引用。
上面提到的maven站点,我们叫做maven中央仓库,本地目录叫做本地仓库。
默认情况下,当项目中引入依赖的jar包时,maven先在本地仓库检索jar,若本地仓库没有,maven再去从中央仓库寻找,然后从中央仓库中将依赖的构件下载到本地仓库,然后才可以使用,如果2个地方都没有,maven会报错。
下面我们来看看什么是仓库?
Maven 仓库
在 Maven 中,任何一个依赖、插件或者项目构建的输出,都可以称之为构件。
在 Maven 中,仓库是一个位置,这个位置是用来存放各种第三方构件的,所有maven项目可以共享这个仓库中的构件。
Maven 仓库能帮助我们管理构件(主要是jar包),它就是放置所有jar文件(jar、war、zip、pom等等)的地方。
仓库的分类
主要分为2大类:
-
本地仓库
-
远程仓库
而远程仓库又分为:中央仓库、私服、其他公共远程仓库
当maven根据坐标寻找构件的时候,会首先查看本地仓库,如果本地仓库存在,则直接使用;如果本地不存在,maven会去远程仓库中查找,如果找到了,会将其下载到本地仓库中进行使用,如果本地和远程仓库都没有找到构件,maven会报错,构件只有在本地仓库中存在了,才能够被maven项目使用。
本地仓库
默认情况下,maven本地仓库默认地址是~/.m2/respository
目录,这个默认我们也可以在~/.m2/settings.xml
文件中进行修改:
<localRepository>本地仓库地址</localRepository>
当我们使用maven的时候,依赖的构件都会从远程仓库下载到本地仓库目录中。
Maven 的本地仓库,在安装 Maven 后并不会创建,当我们执行第一条 maven 命令的时候本地仓库才会创建,