maven系列-(三)maven仓库

我们在使用maven的时候,一定接触到过仓库的概念,我们的jar包全都放在仓库里,使用的时候,直接就可以从仓库里找到了。

什么是maven仓库:

maven组织存放构件的地方,分为远程仓库和本地仓库。

使用maven仓库的好处:

在使用maven以前,都是手动的在项目引入jar包,一般会在项目目录下新建一个lib文件夹,把jar包复制进去,然后还需要add jar,把jar包添加到Libraries中,才算是能够使用。这样就会存在一些问题,我们每个项目都会用到一些相同的包,如果在每个目录中都复制导入一份,那就会造成空间的浪费,还不利于统一管理。
既然maven引入了坐标的概念,可以保证项目组的人在使用的时候,下载下来的都是相同的jar包,那就还可以再进一步,把这些jar包统一放在一个路径下去管理。每个项目不需要再把jar包放在自己的项目目录下了,只需要声明这些依赖的坐标,maven就自动的去这个路劲下找到对应的依赖,这样就变得更加的合理。这就是maven仓库。

maven仓库的分类:

maven仓库分为本地仓库和远程仓库。maven根据坐标查找依赖的时候,先去本地仓库找,找不到的话,再去远程仓库找。

本地仓库的路径,默认是用户目录下的.m2/repository/,进去这个目录下的话,可以看到有很多的文件夹,对应下载的各种依赖包。就比如我们上一篇文章中引入的spring-core的jar包,就可以在这里找到:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>5.1.0.RELEASE</version>
</dependency>

找到的jar包路径是:/org/springframework/spring-core/5.1.0.RELEASE,进去之后就可以看到里面的内容。
在这里插入图片描述
这里就包含引入的jar包了。
这里就涉及到本地仓库的路径规则,一般情况下,引入的jar包在repository下的存放路径为:groupId/artifactId/version/artifactId-version.packaging,并且会把groupId中的"."也换成路径的分隔符。
我们引入spring-core的groupId为org.springframework,artifactId为spring-core,version为5.1.0.RELEASE,packaging是jar,所以对应的文件为/org/springframework/spring-core/5.1.0.RELEASE/spring-core-5.1.0.RELEASE.jar

说完了本地仓库,再说下远程仓库,远程仓库分为三种:中央仓库、其他公共库和私服。
中央仓库是maven自带的仓库,默认的配置下,当本地仓库没有找到对应的依赖时,就会去中央仓库下载。
其他公共库,就是一些其他公开的非中央仓库,比如java.net maven库、Jboss maven库等。
私服:是在局域网内搭建的一个私有的仓库服务器,一般在组织内,代理所有的外部远程仓库,存放一些不对外公开的内部构件。
在这里插入图片描述

一般情况下,一个组织内进行开发时,都推荐搭建自己的私服。因为如果没有私服的话,每次下载依赖,都需要请求外部的仓库,比较耗费流量,而且有些外部仓库的服务器在国外,访问速度也很慢。采用了私服,当私服上不存在相应的构件时,就会去请求外部的仓库下载,下载完成之后缓存在私服上,这样其他人下载的时候,直接从私服上下载就可以了,速度会很快,也减少了中央仓库的压力。除此之外,私服还可以存放组织内部的一些构件,供内部人员下载使用。

远程仓库的配置:

可以通过repositories标签来配置远程仓库:

<repositories>
    <repository>
        <id>test-nexus</id>
        <url>http://maven.test.com:8081/nexus/content/xxx/xxx</url>
        <releases>
            <enabled>true</enabled>
        </releases>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
    </repository>
</repositories>

repositories标签中可以配置多个repository,一个repository代表一个远程仓库。
里面的id代表仓库的id,这个id必须是唯一的。maven自带的中央仓库,id为central,如果我们自己配置了同样id的仓库,就会覆盖掉maven自带的中央仓库。
url代表仓库的地址,releases标签为true,代表支持下载构件的发布版本,snapshots标签为true,表示支持下载构件的快照版本。
如果远程仓库需要认证的话,则需要在.m2/settings.xml中添加用户名和密码,不能配置在pom文件中,因为在本地配置用户名和密码比较安全。

repositories标签是配置下载构件的远程仓库的,还有一个distributionManagement,则是配置上传构件的远程仓库的。
maven可以把项目生成的构件,上传到仓库中,供其他团队成员下载使用,需要在pom文件中增加:

<distributionManagement>
    <repository>
        <id>test_Local</id>
        <url>http://maven.test.com:8081/nexus/content/xxx/test_Local</url>
    </repository>
    <snapshotRepository>
        <id>test_Local_Snapshots</id>
     	<url>http://maven.test.com:8081/nexus/content/xxx/test_Local_Snapshots</url>
    </snapshotRepository>
</distributionManagement>

distributionManagement中定义了repository和snapshotRepository两个标签,repository代表发布版本构件的仓库,snapshotRepository代表快照版本的仓库。
如果上传构件的仓库也需要认证的话,同样在.m2/settings.xml中添加用户名和密码。
我们在这些配置中,经常能够看到快照版本,那什么是快照版本,什么又是发布版本呢。

发布版本和快照版本:

我们在pom文件中引入依赖时,有时候会看到引入的依赖后面带了一个SNAPSHOT,这就说明引入的这个版本是个快照版本。快照版本属于不稳定的版本,可能会经常更新。当快照版本进行了更新时,maven就会拉取最新的版本。
和快照版本相对应的就是发布版本,发布版本说明这个版本已经稳定了。
我们在配置远程仓库的时候,有个snapshots标签,enabled值定义了true,但其实这个并没有写全,完整的是这样子的:

<snapshots>
    <enabled>true</enabled>
    <updatePolicy>daily</updatePolicy>
    <checksumPolicy>ignore</checksumPolicy>
</snapshots>

这里的updatePolicy就是maven从远程仓库检查更新的频率,默认就是daily,一天检查一次,checksumPolicy代表maven检查检验和文件的策略。如果我们定义的snapshots的enabled为true,那即使不定义updatePolicy,也默认是一天检查一次,如果版本有更新,maven就会下载最新的依赖构件。
平时一般不推荐使用快照版本,因为这可能会导致系统的不稳定,比如今天调试的正常的功能,第二天突然报错了。快照版本只适合在开发联调的过程中,防止一次次的引入依赖,当开发调试完成,就需要把快照版本改为发布版本了。

那我们只是引入了了xxx1.0-SNAPSHOT版本的依赖,maven是怎么知道这个快照版本有更新的呢。其实,当发布一个快照版本的构件时,maven就会自动的为这个版本打上一个时间戳,所以,当每天检查的时候,就可以根据这个时间戳判断是否需要更新了。

参考资料:
1.《maven实战》 许晓斌 著

猜你喜欢

转载自blog.csdn.net/chayangdz/article/details/82917407
今日推荐