教你如何搭建私服、管理系统模块

  • 1. 前言
  • 2. 安装Nexus私服
  • 3. Nexus私服介绍
  • 4. setting配置私服
  • 4.1. 配置mirror
  • 4.2. 配置访问凭证
  • 4.3 配置profile中的repository
  • 5. deploy发布版本
  • 6. 常见问题
  • 6.1 快照版本下载不了
  • 6.2 更新了jar,但是使用者没有拉取到最新的


1. 前言

系统最开始的时候由一个单体应用慢慢拆分成微服务,并且抽取成一些共同的模块,组装成jar进行管理,如果没有私服的时候则无法做好版本管理、团队间使用也会很不方便。因此需要在系统搭建maven私服,将共同模块上传到私服,将发布好的版本上传到私服进行管理。

我们在编写springboot项目的时候会使用到maven,maven是用来管理仓库jar的工具,可以通过maven下载到我们需要的jar,同时我们编写的服务也可以通过maven给其他系统使用。

nexus是maven私服的管理工具,部署私服就是部署nexus。

2. 安装Nexus私服

参见:nexus部署

3. Nexus私服介绍

打开nexus主页面是下面所示:

Maven settings配置不连外网 maven的setting文件配置_spring


主页面主要是可以查看私服上面下载过的jar,也可以手动上传第三方私服。点开browse可以看到如下所示:

Maven settings配置不连外网 maven的setting文件配置_jar_02


nexus将版本的种类可以分成如下三种

  1. maven-central : 中心库的jar(阿里云的、maven中心仓库)
  2. maven-release:发布版本
  3. maven-snapshots:快照版本

在这里我们可以看到有一个maven-public共同仓库,常见这个仓库是一个仓库组,包括了以上三组的仓库数据。也就是说我们对外提供了一个maven-public,就可以查询到对应以上三种的库存数据。

4. setting配置私服

以下配置可以在单个项目中进行配置,但可以在setting文件进行配置,生效范围不一致。

4.1. 配置mirror

<mirror>
          <!--该镜像的唯一标识符。id用来区分不同的mirror元素。 -->
          <id>public</id>
          <!--镜像名称 -->
          <name>maven-public</name>
          <!--*指的是访问任何仓库都使用我们的私服-->
          <mirrorOf>*</mirrorOf>
          <!--该镜像的URL。构建系统会优先考虑使用该URL,而非使用默认的服务器URL。 -->
          <url>http://xxxxxxxx:6081/repository/maven-public/</url>
      </mirror>

4.2. 配置访问凭证

<server>
          <id>public</id>
          <username>admin</username>
          <password>xxx</password>
      </server>
  <server>
        <id>releases</id>
        <username>admin</username>
        <password>xxx</password>
    </server>
    <server>
        <id>snapshots</id>
        <username>admin</username>
        <password>xxx</password>
    </server>

4.3 配置profile中的repository

首先介绍profile,在setting有一个二级节点就是profile,类似springboot中的yml的active配置,比如开发环境,可以将profile切换成dev。

Maven settings配置不连外网 maven的setting文件配置_jar_03


在profile里面我们可以配置repository,也就是仓库地址,按正常的maven下载依赖的顺序,首先先使用本地仓库,再去配置的repository进行下载,mirror是仓库的镜像,也就是说repository请求地址会被mirror镜像给替代了,当然仓库地址可以配置多个,那么mirror也有对应的映射参数。

<!--*指的是访问任何仓库都使用我们的私服-->
  <mirrorOf>*</mirrorOf>

比如我们配置了

<profile>
              <id>nexus</id>
              <repositories>
                  <repository>
                      <id>public</id>
                      <name>maven-public</name>
                      <url>http://ccc:6081/repository/maven-public/</url>
                      <releases>
                          <enabled>true</enabled>
                      </releases>
                      <snapshots>
                          <enabled>true</enabled>
                          <updatePolicy>always</updatePolicy>
                      </snapshots>
                  </repository>
              </repositories>
              </profile>

这里的ccc url也会被镜像成mirror指定的url。

默认如果单纯配置了mirror,而不配置仓库的话,snapshots版本是下载不了的,需要在仓库配置定义enabled

<releases>
                          <enabled>true</enabled>
                      </releases>
                      <snapshots>
                          <enabled>true</enabled>
                          <updatePolicy>always</updatePolicy>
                      </snapshots>

updatePolicy 表示更新策略,默认从远程仓库拉取了jar,那么jar就放在本地仓库了,如果有人更新了对应快照版本,本地仓库有那么就不会重新去拉取,但是配置了updatePolicy:always则每次都是会去拉取。

5. deploy发布版本

在pom配置如下

<!--上传到私服-->
    <distributionManagement>
        <repository>
            <id>releases</id>
            <name>Releases</name>
            <url>http://xx:6081/repository/maven-releases/</url>
        </repository>
        <snapshotRepository>
            <id>snapshots</id>
            <name>Snapshot</name>
            <url>http://xx:6081/repository/maven-snapshots/</url>
        </snapshotRepository>
    </distributionManagement>

需要在setting中servers指定对应id的访问凭证

6. 常见问题

6.1 快照版本下载不了

没有配置repository

6.2 更新了jar,但是使用者没有拉取到最新的

  1. 发布版本默认不会去重新拉取
  2. 快照版本如果没有配置updatePolicy也不会去拉取
    将本地仓库的jar删除,重新拉取一次