Nexus私服配置
引言
私服是一种私有服务器,是在局域网中搭建的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构建,私服搭建成功之后,当maven需要下载构件时,直接请求私服。私服上存在则下载到本地仓库,不存在才请求外部的远程仓库,将构件下载到私服,再提供给本地仓库下载,可以减少重复网络流量下载问题。
作为普通个人开发者(初学者或者小规模开发),使用maven
下载构件都是Maven中央仓库或者第三方仓库下载,基本用不到私服。那什么时候需要用到私服?答案:大规模团队开发。其实每一项技术的诞生,都是由于生产规模再扩大而导致新问题产生,需要相应的技术解决。需要进行私服配置,就是为在大规模团队开发中优化构建处理工作。
1、如果没有搭建私服会有什么问题?
- 如果没有私服,我们所需的所有构件都需要通过 Maven 的中央仓库或者第三方的 Maven 仓库下载到本地,而一个团队中的所有人都重复的从 Maven 仓库下载构件无疑加大了仓库的负载和浪费了外网带宽,如果网速慢的话,还会影响项目的进程。
- 另外,很多情况下项目的开发都是在内网进行的,可能根本连接不了 Maven 的中央仓库和第三方的 Maven 仓库。
- 我们开发的公共构件如果需要提供给其它项目使用,也需要搭建私服。
2,搭建私服的优点
Maven 私服的概念就是在本地架设一个 Maven 仓库服务器,在代理远程仓库的同时维护本地仓库。当我们需要下载一些构件(artifact)时,如果本地仓库没有,再去私服下载,私服没有,再去中央仓库下载。这样做会有如下一些优点:
- 减少网络带宽流量
- 加速 Maven 构建
- 部署第三方构件
- 提高稳定性、增强控制
- 降低中央仓库的负载
3、Nexus 介绍
Nexus 是一个专门的 Maven 仓库管理软件,它不仅能搭建 Maven 私服,还具备如下一些优点使其日趋成为最流行的 Maven 仓库管理器:
- 提供了强大的仓库管理功能,构件搜索功能
- 它基于 REST,友好的 UI 是一个 ext.js 的 REST 客户端
- 它占用较少的内存
- 基于简单文件系统而非数据库
Nexus安装
Windows
1.下载地址:https://www.sonatype.com/download-oss-sonatype,例如: nexus-3.20.1-01-win64。
PS:从官网下载超级慢,建议从别人百度网盘下载。自行百度即可。
2.解压到响应文件夹下,得到:sonatype-work和nexus-3.20.1 例如:D:\
3.进行环境配置。配置为系统环境变量,编辑path,添加D:\nexus-3.20.1\bin。
4.使用管理员权限操作 Windows PowerShell。操作如下:
# 第一步 安装
nexus.exe / install
# 第一步 启动
nexus.exe / start
# 搞定 访问http://localhost:8081即可
后续:如果需要停止、重启,参考如下命令。
/install:安装
/uninstall:卸载
/stop:停止后台运行
/start:后台运行
/status:查看运行状态
/run:前台运行,可在cmd命令行查看log
Linux
1.从官网下载到压缩包,并上传到服务器(比如 /usr/local 目录下),然后进行解压
tar -zxf nexus-3.21.2-03-unix.tar.gz
2.解压后会得到两个文件夹:nexus-3.21.2-03(nexus 服务目录)、sonatype-work(私有库目录)
3.然后执行如下命令开放 8081 端口:
firewall-cmd --permanent --add-port=8081/tcp
firewall-cmd --reload
4.最后执行如下命令启动服务即可:
cd bin
./nexus start
5.访问 服务器IP+8081端口 即可。
Docker
(1)首先执行如下命令下载 Nexus3 镜像:
docker pull sonatype/nexus3
(2)接着执行如下命令,创建宿主机挂载目录:
mkdir –vp /usr/local/nexus-data
(3)最后执行如下命令运行 Nexus3 容器即可:
docker run -d --name nexus3 -p 8081:8081 -v /usr/local/nexus-data:/var/nexus-data sonatype/nexus3
(4)同样不要忘记执行如下命令开放 8081 端口:
firewall-cmd --permanent --add-port=8081/tcp
firewall-cmd --reload
访问镜像IP地址+8081端口即可访问。
如果想使用其他的端口访问(比如8068,我的本机地址8081端口被其他服务占用),直接修改nexus-default.properties 配置文件。
## DO NOT EDIT - CUSTOMIZATIONS BELONG IN $data-dir/etc/nexus.properties
##
# Jetty section
application-port=8068
application-host=0.0.0.0
nexus-args=${jetty.etc}/jetty.xml,${jetty.etc}/jetty-http.xml,${jetty.etc}/jetty-requestlog.xml
nexus-context-path=/
# Nexus section
nexus-edition=nexus-pro-edition
nexus-features=\
nexus-pro-feature
nexus.hazelcast.discovery.isEnabled=true
重启nexus
即可,再访问IP+8068端口。
需要说的是,不建议在自己Windows系统电脑上一直挂载Nexus
,占用大量内存。还是建议放到远程服务器上。还有一点,第一次登录,在新版Nexus中,用户密码不再是默认admin123。在系统某个文件夹中(不记得自行百度)
使用Nexus
PS:网上的教程关于这一部分说明十分详细,就不详细介绍。这里概要提一下。
1、创建自己的用户
例如:qianye/123456,并授予权限。
2、创建自己的仓库
Nexus仓库类型介绍:
- hosted,本地仓库,通常我们会部署自己的构件到这一类型的仓库。比如公司的第二方库。
- proxy,代理仓库,它们被用来代理远程的公共仓库,如maven中央仓库。
- group,仓库组,用来合并多个hosted/proxy仓库,当你的项目希望在多个repository使用资源时就不需要多次引用了,只需要引用一个group即可。
管理本地仓库:
我们前面讲到类型为hosted的为本地仓库,Nexus预定义了3个本地仓库,分别是Releases, Snapshots, 3rd Party. 分别讲一下这三个预置的仓库都是做什么用的:
- Releases: 这里存放我们自己项目中发布的构建, 通常是Release版本的, 比如我们自己做了一个FTP Server的项目, 生成的构件为ftpserver.war, 我们就可以把这个构建发布到Nexus的Releases本地仓库. 关于符合发布后面会有介绍.
- Snapshots:这个仓库非常的有用, 它的目的是让我们可以发布那些非release版本, 非稳定版本, 比如我们在trunk下开发一个项目,在正式release之前你可能需要临时发布一个版本给你的同伴使用, 因为你的同伴正在依赖你的模块开发, 那么这个时候我们就可以发布Snapshot版本到这个仓库, 你的同伴就可以通过简单的命令来获取和使用这个临时版本.
- 3rd Party:顾名思义, 第三方库, 你可能会问不是有中央仓库来管理第三方库嘛,没错, 这里的是指可以让你添加自己的第三方库, 比如有些构件在中央仓库是不存在的. 比如你在中央仓库找不到Oracle 的JDBC驱动, 这个时候我们就需要自己添加到3rdparty仓库。
不过我要说的是,Nexus不仅仅能搭建Maven仓库,还包括docker
、apt
、npm
、pypi
等仓库。
安装成功后,自己多摸索,百度就会使用。
附录1
Maven 配置使用私服(下载依赖)
1、基本说明
(1)Maven 配置私服下载有两种方式:
setting.xml:该文件配置的是全局模式
pom.xml:该文件的配置的是项目独享模式
注意:若 pom.xml 和 setting.xml 同时配置了,以 pom.xml 为准。
(2)当我们在 maven 使用 maven-public 仓库地址的时候,会按照如下顺序访问:本地仓库 —> 私服 maven-releases —> 私服 maven-snapshots —> 远程阿里云 maven 仓库 —> 远程中央仓库。
2、通过 setting.xml 文件配置
(1)setting.xml 文件配置样例如下。配置后不需要再配置 pom.xml 文件,即可通过私服下载 jar 依赖包。
<mirrors>
<mirror>
<!--该镜像的唯一标识符。id用来区分不同的mirror元素。 -->
<id>nexus-releases</id>
<!--*指的是访问任何仓库都使用我们的私服-->
<mirrorOf>*</mirrorOf>
<!--该镜像的URL。构建系统会优先考虑使用该URL,而非使用默认的服务器URL。 -->
<url>http://localhost:8068/repository/maven-public/</url>
</mirror>
</mirrors>
(2)如果我们并没有搭建私服,属于个人开发,那么也可以直接配置使用阿里 云maven 仓库:
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
3、通过 pom.xml 文件配置
(1)pom.xml 文件配置样例如下。如果我们配置了 pom.xml,则以 pom.xml 为准。
<repositories>
<repository>
<id>maven-nexus</id>
<name>maven-nexus</name>
<url>http://192.168.60.133:8081/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
(2)如果没有私服,我们同样也可以配置阿里云 maven 仓库:
<repositories>
<repository>
<id>maven-aliyun</id>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
<checksumPolicy>fail</checksumPolicy>
</snapshots>
</repository>
</repositories>
4、Maven 配置使用私服(下载插件)
下面是一个使用 pom.xml 配置样例:
<pluginRepositories>
<pluginRepository>
<id>maven-nexus</id>
<name>maven-nexus</name>
<url>http://10.172.0.201:8081/nexus/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
5、Maven 配置使用私服(发布依赖)
(1)首先修改 setting.xml 文件,指定 releases 和 snapshots server 的用户名和密码:
<servers>
<server>
<id>releases</id>
<username>admin</username>
<password>123</password>
</server>
<server>
<id>snapshots</id>
<username>admin</username>
<password>123</password>
</server>
</servers>
(2)接着在项目的 pom.xml 文件中加入 distributionManagement 节点:
注意:repository 里的 id 需要和上一步里的 server id 名称保持一致。
<distributionManagement>
<repository>
<id>releases</id>
<name>Releases</name>
<url>http://192.168.60.133:8081/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<name>Snapshot</name>
<url>http://192.168.60.133:8081/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
(3)执行 mvn deploy 命令发布:
(4)登录 Nexus,查看对应的仓库已经有相关的依赖包了。
**发布到的仓库说明:**
- 若项目版本号末尾带有 -SNAPSHOT,则会发布到 snapshots 快照版本仓库
- 若项目版本号末尾带有 -RELEASES 或什么都不带,则会发布到 releases 正式版本仓库
附录2
我的本地Maven之Settings.xml配置,完整配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.2.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 https://maven.apache.org/xsd/settings-1.2.0.xsd">
<pluginGroups>
<!-- pluginGroup
| Specifies a further group identifier to use for plugin lookup.
<pluginGroup>com.your.plugins</pluginGroup>
-->
</pluginGroups>
<proxies>
</proxies>
<!-- servers
| This is a list of authentication profiles, keyed by the server-id used within the system.
| Authentication profiles can be used whenever maven must make a connection to a remote server.
|-->
<servers>
<server>
<id>releases</id>
<username>qianye</username>
<password>123456</password>
</server>
<server>
<id>snapshots</id>
<username>qianye</username>
<password>123456</password>
</server>
</servers>
<mirrors>
<mirror>
<!--该镜像的唯一标识符。id用来区分不同的mirror元素。 -->
<id>nexus-releases</id>
<!--*指的是访问任何仓库都使用我们的私服-->
<mirrorOf>*</mirrorOf>
<!--该镜像的URL。构建系统会优先考虑使用该URL,而非使用默认的服务器URL。 -->
<url>http://localhost:8068/repository/maven-public/</url>
</mirror>
<mirror>
<id>nexus-snapshots</id>
<mirrorOf>*</mirrorOf>
<url>http://localhost:8068/repository/maven-snapshots/</url>
</mirror>
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>
<profiles>
<profile>
<!--profile的id-->
<id>nexus</id>
<repositories>
<repository>
<!--仓库id,repositories可以配置多个仓库,保证id不重复-->
<id>nexus-releases</id>
<!--仓库地址,即nexus仓库组的地址-->
<url>http://nexus-releases</url>
<releases>
<!--是否下载releases构件-->
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>nexus-snapshots</id>
<url>http://nexus-snapshots</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<!-- 插件仓库,maven的运行依赖插件,也需要从私服下载插件 -->
<pluginRepository>
<!-- 插件仓库的id不允许重复,如果重复后边配置会覆盖前边 -->
<id>nexus-releases</id>
<url>http://nexus-releases</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
<pluginRepository>
<id>nexus-snapshots</id>
<url>http://nexus-snapshots</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<!--激活profile-->
<activeProfiles>
<activeProfile>nexus</activeProfile>
</activeProfiles>
</settings>
我某个项目中的pom.xml
文件配置
<distributionManagement>
<repository>
<id>releases</id>
<name>Releases</name>
<url>http://localhost:8068/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<name>Snapshot</name>
<url>http://localhost:8068/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>