Nexus搭建maven私服

前言

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

下载安装

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

  2. 下载完成后解压得到两个文件夹,这里尤其注意的是不能解压在包含中文字符的目录下,否则启动会报一个无法打开日志文件的错误,一个安装目录一个work目录,进入安装目录、bin、jsw,选择和自己操作系统匹配的文件夹进入,我时安装在windows上的,进入windows_64x,可以看到有多个命令

    console-nexus.bat 以命令窗口的形式启动,关闭后服务停止

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

    stop-nexus.bat 停止服务

    uninstall-nexus.bat 卸载nexus

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

    nexus启动页

Nexus页面介绍

Repositories

​ 这个是nexus最核心的功能,在这里可以创建仓库,配置仓库属性

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:
是否允许重新部署,这在部署构件到远程仓库时需要开启

更新索引

  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后选项卡看到许多文件

部署构件到私服

就是把本项目上传到maven

需要在pom.xml中配置

1
2
3
4
5
6
7
8
9
10
11
12
<distributionManagement>
<repository>
<id>nexus</id>
<name>nexus</name>
<url>http://localhost:8081/nexus/content/repositories/nexus/</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<name>Nexus Snapshot Repository</name>
<url>http://192.168.7.101:8081/nexus/content/repositories/snapshots/</url>
</snapshotRepository>
</distributionManagement>
注意:
  1. 上传那么就要把Deployment Policy改为允许上传,这我踩了坑
  2. 上传稳定版还是就快照版是由你的项目的版本号决定的,千万记住别写错,没有s

手动上传jar到私服

先插播以下私服的概念和我们为什么要配私服:

1
2
3
4
私服就是类似于中转站,什么都从中央仓库下速度一般不会太快,而私服就是对于自己有的先从自己这里拿,
没有的话就从远程仓库获取存储在私服,然后提供给我们,它的好处在于提高了下载速度还有安全性,
我现在公司就是一个局域网中的局域网,开发需要jar包怎么办?
就从私服下,私服连接外网下载,我们从私服取。

有些jar远程仓库没有怎么办?没关系可以自己手动上传到私服:

  • 选中仓库
  • 选择Artifact Upload上传至仓库空间

配置规则

仓库

上面说到了我们一般都从私服取依赖,所以在我们的pom.xml中就需要配置上私服的仓库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!-- 配置远程仓库 -->
    <repositories>
        <repository>
            <id>jboss</id>
            <name>JBoss Repository</name>
            <url>http://repository.jboss.com/maven2/</url>
            <releases>
                <enabled>true</enabled>
                <updatePolicy>daily</updatePolicy>
            </releases>
            <snapshots>
                <enabled>false</enabled>
                <checksumPolicy>warn</checksumPolicy>
            </snapshots>
            <layout>default</layout>
        </repository>
    </repositories>

有些属性还是要介绍下的

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中,因为其他人不可见,还有一些公司对于外网的访问时必须要通过代理的方式的,这样下载依赖也需要配置代理

这是我的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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<?xml version="1.0" encoding="UTF-8"?>

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">

<localRepository>D:\Maven\repositor_test</localRepository>


<pluginGroups>

</pluginGroups>

<!-- 使用基于HTTP代理的方式访问外部资源,声明了多个proxy元素,则默认情况下第一个被激活的proxy会生效 -->
<proxies>
<!-- id为代理名,ctive的值为true表示激活该代理,protocol表示使用的代理协议,一般是http
代理设置了认证就需要配上username,password,最重要的时host和端口,nonProxyHosts指定了不适用代理的主机 -->
<!-- <proxy>
<id>optional</id>
<active>true</active>
<protocol>http</protocol>
<username>proxyuser</username>
<password>proxypass</password>
<host>proxy.host.net</host>
<port>80</port>
<nonProxyHosts>local.net|some.host.com</nonProxyHosts>
</proxy> -->
</proxies>

<!-- 为访问的远程仓库添加认证信息-->
<servers>
<!-- id为仓库名,另外时用户名和密码 -->
<server>
<id>releases</id>
<userName>admin</userName>
<password>admin123</password>
</server>
<server>
<id>snapshots</id>
<username>admin</username>
<password>admin123</password>
</server>
</servers>


<mirrors>
<mirror>
<id>nexus</id>
<mirrorOf>*</mirrorOf>
<url>http://192.168.0.33:8081/repository/maven-public/</url>
</mirror>
</mirrors>
<profiles>
</profiles>
</settings>

着重说一下镜像,镜像有点像代理,如果A是B的镜像,并且有了相关配置,那么所有对B的请求都会被镜像A接受

mirrorOf配置规则

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

私服搭建

说了这么多其实私服并不用配置这么多东西,但是使用私服这些都是用到的,现在说下步骤

  1. 更新索引后,需要配置认证信息配置认证信息
  2. 在settings.xml中配置上镜像,屏蔽所有仓库,一般这么干
  3. 使用的时候在pom.xml中配上仓库就可以了

相关

  1. 持续集成-Sonatype Nexus安装
  2. Maven入门,读完这篇就够了