您现在的位置是:首页 >技术交流 >Maven 私服 Nexus 3.44 搭建网站首页技术交流

Maven 私服 Nexus 3.44 搭建

ares5k 2024-06-14 17:19:22
简介Maven 私服 Nexus 3.44 搭建

Nexus 是用来搭建 Maven 私服的,换句话说就是公司专用的 Maven 仓库,Nexus 3.x 版本的官网下载地址

个人认为下面两种场景比较适合使用私服:

1. 公司只有服务器允许访问外网,员工机器禁止访问外网,此时员工机器无法从 Maven 公服远程仓库更新依赖

2. 项目中很多需要引入的依赖是公司自己开发的,Maven 公服远程仓库中没有,所以无法下载

Nexus 有 LInux 版本和 Windows 版本,本文演示的是 Linux 版本,具体版本为 nexus-3.44.0-01-unix


1. 安装 Nexus

将下载好的 Nexus 安装包通过 FTP 工具上传到 Linux,我个人比较喜欢使用的 FTP 工具是 MobaXterm,上传后,在 Nexus 存放目录中运行 tar -zxvf nexus-3.44.0-01-unix.tar.gz 解压 Nexus 安装包,解压后目录结构如下:

解压后结构

2. Nexus 程序


Nexus 程序的存放路径为 Nexus 主程序/bin/nexus, 运行 nexus 程序时需要指定运行参数,常见的参数有三个

2.1. 启动 nexus 程序,添加运行参数 start

启动 nexus 程序,以本文为例,命令为:sh nexus-3.44.0-01/bin/nexus start,运行后界面如下:

运行 nexus


2.2. 查看 nexus 程序运行状态,添加运行参数 status

启动 nexus 后,查看是否启动成功,以本文为例,命令为:sh nexus-3.44.0-01/bin/nexus status,运行后界面如下:

查看是否启动成功

2.3. 停止 nexus 程序,添加运行参数 stop

停止 nexus 程序,以本文为例,命令为:sh nexus-3.44.0-01/bin/nexus stop,运行后界面如下:

请添加图片描述

3. 浏览器访问 Nexus GUI


查看 Nexus 状态为成功启动后,就可以通过浏览器来访问 Nexus GUI,在 GUI 中可以对 Nexus 私服进行配置,但是访问前,我们需要先将防火墙关闭,否则容易出现无法访问的情况,关闭防火墙命令:systemctl stop firewalld

3.1. 默认端口

Nexus GUI 程序的默认访问端口为 8081,以本文为例,浏览器地址为 http://192.168.3.88:8081

默认端口访问GUI

3.2. 自定义端口


想自定义 Nexus GUI 程序的端口,需要修改 Nexus 辅助程序/nexus3/etc/nexus.properties 文件,如果从未运行过 Nexus 程序,那么这个文件是不存在的,需要我们手动添加,如果运行过 Nexus 程序,那么这个文件就会被自动创建,此时直接修改文件内容即可

文件中通过 application-port=端口号 来指定端口号,以本文为例,因为我已经运行过 Nexus 程序了,所以 nexus.properties 文件就不需要手动创建了,直接通过 vim sonatype-work/nexus3/etc/nexus.properties 修改:

修改端口

修改后,重新启动 nexus 程序,然后通过自定义端口访问 Nexus GUI 程序,http://192.168.3.88:8088

nexus 自定义端口

3.3. 初次登录,并修改密码

前面访问 Nexus GUI 后,画面中没有任何内容,这是因为我们还未登录,没有权限,第一次登陆时,用户名默认为 admin,对应的密码保存在 Nexus 辅助程序/nexus3/admin.password

首次登陆

用默认的用户名和密码登陆后,会让我们自己重新设置一下密码

密码重置

4. Nexus GUI 中的仓库和仓库类型


Nexus 中的仓库类型有很多,需要我们关注的主要有三个,proxy、hosted、group

4.1. proxy - 可连公网仓库的类型

可连公网的仓库,这个类型的仓库创建时,需要设置一个公网仓库的地址,当我们本地的 Maven 访问 proxy 仓库时,如果需要的依赖不在 proxy 仓库中,则会从设置的公网仓库中下载,下载后保存到 proxy 仓库中,然后再返还给本地 Maven,流程类似下图:

proxy仓库流程

Nexus 默认提供的 proxy 仓库

Nexus 默认提供了一个名字为 maven-central 的 proxy 仓库,如下图

默认的proxy仓库

我们可以通过点击名字对该仓库的设置进行修改:

设置默认的proxy仓库

通过地址我们可以看出,这个 proxy 仓库的远端公网仓库是 maven 的官方仓库,我们也可以将这个公网仓库地址换为阿里云仓库,从而提升下载速度 https://maven.aliyun.com/repository/public


4.2. hosted - 保存上传的依赖的类型

hosted 仓库 和 proxy 仓库截然相反,proxy 仓库中的内容是从公网仓库下载下来的,而 hosted 仓库中的内容通常是我们本地 Maven 上传上来的,流程类似下图:

hosted流程

hosted 仓库,常见场景就是,公司中的某一个小组开发好一个组件后上传到 hosted 仓库,然后另一个小组想使用这个组件时,就可以在 hosted 仓库下载

hosted 仓库的内部又分两种类型,一个是发布库,一个是快照库,在创建 hosted 仓库时通过 Version policy 选项设置,这个目的就是对上传的组件进行更好的归类


Nexus 默认提供了两个 hosted 仓库

Nexus 默认提供了两个 hosted 仓库,一个是名字为 maven-releases 的发布库,一个是名字为 maven-snapshots 的快照库

hosted默认的仓库


同样点击名字就可以对 hosted 仓库进行修改,我们以 maven-releases 仓库为例:

发布库

4.3. group - 聚合仓库类型

当我们项目中的依赖既需要从 proxy 仓库下载,又需要从 hosted 仓库下载,那么就需要在本地 Maven 的 settings.xml 中设置两个远端仓库,分别指向私服中的 proxy 仓库和 hosted 仓库,这就很麻烦。而 nexus 中 group 仓库的作用,就是指定多个 nexus 中已有的仓库,将它们聚合到一起

如下图,我们可以创建一个 group 仓库,然后将 hosted 仓库和 proxy 仓库聚合到一起,这样本地 Maven 的 settings.xml 中,只需要将 group 仓库设置为远端仓库就可以了,不需要设置多次

group仓库


Nexus 默认提供了一个 group 仓库

Nexus 默认提供了一个名字为 maven-public 的 group 仓库

默认的group仓库

点击仓库名字可以查看或修改配置,从配置中可以看到,默认的 group 仓库中聚合了三个已有仓库:

group仓库配置

4.4. 创建仓库

不管创建什么类型的仓库,入口都是一样的,如下图:

创建仓库

点击后,我们可以选择要创建的仓库类型,下图红框中的就是上面说的 proxy、hosted、group:

选择仓库类型

仓库类型选择完后,是对该类型的仓库进行详细设置,此处就不举例了,可参照 Nexus 提供的默认仓库的配置

4.5. 查看仓库中的依赖

查看仓库中的依赖,入口如下图:

查看仓库
然后点击仓库名就可以查看这个仓库中已有的依赖,如果仓库是 hosted 类型,点进去后还可以上传依赖,都是傻瓜式操作,就不介绍了,进去一看就明白了

4.6. 查看私服中的仓库地址


不管是从私服的仓库下载依赖或将项目包上传到私服的仓库,首先得知道私服中仓库的地址,地址查找方式如下:

请添加图片描述

5. 从私服中的仓库下载依赖


从私服中的仓库下载依赖有两种方式:

  • 配置镜像:配置镜像后,Maven 会拦截访问远端仓库的请求,将目标地址变更为私服中仓库的地址后再请求
  • 配置仓库信息:配置仓库信息,并将仓库路径指向私服中的仓库,需要更新依赖时,直接去私服中的仓库

5.1. 方式一:配置镜像


很多文章说这种方式不会下载 hosted 库中快照库的模块,其实下载与否,取决于我们拦截的仓库,其仓库信息中是否配置了允许更新快照库,如果配置允许更新快照库,那么是可以正常下载的,只不过我们通常都是对 Maven 默认的中央仓库 central 进行镜像,而在超级POM中,这个仓库的仓库信息中设置了不允许访问快照库,所以我们通过镜像就无法更新快照库的模块

以私服中默认的 group 仓库为例,在 Maven 的 settings.xml 中添加如下代码:

<!-- 设置登录权限 -->
<servers>
  <server>
    <id>ares5k-Nexus</id>
    <username>admin</username>
    <password>root</password>
  </server>
</servers>

<mirrors>
  <!-- mirrorOf 是要拦截的仓库,使用通配符 *,代表对所有的仓库都进行拦截,实际使用时可以根据项目情况更改 -->
  <mirror>
    <id>ares5k-Nexus</id>
    <name>my nexus</name>
    <mirrorOf>*</mirrorOf>
    <url>http://192.168.3.88:8081/repository/maven-public/</url>
  </mirror>
</mirrors>

说一下上面配置中比较重要的部分,其中 <server> 节点是设置登录密码的,<server.id> 必须与 <mirror.id> 相同,这样私服才能成功访问(如果私服没有设置访问权限,这里 <server> 部分可以省略),其他的想了解更多可以看我关于 settings.xml 的文章

5.2. 方式二:设置仓库信息

设置仓库信息,并将仓库的地址设置为私服中仓库的地址,但是使用这种方式时,一定要设置两份,一份是下载依赖时使用的,一份是下载插件时使用的

当我们的私服需要授权认证时,要先在 settings.xml 中添加登录密码:

<!-- 设置登录权限 -->
<servers>
  <server>
    <id>ares5k-Nexus</id>
    <username>admin</username>
    <password>root</password>
  </server>
</servers>

然后设置仓库信息,有两个地方可以设置仓库信息,一个是 pom.xml 中,一个是 settings.xml<profile> 中,在 <profile> 中设置仓库信息时,不要忘了设置 <profile> 的激活状态,否则配置不会生效

<!-- 私服仓库 - 更新依赖时使用 -->
<repositories>
  <repository>
    <id>ares5k-Nexus</id>
    <name>my nexus</name>
    <url>http://192.168.3.88:8081/repository/maven-public/</url>
    <!-- 允许在快照库下载 -->
    <snapshots>
      <enabled>true</enabled>
    </snapshots>
    <!-- 允许在发布库下载 -->
    <releases>
      <enabled>true</enabled>
    </releases>
  </repository>
</repositories>

<!-- 私服仓库 - 更新插件时使用 -->
<pluginRepositories>
  <pluginRepository>
    <id>ares5k-Nexus</id>
    <name>Central Repository</name>
    <url>http://192.168.3.88:8081/repository/maven-public/</url>
    <!-- 允许在快照库下载 -->
    <snapshots>
      <enabled>true</enabled>
    </snapshots>
    <!-- 允许在发布库下载 -->
    <releases>
      <enabled>true</enabled>
    </releases>
  </pluginRepository>
</pluginRepositories>

不要忘了 <server.id><repository.id>、<pluginRepository.id> 要相同

6. 将项目打包后上传到私服中的仓库

1. 在 pom.xml 指定要上传的私服仓库,配置如下:

<!-- 工程坐标 -->
<groupId>com.ares5k</groupId>
<artifactId>ares5k-package</artifactId>
<!-- version 中有 SNAPSHOT 字眼时会上传到快照库,否则上传到发布库 -->
<version>1.0</version>

<!-- 设置上传信息 -->
<distributionManagement>
  <!-- 发布库,私服中 hosted 仓库的 Version policy 必须是 release -->
  <repository>
    <id>ares5k-release</id>
    <url>http://192.168.3.88:8081/repository/maven-releases/</url>
  </repository>
  <!-- 快照库,,私服中 hosted 仓库的 Version policy 必须是 snapshot  -->
  <snapshotRepository>
    <id>ares5k-snapshot</id>
    <url>http://192.168.3.88:8081/repository/maven-snapshots/</url>
  </snapshotRepository>
</distributionManagement>

2. 在 settings.xml 中追加私服中仓库的登录信息 <repository.id>、<snapshotRepository.id> 必须和 <server.id> 相同:

<servers>
  <!-- 发布库权限信息 -->
  <server>
    <id>ares5k-release</id>
    <username>admin</username>
    <password>root</password>
  </server>
  <!-- 快照库权限信息 -->
  <server>
    <id>ares5k-snapshot</id>
    <username>admin</username>
    <password>root</password>
  </server>
</servers>

3. 运行 mvn deploy 后就会将项目打包并上传到对应的仓库中,以上述配置为例,因为工程坐标的 <version> 中没有 SNAPSHOT 字眼,所以会将项目打包上传到 <id>ares5k-release</id> 配置的私服仓库中

其他项目组想使用我们的模块时,他们必须根据我们上传的仓库来配置他们的仓库信息(允许快照库或发布库下载)

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。