仓库 2个月前

编程语言
675
仓库

四、仓库

4.1 仓库概念

  • 存储依赖的地方,体现形式就是本地的一个目录。
  • 仓库中不仅存放依赖,而且管理着每个依赖的唯一标识(坐标),Java项目凭坐标获取依赖。

4.2 仓库分类

Maven仓库可以分为本地仓库和远程仓库,其中远程仓库又分为中央仓库、公共仓库和私服

  • 本地仓库: 本地仓库存放着项目中所需jar文件
  • 中央仓库: Maven的中央仓库是由Maven社区提供存储jar文件的仓库
  • 公共仓库: 国内厂家提供的存储jar文件的仓库,比如:aliyun仓库
  • 私服: 由公司创建的存储jar文件的仓库,可在公司范围内共享,不对外开放

当项目中需要jar文件依赖时,会从仓库中查找获取,如果我们把所有仓库都配置好。maven在查找获取依赖的时候遵循一个依赖查找顺序,如下:(如果本地仓库找不到依赖就去私服下载,以此类推......)

依赖查找顺序: 本地仓库 - > 私服 - > 公共仓库 - > 中央仓库

image-20200616184606968

4.3 本地仓库

本地仓库: 本地目录中存放所需jar包,需修改settings配置文件来配置本地仓库

  • 使用过的依赖都会存储在本地仓库中,实现复用

4.4 远程仓库

4.4.1 中央仓库

中央仓库: Maven中央仓库是由Maven社区提供的仓库,不用任何配置,maven中内置了中央仓库地址。其中就包含绝大多数流行的开源Java构件

4.4.2 公共仓库

公共仓库: 第三方维护的jar文件仓库,比如阿里云提供的仓库。但是jar文件可能不如官方的中央仓库全,有时候也会找不到,所以如果项目构建不成功,可以更改镜像为官方的,下载完jar包再去改回来

  • aliyun仓库地址:http://maven.aliyun.com/nexus/content/groups/public/

  • 因为Maven社区提供的中央仓库在国外,国内使用下载依赖速度过慢,所以一般我们都配置国内的公共仓库来代替中央仓库

  • 使用时,需要在settings.xml配置文件中添加配置信息。打开settings.xml配置文件,找到<mirrors>标签,你也会发现这是一个空标签,最后标签内填写如下配置就OK!

<!--setting.xml中添加如下配置-->
    <mirror>
        <id>aliyun</id>  
        <!-- 中心仓库的 mirror(镜像) -->
        <mirrorOf>central</mirrorOf>    
        <name>Nexus aliyun</name>
        <!-- aliyun仓库地址 以后所有要指向中心仓库的请求,都会指向aliyun仓库-->
        <url>http://maven.aliyun.com/nexus/content/groups/public</url>  
    </mirror>

image-20200616223651045

4.4.3 私服

私服: 公司创建存储jar文件的仓库,只对公司范围共享,不对外开放。可以通过Nexus来创建、管理一个私服。

4.4.3.1 私服概念

  • 私服是架设在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构件。

  • 有了私服之后,当 Maven 需要下载依赖时,直接请求私服,私服上存在则下载到本地仓库;否则,私服请求外部的远程仓库,将构件下载到私服,再提供给本地仓库下载。

  • 私服可以解决在企业做开发时每次需要的jar包都要在中心仓库下载,且每次下载完只能被自己使用,不能被其他开发人员使用

  • 所谓私服就是一个服务器,但是不是本地层面的,是公司层面的,公司中所有的开发人员都在使用同一个私服

4.4.3.2 私服架构

我们可以使用专门的 Maven 仓库管理软件来搭建私服,比如:Apache ArchivaArtifactorySonatype Nexus。这里我们使用Sonatype Nexus

  • 我们可以在图中得到在无私服的情况下,我们都需要从远程仓库去获取jar文件并存储在本地仓库,由于中央仓库是国外的,所以下载速度比较慢等等原因,并存在很多缺点,比如我们公司内使用
  • 我们在图中可清晰的看到,如果有私服的话,我们需要从私服中,查找jar文件,如果私服没有该jar文件,就需要去中央仓库或公共仓库去下载,然后传到私服中,最后传入到自己的本地仓库进行使用。假设公司员工再一次使用到该jar文件,它会先从私服中找有没有这个jar文件,由于我们之前的员工已经将该jar文件存储到了私服中,所以就省去了其他员工调用远程仓库的步骤。并且私服是公司内部局域网类型的,下载速度会比远程仓库快出很多倍
无私服 有私服
私服1 私服2

4.4.3.3 Nexus安装(了解即可)

下载我们需要下载Zip解压包即可,将解压包解压到本地盘符中即可!

解压后,你会看到nexus目录为私服目录,sonatype-work目录中包含存储私服下载的依赖。

4.4.3.4 Nexus登录

访问私服:http://localhost:8081/nexus/

登录私服的账号为admin,密码为admin123

4.4.3.5 仓库列表

仓库类型 描述
group 包含多个仓库,通过group库的地址可以从包含的多个仓库中查找构件
hosted 私服 服务器本地的仓库,其中存储诸多构件
proxy 代理仓库,其会关联一个远程仓库, 比如中央仓库,aliyun仓库,向该仓库查找构件时,如果没有会从其关联的仓库中下载
仓库名 描述
Releases 存放项目的稳定发布版本,一个模块做完后如果需要共享给他人,可以上传到私服的该库
Snapshots 对应不稳定的发布版本
3rd party 存放中央仓库没有的 ,如ojdbc.jar,可以上传到私服的该库中
仓库列表
私服_list

4.4.3.6 仓库组

而此时就有问题,私服中有很多仓库,每个仓库都有自己的url,则项目中配置哪个仓库呢 ?

私服中有一个仓库组,组中包含多个仓库,可以指定仓库组的url,即可从多个仓库中获取构件

关于仓库的设置: 由于我们在使用私服的时候,本地仓库没有的jar文件,需要去私服找,私服没有的话,就去中央仓库找。所以我们需要把私服内的中央仓库换为阿里云仓库,这样可以保证我们国内的下载速度。

仓库组 注意:proxy的仓库排序在最后
私服_deploy2

4.4.3.7 手动上传仓库

4.4.3.8 Maven关联私服

配置settings.xml,设置私服地址、认证等信息(关联私服需要添加配置文件信息如下,找到父标签,添加子标签内容即可)

<servers>
    <server> 
        <id>nexus-public</id> <!-- nexus的认证id -->
        <username>admin</username> <!--nexus中的用户名密码-->
        <password>admin123</password> 
    </server>
</servers>
<profiles>
    <profile> 
        <id>nexus</id> 
        <repositories> 
            <repository> 
                <id>nexus-public</id> <!--nexus认证id 【此处的repository的id要和 <server>的id保持一致】-->
                <!--name随便-->
                <name>Nexus Release Snapshot Repository</name> 
                <!--地址是nexus中仓库组对应的地址-->
                <url>http://localhost:8081/nexus/content/groups/public/</url>
                <releases><enabled>true</enabled></releases> 
                <snapshots><enabled>true</enabled></snapshots> 
            </repository>
        </repositories> 
        <pluginRepositories> <!--插件仓库地址,各节点的含义和上面是一样的-->
            <pluginRepository> 
                <id>nexus-public</id> <!--nexus认证id 【此处的repository的id要和 <server>的id保持一致】-->
                <!--地址是nexus中仓库组对应的地址-->
                <url>http://localhost:8081/nexus/content/groups/public/</url>
                <releases><enabled>true</enabled></releases> 
                <snapshots><enabled>true</enabled></snapshots> 
            </pluginRepository> 
        </pluginRepositories> 
    </profile>
</profiles>
<activeProfiles>
    <activeProfile>yourjdk</activeProfile>
    <!-- 使私服配置生效 -->
    <activeProfile>nexus</activeProfile>
</activeProfiles>

4.4.3.9 Meven项目部署到私服

  • 执行mvn deploy指令即可将项目部署到私服对应的仓库中,此时项目中的打包方式多为jar
  • 但需要提前在项目的pom.xml中配置部署私服仓库位置,如下:

注意: 如上的 repository的 id 依然是要和settings.xml中配置的server中的id 一致,才能通过私服的认证

<project>
        ...
    <dependencies>
        .....
    </dependencies>
    
    <!-- 在项目的pom.xml中 配置私服的仓库地址,可以将项目打jar包部署到私服 -->
    <distributionManagement>
        <repository>
            <id>nexus-public</id> <!-- nexus认证id -->
            <url>http://localhost:8081/nexus/content/repositories/releases</url>
        </repository>
        <snapshotRepository>
            <id>nexus-public</id> <!-- nexus认证id -->
            <url>http://localhost:8081/nexus/content/repositories/snapshots</url>
        </snapshotRepository>
    </distributionManagement>
</project>
image
EchoEcho官方
无论前方如何,请不要后悔与我相遇。
1377
发布数
439
关注者
2223825
累计阅读

热门教程文档

Linux
51小节
Golang
23小节
C#
57小节
React Native
40小节
CSS
33小节