一、基本介绍

1、如果没有搭建私服会有什么问题?

  • 如果没有私服,我们所需的所有构件都需要通过 Maven 的中央仓库或者第三方的 Maven 仓库下载到本地,而一个团队中的所有人都重复的从 Maven 仓库下载构件无疑加大了仓库的负载和浪费了外网带宽,如果网速慢的话,还会影响项目的进程。
  • 另外,很多情况下项目的开发都是在内网进行的,可能根本连接不了 Maven 的中央仓库和第三方的 Maven 仓库。
  • 我们开发的公共构件如果需要提供给其它项目使用,也需要搭建私服。

2、搭建私服的优点

Maven 私服的概念就是在本地架设一个 Maven 仓库服务器,在代理远程仓库的同时维护本地仓库。当我们需要下载一些构件(artifact)时,如果本地仓库没有,再去私服下载,私服没有,再去中央仓库下载。这样做会有如下一些优点:

  • 减少网络带宽流量
  • 加速 Maven 构建
  • 部署第三方构件
  • 提高稳定性、增强控制
  • 降低中央仓库的负载

3、Nexus 介绍

Nexus 是一个专门的 Maven 仓库管理软件,它不仅能搭建 Maven 私服,还具备如下一些优点使其日趋成为最流行的 Maven 仓库管理器:

  • 提供了强大的仓库管理功能,构件搜索功能
  • 它基于 REST,友好的 UI 是一个 ext.js 的 REST 客户端
  • 它占用较少的内存
  • 基于简单文件系统而非数据库

二、Nexus 服务的安装

使用 Docker 镜像进行安装

(1)首先执行如下命令下载 Nexus3 镜像:

docker pull sonatype/nexus3

(2)接着执行如下命令,创建宿主机挂载目录:

mkdir -p /data/nexus-data

(3)最后执行如下命令运行 Nexus3 容器即可:

mkdir /data/nexus-data && chmod -R 777 /data/nexus-data
docker run -d --restart=always -p 8081:8081 --name nexus -v /data/nexus-data:/nexus-data sonatype/nexus3

(4)同样不要忘记执行如下命令开放 8081 端口:

firewall-cmd --permanent --add-port=8081/tcp
firewall-cmd --reload

三、Nexus 服务的配置

(1)Nexus 服务启动以后,我们使用浏览器访问 [http://服务器ip:8081/,点击右上角登录按钮:]

(2)首次登录会提示密码保存在 /usr/local/sonatype-work/nexus3/admin.password 文件中,我们查看服务器上这个文件内容,然后作为密码登录:(我们的密码保存在/data/nexus-data/admin.password)

(3)登录后会让我们设置新的密码:

(4)登录后的界面如下:

(1)默认仓库说明

  • maven-central:maven 中央库,默认从 [repo1.maven.org/maven2/ 拉取]
  • maven-releases:私库发行版 jar,初次安装请将 Deployment policy 设置为 Allow redeploy
  • maven-snapshots:私库快照(调试版本)jar
  • maven-public:仓库分组,把上面三个仓库组合在一起对外提供服务,在本地 maven 基础配置 settings.xml 或项目 pom.xml 中使用

(2)仓库类型说明:

  • group:这是一个仓库聚合的概念,用户仓库地址选择 Group 的地址,即可访问 Group 中配置的,用于方便开发人员自己设定的仓库。maven-public 就是一个 Group 类型的仓库,内部设置了多个仓库,访问顺序取决于配置顺序,3.x 默认为 Releases、Snapshots、Central,当然你也可以自己设置。
  • hosted:私有仓库,内部项目的发布仓库,专门用来存储我们自己生成的 jar 文件
  • snapshots:本地项目的快照仓库
  • releases: 本地项目发布的正式版本
  • proxy:代理类型,从远程中央仓库中寻找数据的仓库(可以点击对应的仓库的 Configuration 页签下 Remote Storage 属性的值即被代理的远程仓库的路径),如可配置阿里云 maven 仓库
  • central:中央仓库

四、配置阿里云公共仓库

Nexus的maven-group的默认查找方式为:maven-releases –> maven-snapshots –> maven-central,我们在中间再加一个阿里云仓库,加快访问速度。

选择proxy类型

信息填写如下

仓库名字:maven-aliyun
阿里云远程maven仓库地址:http://maven.aliyun.com/nexus/content/groups/public/
其他选项:默认即可

修改maven-public中的仓库引用及顺序:

至此,配置完毕!我们在maven使用maven-public仓库地址的时候,会按照如下顺序访问:本地仓库 –> 私服maven-releases –> 私服maven-snapshots –> 远程阿里云maven仓库 –> 远程中央仓库。

五、在项目中使用Nexus私服

1. 概述

让 Maven 项目使用 Nexus 作为远程仓库有两种方式。

  • 单个项目:在项目的 pom.xml 中进行更改,让单个项目使用 Nexus 仓库;
  • 所有项目:通过修改 Maven的 配置文件 settings.xm l进行更改,让所有项目都使用 Nexus仓库;

2. 单个项目配置

在项目的 pom.xml 文件的 dependencies 标签之前添加

<repositories>
      <repository>
          <id>nexus3</id>
          <name>nexus3</name>
          <!-- 注意:这里是 Nexus 服务上的仓库地址 -->
          <url>http://127.0.0.1:8081/repository/maven-public/</url>
          <!-- Release版本则代表稳定的版本 -->
          <releases>
              <enabled>true</enabled>
          </releases>
          <!-- Snapshot版本代表不稳定、尚处于开发中的版本,默认关闭,需要手动启动 -->
          <snapshots>
              <enabled>true</enabled>
          </snapshots>
      </repository>
  </repositories>

  <!-- 指定插件仓库 -->
  <pluginRepositories>
      <pluginRepository>
          <id>nexus</id>
          <name>nexus</name>
          <url>http://127.0.0.1:8081/repository/maven-public/</url>
          <releases>
              <enabled>true</enabled>
          </releases>
          <snapshots>
              <enabled>true</enabled>
          </snapshots>
      </pluginRepository>
  </pluginRepositories>

仓库地址的获取方式如下

http://127.0.0.1:8081/repository/maven-public/

点开上图的仓库

比如在项目中添加 junit 依赖,可以看到下载的连接是本地的 Nexus 服务的地址

同样,可以在 Nexus 服务看到 Junit 已经下载下来。

3. 所有项目

在 Maven 安装目录找到如下文件

C:\devtools\maven-3.5.0\conf\settings.xml

编辑settings.xml文件

  • profiles节点添加如下内容
<profile>    
    <!--profile 的 id-->
    <id>dev</id>    
   <repositories>    
      <repository>  
           <!--仓库 id,repositories 可以配置多个仓库,保证 id 不重复-->
          <id>nexus</id>    
          <!--仓库地址,即 nexus 仓库组的地址-->
          <url>http://127.0.0.1:8081/repository/maven-public/</url>    
          <!--是否下载 releases 构件-->
          <releases>    
                <enabled>true</enabled>    
          </releases>    
          <!--是否下载 snapshots 构件-->
          <snapshots>    
               <enabled>true</enabled>    
          </snapshots>    
      </repository>    
  </repositories>  
    <pluginRepositories>  
         <!-- 插件仓库,maven 的运行依赖插件,也需要从私服下载插件 -->
         <pluginRepository>  
             <!-- 插件仓库的 id 不允许重复,如果重复后边配置会覆盖前边 -->
             <id>public</id>  
             <name>Public Repositories</name>  
             <url>http://127.0.0.1:8081/repository/maven-public/</url>  
        </pluginRepository>  
   </pluginRepositories>  
</profile>
  • 打开activeProfiles节点注释,添加如下内容
<activeProfiles>
    <activeProfile>dev</activeProfile>
</activeProfiles>

比如在项目中添加 log4j 依赖,可以看到下载的连接是本地的 Nexus 服务的地址

同样,可以在 Nexus 服务看到 log4j 已经下载下来。