首页 > 技术文章 > Maven工具学习(十)----使用Nexus3搭建Maven私服

tanghaorong 2020-07-06 22:36 原文

1、私服的介绍

私服指的就是私有服务器,是架设在局域网的一种特殊的远程仓库,但搭建私服的服务器可以访问外网,目的是代理远程仓库及部署第三方构建。有了私服之后,当开发人员需要使用Maven下载构件时,本地仓库会直接请求私服,私服上存在则下载到本地仓库,否则私服请求外部的远程仓库,将构件下载到私服,再提供给本地仓库下载,当然本地仓库也可以上传架构到私服供其他开发人员下载使用。

image

现在市面上有3种专门的maven仓库管理软件可以用来帮助我们搭建私服,分别是:

  1. Apache基金会的archiva:http://archiva.apache.org/
  2. JFrog的Artifactory:https://www.jfrogchina.com/
  3. Sonatype的Nexus:https://www.sonatype.com/

这些都是开源的私服软件,有免费的版本,也有收费的版本。而用的最多的是第三种Nexus,所以本文我们主要以这个来讲解,其他2种有兴趣的朋友可以去研究一下。

2、nexus介绍

Nexus是一个强大的Maven仓库管理器,它极大地简化了本地内部仓库的维护和外部仓库的访问。

如果使用了公共的Maven仓库服务器,可以从Maven中央仓库下载所需要的构件(Artifact),但这通常不是一个好的做法。

正常做法是在本地架设一个Maven仓库服务器,即利用Nexus私服可以只在一个地方就能够完全控制访问和部署在你所维护仓库中的每个Artifact。

Nexus在代理远程仓库的同时维护本地仓库,以降低中央仓库的负荷,节省外网带宽和时间,Nexus私服就可以满足这样的需要。

Nexus是一套“开箱即用”的系统不需要数据库,它使用文件系统加Lucene来组织数据。

Nexus使用ExtJS来开发界面,利用Restlet来提供完整的REST APIs,通过m2eclipse与Eclipse集成使用。

Nexus支持WebDAV与LDAP安全身份认证。

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

3、为什么使用nexus

我们平时自己在开发的时候,都是通过maven的中央仓库或者是第三方远程仓库下载的jar,对于一个人来说要求不多。但如果是公司合作开发一个项目,而这个项目可能需要几十甚至上百人,那么整个团队中的每个人都从远程仓库中把需要依赖的jar下载到本地仓库,这不仅对公司的宽带来说要求比较高,而且重复的从maven仓库下载jar无疑加大了仓库的负载和浪费了外网带宽,如果网速慢的话,还会影响项目的进程。并且大部分公司为了保护数据安全,都会限制访问外网,所以项目组大部分人员是不能访问maven的中央存储库和其它远程仓库,那么开发人员又要从仓库下载jar包怎么办呢?此时公司一般都会搭建只限内网能够访问maven私服,然后把maven私服串联到一台有外网权限的机器,这样既节省了网络带宽也会加速项目搭建的进程,而且私服照样可以联通中央仓库和其它仓库。

4、nexus的优点

所以通过上面的分析总结出使用私服的好处有:

  • 节省外网带宽。
  • 加速Maven构建。
  • 部署第三方构件。
  • 提高稳定性,增强控制。
  • 降低中央仓库的负荷。
  • 控制和审计
  • 建立本地内部公用仓库

5、nexus的下载

前提:nexus是基于Java开发的,所以安装系统一定要配置好JDK。

官方网站:https://www.sonatype.com/

下载的网站:https://www.sonatype.com/nexus-repository-oss

好像现在国内已经访问不了这个网站了,反正我是FQ出去在官网下载的。

如果你翻不了墙,我这里也提供了百度网盘的链接:

链接:https://pan.baidu.com/s/1e66PEnIxROPjk3KZcur1sA    提取码:av8h

①、下载网站打开之后如下图。

image

②、然后填写邮箱(随便填写一下即可)。

image

③、下载你要哪个操作系统的NEXUS。

image

之后等待系统响应会弹出下载页面(网不好可能等的久一点)。下载之后的到一个压缩包。下面我们安装nexus。

6、win系统中安装nexus

①、首先我们解压下载的nexus压缩包,解压之后会产生两个文件目录nexus-3.24.0-02nexus-3.19.1-01和sonatyp-work。

image

 

②、启动nexus。在解压的nexus文件的bin目录下输入cmd。

GIF 2020-6-28 22-26-22

③、然后再输入nexus.exe /run运行。

GIF 2020-6-28 22-28-36

等待系统运行完成后,我们在浏览器访问:

http://localhost:8081/

注意:如果nexus在启动时出现了下面的异常请忽略掉它,这是编码问题 不影响使用。

java.io.UnsupportedEncodingException: Encoding GBK is not supported yet (feel free to submit a patch)

浏览器输入地址访问后页面是这样的则表示nexus成功启动了。(如果端口冲突,它的默认端口配置在etc/nexus-default.properties文件里自行修改)

image

因为nexus是使用java开发的web项目,并且内置了jetty web容器,所以可以直接在浏览器中运行。

7、nexus的登录

上面全都完成之后,我们还要登录才能使用nexus,点击上图右上角的Sign in,输入用户名和密码。

nexus默认用户名是admin,但是密码已经不是admin123了。网上大部分是以前的版本了,默认的登录账号为admin;登录密码为admin123。但是新版本已经不是了。

image604e41c7587418e913beaa0b8a17107d[4]

nexus新版本的密码是第一次启动的时候生成的,密码位于下面的文件中,我们有软件打开便可获取。

安装目录/sonatype-work/nexus3/admin.password

image

①、登录成功后会弹出一些设置,如下:

image

点击Next,设置新的登录密码(新密码要保存好),如下:

image

②、设置是否匿名访问,这个最好允许,否则访问很麻烦。

image

③、然后点击Next->Finish完成设置。

image

这样nexus的登录就完成了。如果要停止nexus的话,在启动的cmd窗口中按:Ctrl+C即可停止。

8、nexus的仓库类型

我们在登录nexus之后,点击【工具——>Repositories】。

image

可以发现Nexus仓库类型分为以下3个:

  • proxy(代理仓库):用来代理远程的公共仓库,默认是从远程中央仓库中寻找数据的仓库。它负责代理包
  • hosted(宿主仓库):用来部署我们自己项目打包的构建,供内部人员下载。它负责上传包
  • group(仓库组):用来合并多个hosted/proxy仓库,都加入到“maven-public”仓库组中,下载时按配置顺序从中依次查找。它负责提供包

 

①、proxy仓库

代理仓库是用来代理第三方公共的远程仓库,默认是从远程中央仓库中寻找数据的仓库,我们也可以通过代理仓库代理其它的maven仓库,如阿里的maven仓库等。当用户本地仓库没有构建时,就会在私服中查找,如果私服还没有,则通过被代理的仓库中下载构建,然后下载缓存在私服中供大家使用,这样的优势只要其中一个人从远程库下来了,以后大家都是从Nexus私服上进行下来,私服一般部署在内网,这样可以大大节约的宽带。

由于国内基本上都用的是阿里云的仓库,所以接下来我们在nexus中创建一个阿里云的maven代理仓库,来看下过程如下:

1)、在Repositories列表中点击【Create repository】,如下图:

image

2)、进入添加页面,我们要选择的是【maven2(proxy)】,它表示的是maven代理仓库,如下图:

image

3)、然后填写仓库名称、仓库类型、仓库代理地址,如下:

  • 仓库名称:maven-aliyun
  • 仓库类型:Release
  • 代理地址:https://maven.aliyun.com/nexus/content/groups/public/

image

4)、最后点击底部的【Create repository】创建完成,如下图:

image

 

②、hosted仓库

宿主仓库用来部署我们自己项目打包的构建,主要是给我们的内部人员下载使用。我们可以将自己开发好的构建发布到宿主仓库中供其他开发人员使用。

nexus默认义了2个宿主仓库,分别是maven-releases, maven-snapshots。

  1. maven-releases:这里存放我们自己项目中发布的构建, 通常是Release版本,即发布的版本。
  2. maven-snapshots:这个仓库非常的有用, 它的目的是让我们可以发布那些Snapshots版本, 即不稳定,还需要测试的版本。

hosted仓库的创建和proxy仓库是一致的,具体步骤和上面基本一致。如下:

image

image

 在创建的时候要注意Deployment Pollcy要改成“Allow redeploy”。

image

然后点击底部的【Create repository】创建完成。

 

③、group仓库

仓库组主要是将proxy仓库和hosted仓库合并,它可以合并多个proxy仓库和hosted仓库,所以当maven用户访问访问一个仓库组的时候,就可以间接的访问这个组内所有的仓库,而仓库组中多个仓库是有顺序的,当maven用户从仓库组下载构件时,仓库组会按顺序依次在组内的仓库中查找组件,查找到了立即返回给本地仓库,所以一般情况我们会将速度快的放在前面。仓库组内部实际上是没有构件内容的,他只是起到一个请求转发的作用,将maven用户下载构件的请求转发给组内的其他仓库处理。

下面我们将之前创建的maven-aliyun代理仓库和maven-test宿主仓库进入到仓库组,如下:

1)、首先打开maven-public,如下:

image

2)、把名称为maven-aliyun和maven-test的拖过去或者选中然后点击 > 按钮,同时也可以发现右边的成员已经默认添加了三个,分别是宿主仓库的两个(maven-releases、maven-snapshots)和代理仓库(maven-central)。

image

3)、由于阿里云的仓库在国内下载速度很快,所以我们把它放在中央仓库的前面。

image

最后点击Save保存即可。

9、配置maven从nexus下载构建

配置maven从nexus下载构建有两种方式:①、pom.xml方式。②、镜像方式。

①、pom.xml方式

1)、首先我们创建一个maven项目,并且修改该项目的pom.xml文件,加入如下内容:

<repositories>
    <repository>
        <id>maven-nexus</id>
        <url>http://localhost:8081/repository/maven-public/</url>
        <releases>
            <enabled>true</enabled>
        </releases>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
    </repository>
</repositories>

注意:url地址对应到nexus上的哪个仓库组,因为只有仓库组提供包,我们可以在nexus上面复制地址,如下:

image

2)、因为nexus是需要用户名和密码才能访问,所以在maven的setting.xml中添加如下配置(大概在125行左右),我们最好先备份一份原始的setting.xml文件。

<server>
  <id>maven-nexus</id>
  <username>admin</username>
  <password>123456</password>
</server>

注意:上面<id>元素的值和pom.xml中的<id>值必须一致。 <server>元素中的username和password根据自己去设置,我这里密码设置的是123456。

3)、例如我们要下载jdbc的mysql连接驱动的jar包,首先确保本地仓库是没有的,否则会从本地仓库拿,如果有先删除。

<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
 <dependency>
     <groupId>mysql</groupId>
     <artifactId>mysql-connector-java</artifactId>
     <version>8.0.16</version>
 </dependency>

image

4)、然后我们编译项目:mvn compile ,执行结果如下:

image

从运行结果可以发现mysql驱动的jar包从maven-nexus中下载了,下载地址正是我们nexus私服中的那个地址。

 

②、镜像方式

以上面创建的那个maven项目为例。

1)、修改maven的setting.xml文件,加入如下配置(大概在163行):

<mirror>
	<id>mirror-nexus</id>
	<name>nexus-mirror</name>
	<url>http://localhost:8081/repository/maven-public/</url>
	<mirrorOf>*</mirrorOf>
</mirror>

注意:上面mirrorOF配置的*,说明所有远程仓库都通过该镜像下载构件。

 

2)、登录的用户名和密码配置不变(id改了一下):

<server>
  <id>mirror-nexus</id>
  <username>admin</username>
  <password>123456</password>
</server>

id元素与上面setting.xml中配置的id同样必须相同。

 

3)、下载jdbc的mysql连接驱动的jar包,记得删除本地仓库的jar包。

image

 

4)、编译项目:mvn compile ,执行结果如下:

image

可以发现同样是从mirror-nexus中下载的jar。

10、配置本地构建上传至nexus

nexus配置部署有两种方式:①、maven上传。②、手动上传。

①、maven上传

我们知道,nexus私服的宿主仓库是用来存储用户自己上传的jar,它提供了两个默认的宿主仓库分别用来存放SNAPSHOT版本和RELEASE版本。

而我们在上传jar的时候只需要更改pom中的<version>元素中内容即可:

  • 上传为 maven-snapshot 时 在<version>1.0-SNAPSHOT</version>加上-SNAPSHOT, 表示不稳定的,会反复发布、测试、修改的版本。
  • 上传为 maven-releases 时 要把<version>1.0</version> 中的-SNAPSHOT去掉,表示这是一个发布版本。

maven上传jar的具体操作如下:

  1)、修改pom.xml文件,加入下面内容:

    <distributionManagement>
        <repository>
            <id>release-nexus</id>
            <url>http://localhost:8081/repository/maven-releases/</url>
            <name>nexus-release</name>
        </repository>
        <snapshotRepository>
            <id>snapshot-nexus</id>
            <url>http://localhost:8081/repository/maven-snapshots/</url>
            <name>nexus-snapshot</name>
        </snapshotRepository>
    </distributionManagement>

上面2个url分别对应的是nexus中两个宿主仓库的地址。

 

2)、修改settings.xml,配置nexus登录用户名和密码信息。

<server>
	<id>release-nexus</id>
	<username>admin</username>
	<password>123456</password>
</server>

<server>
	<id>snapshot-nexus</id>
	<username>admin</username>
	<password>123456</password>
</server>

id要与distributionManagement中id对应。

3)、执行 mvn deploy 命令,结果如下:

image

从运行结果可以发现我们的jar已经上传至maven-snapshot中了。

4)、查看上传的jar,我们访问nexus私服中快照版本仓库的地址:

http://localhost:8081/repository/maven-snapshots/

如果出现了如下页面,点击上面的browse链接。

image

然后我们就可以看到上传的jar包了。

image

如果别人要使用我的jar包的话,只需选中以pom结尾的文件,右边会显示这个jar的坐标。

image

至此maven上传jar包已经全部介绍完毕了。

release稳定版本发布到nexus私服和这个一样,就是改一下version元素后面的内容即可,所以就不演示了。

 

②、手动上传

手动上传一般是用来上传第三方给我们的jar包,例如某个合作商给了一个jar包,这时我们不能使用maven方式上传,而这个包远程仓库是不存在的,大家又要共同使用这个包,此时我们就可以手动将这个jar上传到私服供所有开发使用。但目前手动上传只支持发布稳定版本的构件。

1)、登录nexus之后,按照下图的步骤依次进行操作。

image

2)、我们把target目录下打包的项目的jar上传,并且依次填写好坐标信息,最后点击upload按钮。

image

3)、查看上传的jar,点击右边的Browse,然后选择maven-releases。

image

进来之后就可以看到我们手动上传的包了。

image

11、linux系统中安装nexus

当然我们一般都不会把nexus私服搭建在Windows系统中,而是建在Linux系统中,所以下面介绍在Linux系统中如何搭建私服。Linux版的nexus文件可以在官网下载,也可以在前面提供的百度网盘中获取。然后用Xftp工具上传到Linux系统中。

注意:nexus是基于Java开发的,所以安装系统一定要配置好JDK。可以参考:在CentOS7上配置JDK和Tomcat

①、上传nexus

首先在/opt 目录下新建一个nexus目录:

[root@localhost ~]# mkdir /opt/nexus

然后将nexus压缩包用Xftp上传到这个目录。

image

②、解压nexus

进入创建的nexus目录进行解压:

[root@localhost ~]# cd /opt/nexus/
[root@localhost nexus]# tar -zxvf nexus-3.24.0-02-unix.tar.gz
[root@localhost nexus]# ls
nexus-3.24.0-02  nexus-3.24.0-02-unix.tar.gz  sonatype-work

③、配置虚拟机内存

nexus运行依赖于jvm,而我的nexus默认运行内存如下:

[root@localhost bin]# vi /opt/nexus/nexus-3.24.0-02/bin/nexus.vmoptions

image

它这个运行内存已经远大于系统物理内存,因为jvm分配的内存太大,会导致nexus启动不了,在运行的时候就会报错,报错信息如下:

image

上面就是说虚拟机运行环境的内存分配不够,所以我们要给它调整一下(测试环境下)。

进来之后按 i 键,改完后按esc然后 :wq 完成。

image

④、启动nexus

nexus常用的一些命令包括:./nexus {start|stop|run|run-redirect|status|restart|force-reload}。

start和run启动nexus的区别:start不能看到nexus的运行信息,而run可以,甚至打印错误信息。

下面我们启动nexus(默认端口是8081):

image

说明已经启动成功,上面warning意思是nexus建议不要用root用户来启动nexus,但并不影响启动(nexus的启动较慢,等个1-3分钟)。

④、开放8081端口

#开放端口
firewall-cmd --zone=public --add-port=8081/tcp --permanent
#重启端口
firewall-cmd --reload
#查看开放端口
firewall-cmd --zone=public --list -ports

⑤、验证效果

浏览器输入 http://ip:8081/ 之后如果有nexus界面则表示成功了。

image

⑥、登录nexus

登录账号为:admin,密码在/opt/sonatype-work/nexus3/admin.password

[root@localhost bin]# vi /opt/nexus/sonatype-work/nexus3/admin.password 

image

 

参考资料:

  1. https://cloud.tencent.com/developer/article/1538941
  2. https://www.cnblogs.com/kevingrace/p/6201984.html

推荐阅读