您现在的位置是:首页 >技术交流 >Maven 私服 Nexus 3.44 搭建网站首页技术交流
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
,运行后界面如下:
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
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
3.3. 初次登录,并修改密码
前面访问 Nexus GUI 后,画面中没有任何内容,这是因为我们还未登录,没有权限,第一次登陆时,用户名默认为 admin
,对应的密码保存在 Nexus 辅助程序/nexus3/admin.password
中
用默认的用户名和密码登陆后,会让我们自己重新设置一下密码
4. Nexus GUI 中的仓库和仓库类型
Nexus 中的仓库类型有很多,需要我们关注的主要有三个,proxy、hosted、group
4.1. proxy - 可连公网仓库的类型
可连公网的仓库,这个类型的仓库创建时,需要设置一个公网仓库的地址,当我们本地的 Maven 访问 proxy 仓库时,如果需要的依赖不在 proxy 仓库中,则会从设置的公网仓库中下载,下载后保存到 proxy 仓库中,然后再返还给本地 Maven,流程类似下图:
Nexus 默认提供的 proxy 仓库
Nexus 默认提供了一个名字为 maven-central
的 proxy 仓库,如下图
我们可以通过点击名字对该仓库的设置进行修改:
通过地址我们可以看出,这个 proxy 仓库的远端公网仓库是 maven 的官方仓库,我们也可以将这个公网仓库地址换为阿里云仓库,从而提升下载速度 https://maven.aliyun.com/repository/public
4.2. hosted - 保存上传的依赖的类型
hosted 仓库 和 proxy 仓库截然相反,proxy 仓库中的内容是从公网仓库下载下来的,而 hosted 仓库中的内容通常是我们本地 Maven 上传上来的,流程类似下图:
hosted 仓库,常见场景就是,公司中的某一个小组开发好一个组件后上传到 hosted 仓库,然后另一个小组想使用这个组件时,就可以在 hosted 仓库下载
hosted 仓库的内部又分两种类型,一个是发布库,一个是快照库,在创建 hosted 仓库时通过 Version policy
选项设置,这个目的就是对上传的组件进行更好的归类
Nexus 默认提供了两个 hosted 仓库
Nexus 默认提供了两个 hosted 仓库,一个是名字为 maven-releases
的发布库,一个是名字为 maven-snapshots
的快照库
同样点击名字就可以对 hosted 仓库进行修改,我们以 maven-releases
仓库为例:
4.3. group - 聚合仓库类型
当我们项目中的依赖既需要从 proxy 仓库下载,又需要从 hosted 仓库下载,那么就需要在本地 Maven 的 settings.xml 中设置两个远端仓库,分别指向私服中的 proxy 仓库和 hosted 仓库,这就很麻烦。而 nexus 中 group 仓库的作用,就是指定多个 nexus 中已有的仓库,将它们聚合到一起
如下图,我们可以创建一个 group 仓库,然后将 hosted 仓库和 proxy 仓库聚合到一起,这样本地 Maven 的 settings.xml 中,只需要将 group 仓库设置为远端仓库就可以了,不需要设置多次
Nexus 默认提供了一个 group 仓库
Nexus 默认提供了一个名字为 maven-public
的 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>
配置的私服仓库中
其他项目组想使用我们的模块时,他们必须根据我们上传的仓库来配置他们的仓库信息(允许快照库或发布库下载)