Nexus搭建maven私服

前言

使用nexus2.14版本搭建maven私服,中间踩了一些坑,记录下来,nexus3.x 版本和nexus差别还是不小的,尤其是索引的更新。

2019-04-15更新,看完《maven实战》后修改

私服的概念和我们为什么要配私服

什么是私服

私服可以看作是一个仓库,项目开发时总是要需要构件的,配置在局域网内的私服可以让局域网内所有用户请求构件,而不必频繁的访问中央仓库(众所周知,maven中央仓库的速度),升值有些开发环境时不允许开发人员连接外网的,那么开发人员的唯一远程仓库就是私服,私服从外部下载构件

为什么配私服

出了上述的原因之外,私服更有协议maven中央仓库没有的优势,比如开发人员可以将项目打包部署到私服,供其他人员使用,一些小众的jar包可以手动上传至私服
总的来说,一般大一些的项目都会配置

下载安装

  1. 下载nexus2.14版本,下载链接:nexus2.14下载

  2. 下载完成后解压得到两个文件夹,一个安装目录一个work目录,进入安装目录、bin、jsw,选择和自己操作系统匹配的文件夹进入

    注意:

    这里尤其注意的是不能解压在包含中文字符的目录下,否则启动会报一个无法打开日志文件的错误!!!

我安装在windows上的,进入windows_64x,可以看到有多个命令,介绍如下

1
2
3
4
5
6
7
console-nexus.bat  以命令窗口的形式启动,关闭后服务停止

install-nexus.bat 设置开机启动,在服务中可以看成到该服务为开机自动启动

stop-nexus.bat 停止服务

uninstall-nexus.bat 卸载nexus

  1. 双击启动nexus,打开游览器输入http://192.168.88.16:8081/nexus/,出现以下页面表示启动成功

    nexus启动页
    至此nexus安装启动成功

Nexus页面介绍

Repositories

这个是nexus最核心的功能,在这里可以创建仓库,配置仓库属性
![]https://blog-1258374330.cos.ap-shanghai.myqcloud.com/%E5%8D%9A%E5%AE%A2/nexus%E6%90%AD%E5%BB%BAmaven%E7%A7%81%E6%9C%8D/Snipaste_2019-04-15_14-48-11.png)

仓库介绍

可以看到仓库一般分为三种,hosted宿主仓库,proxy代理仓库以及virtural的虚拟仓库,所谓宿主将库,就是用于将构件上传至maven私服的仓库,一般我们配置上releases和snapshots两个,而代理仓库就是用于下载外部构件的远程库,aliyun镜像仓库就是一个代理仓库,virtural的虚拟仓库仅仅是逻辑上的仓库,他可能两个仓库合并

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
介绍一下仓库的属性:
Type:
group(仓库组):组合各个仓库一同向外提供服务
hosted(宿主):用于发布内部项目构件或第三方的项目构件,还有私服的配置
proxy(代理):代理远程仓库
virtual(虚拟):
ID:
唯一标识
Name:
解释说明
Provider:
一般都用Maven2
Repository Policy:
Snapshot:快照
Release:稳定
Deployment Policy:
是否允许重新部署,这在部署构件到远程仓库时需要开启

更新索引

注意
更新索引的意义仅仅在于搜索而已,事实上我们不更新索引也是没关系的,只要下载了相关jar包,点击rebuild index就可以将已下载的jar包索引构建完毕,

  1. 登录

    管理员账号登录,用户名admin,密码admin123

  2. 更新索引

    一般我们初次启动nexus时,center仓库是空的,而索引可以看作是压缩版的jar包集合,让我们可以从本地的远程库中拉取依赖,可以在configuration中配置索引的自动更新,但是这样下载速度奇慢无比,而且容易卡死,这在scheduled task可以看到update index一直处于running状态,这里比较推荐手动更新,网上的步骤说的都很详细

    1. 下载相关文件

      三个文件,分别是nexus-maven-repository-index.gz,nexus-maven-repository-index.properties以及ndexer-cli-5.1.1.jar,这在我的百度网盘中都保存了,下载链接:

    2. 解压索引文件

      三个文件放到同一目录下,执行:java -jar indexer-cli-5.1.1.jar -u nexus-maven-repository-index.gz -d indexer

    3. 解压完毕后把indexer文件夹里面的文件拷贝到{nexus-home}/sonatype-work/nexus/indexer/central-ctx目录下,重新启动nexus

    4. 当我们更新索引成功后,可以在Browse Index后选项卡看到许多文件

搭建私服仓库

我们先建立一个aliyun的代理仓库,id为aliyun,仓库地址为 阿里云仓库;在配置两个hosted宿主仓库用以发布构件到maven私服,版本分别为snapshots和releases,deployment属性为allow允许部署;再新建一个仓库组将这些都加入,包括中央仓库,调整它的顺序,它的顺序就是maven依赖选择下载的顺序,一般我们将阿里云的代理仓库置于中央仓库之上

注意:
上传那么就要把Deployment Policy改为允许上传

私服仓库配置

添加仓库为私服仓库

这里既可以配置在settings.xml中,也可以配置pom.xml中
一般建议写在setting.xml之中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<!-- 定义一些属性配置 -->
<profiles>
<profile>
<id>nexus-profile</id>
<repositorys>
<repository>
<id>nexus</id>
<url>http://localhost:8081/repository/nexus/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositorys>

<pluginRepositories>
<pluginRepository>
<id>nexus</id>
<url>http://localhost:8081/repository/nexus/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<!-- 激活 -->
<activeProfiles>
<activeProfile>nexus-profile</activeProfile>
</activeProfiles>

写在pom.xml之中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
    <repositories>
        <repository>
            <id>film-group</id>
            <url>http://localhost:8081/repository/film-group/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
    </repositories>
  
    <pluginRepositories>
        <pluginRepository>
            <id>film-group</id>
            <url>http://localhost:8081/repository/film-group/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </pluginRepository>
    </pluginRepositories>

仓库标签下有些属性还是要介绍下的

1
2
3
4
5
6
7
8
9
10
11
12
id:仓库声明的唯一id,尤其需要注意的是,Maven自带的中央仓库使用的id为central,
如果其他仓库声明也使用该id,就会覆盖中央仓库的配置
name:仓库的名称,让我们直观方便的知道仓库是哪个
url:指向了仓库的地址,一般来说,该地址都基于http协议,
Maven用户都可以在浏览器中打开仓库地址浏览构件。
releases和snapshots:用来控制Maven对于发布版构件和快照版构件的下载权限。
需要注意的是enabled子元素,该例中releases的enabled值为true,
表示开启JBoss仓库的发布版本下载支持,而snapshots的enabled值为false,
表示关闭JBoss仓库的快照版本的下载支持。根据该配置,
Maven只会从JBoss仓库下载发布版的构件,而不会下载快照版的构件。
layout:元素值default表示仓库的布局是Maven2及Maven3的默认布局,
而不是Maven1的布局。基本不会用到Maven1的布局

至此,大部分请求会请求苏福,但是想要屏蔽所有请求到私服的话,还需要配置镜像

先配置镜像用以屏蔽所有仓库的请求,转至私服

在settings.xml中,配置如下:

1
2
3
4
5
6
7
8
  <mirrors>
     <mirror>
       <id>nexus</id>  
          <name>nexus</name>  
          <url>http://localhost:8081/repository/nexus/</url>;  
          <mirrorOf>*</mirrorOf> 
     </mirror>
  </mirrors>

mirrorOf配置规则

1
2
3
4
<mirrorOf>*<mirrorOf>:匹配所有远程仓库。
<mirrorOf>external:*<mirrorOf>:匹配所有远程仓库,使用localhost的除外,使用file://协议的除外。也就是说,匹配所有不在本机上的远程仓库。
<mirrorOf>repo1,repo2<mirrorOf>:匹配仓库repo1h和repo2,使用逗号分隔多个远程仓库。
<mirrorOf>*,!repo1<mirrorOf>:匹配所有远程仓库,repo1除外,使用感叹号将仓库从匹配中排除。
配置仓库为私服仓库

这里已经可以完成构件使用的功能了,想要上传构建需要继续配置

部署构件到私服

就是把本项目上传到maven

  1. pom.xml中配置构件上传的地址

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        <distributionManagement>
            <repository>
                <id>film-releases</id>
                <name>nexus_repository</name>
                <url>http://localhost:8081/repository/film-releases/</url>
            </repository>
            <snapshotRepository>
                <id>film-snapshots</id>
                <name>nexus_repository</name>
                <url>http://localhost:8081/repository/film-snapshots/</url>
            </snapshotRepository>
        </distributionManagement>
  2. 在settings.xml中配置认证信息

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
      <servers>
        <server>
          <id>film-releases</id>
          <username>admin</username>
          <password>admin123</password>
        </server>
        <server>
          <id>film-snapshots</id>
          <username>admin</username>
          <password>admin123</password>
        </server>
      </servers>

更多

搭建私服的过程和使用的基本配置介绍完毕
更多的权限的细节控制,定时任务的执行,还有maven的一些基础只是就不必介绍了

相关

  1. 《maven实战》
  2. 持续集成-Sonatype Nexus安装
  3. Maven入门,读完这篇就够了