maven 私服 nexus3.x 搭建与使用完全手册
本文讲解搭建 maven 私服的详细步骤和私服在工程中如何使用的详细指南。
为何要搭建 maven 私服,其实原因可能很多,每个需要搭建的理由都有所不同,总结起来,有下面这几点。
第一个,访问和共享非中央仓库的 jar 包,可能是第三方私有的认证相关 jar 包,特殊的还有类似 oracle 的驱动 jar 包这些在公网仓库没有的文件,这种情况,一般就是需要手动上传 jar 包文件至私服仓库,然后公开仓库坐标。这个原因是占大多数的。
第二个,企业工程采用 maven 模块化的开发构建方式,类似于公共平台模块和核心组件、工具包,需要发布提供给其它模块依赖使用,同时隔离源码。也就是这些核心的组件,可以提供给其它工程使用,但是源码是不能轻易更改的。这种情况下,搭建一个私服是最好的选择。
第三个,就是网络访问权限问题。其实很多企业都是这样的,员工的机器网络访问是受限的,再加上国家的防火长城,导致有两个问题,一个是访问慢,一个是根本无法访问中央仓库。这种情况,使用 maven 私服中继代理下载请求,这样既节省带宽,防止重复下载,又解决了中央仓库访问难的问题。
Nexus 简介
Sonatype Nexus 是有名的 maven 仓库管理器,可以用于构建 maven 的本地服务器。
sonatype nexus 3 是 maven nexus 私服的最新版本,与之前版本有较大的差异。
Nexus 术语
搭建 maven 私服之前最好了解几个名词,方便后面安装好服务器之后做配置,同时也涉及 Nexus 下载的行为模式。
Proxy Repository 代理仓库
代理仓库就是远程仓库的代理。默认 Nexus 仓库管理自带三种代理仓库 Apache Snapshots/Codehaus Snapshots/Central,但是在 3.x 中就只有 Central 了。Nexus 3.x 对于 2.x 来说简化了很多,配置理解起来也很简单。
Hosted Repository 宿主仓库
宿主仓库就是被仓库管理者持有的仓库,Nexus 仓库管理自带三种宿主仓库 3rd Party/Releases/Snapshots,在 3.x 中默认不带 3rd Party 了。
Virtual Repository 虚拟仓库
基本没用过,不用关注,虚拟仓库作为一个适配器来对不同类型的仓库进行转换(例如 maven 1/ 2 之间转换)。
Repository Group 仓库组
看名字就知道,一些其它仓库的组合,不具有实际仓库的功能,只是对现有的仓库组织起来,客户端请求的还是实际配置的仓库。
SNAPSHOT
快照版本,在 maven 中 SNAPSHOT
版本代表正式发布(release)的版本之前的开发版本,在 pom 中用 x.y-SNAPSHOT
表示。
RELEASE
发布版本,稳定版本,在 maven 中 RELEASE
代表着稳定的版本,unchange,不可改变的,在 maven 中 SNAPSHOT 与 RELEASE 版本在策略上是完全不同的方式,SNAPSHOT 会根据你的配置不同,频繁的从远程仓库更新到本地仓库;而 RELEASE 则只会在第一次下载到本地仓库,以后则会先直接从本地仓库中寻找。
以上具体概念会在下文有所涉及。
Nexus 3.x 安装
前置条件要求存在 jdk1.8 的环境。
下载
地址:https://www.sonatype.com/download-oss-sonatype
可以根据服务器类型需要选择不同的包下载,有 Mac OSX、Windows 和类 Unix 系统的安装包,Nexus 有社区版和付费版两种,我们下载社区版本就完全可以了。
如果是在服务器上操作,直接可以使用 wget
下载:
wget https://sonatype-download.global.ssl.fastly.net/repository/repositoryManager/3/nexus-3.14.0-04-unix.tar.gz
linux 上安装配置 Nexus
其实安装很简单,都是压缩包解压安装,但是有一些配置上的坑需要讲清楚,这里选了常用的 linux 和 windows 服务器分别介绍,首先是 linux 上如何安装部署 Nexus 3.x。
# 解压
tar -zxvf nexus-3.14.0-04-unix.tar.gz
# 解压的文件夹移到 nexus
mv nexus-3.14.0-04/ /usr/local/nexus
mv sonatype-work/ /usr/local/nexus
# 防火墙开启 8081 端口,该端口是 nexus 的默认端口
# 在 /usr/local/nexus/etc/nexus-default.properties 文件中
vi /etc/sysconfig/iptables
# 在打开的文件中加入如下内容
-A INPUT -p tcp -m state --state NEW -m tcp --dport 8081 -j ACCEPT
# 启动
# ps 安装时第一次启动使用 ./nexus start 访问不到 web 页面,使用 run 命令可以,之后使用 start 也就可以了
./nexus run &
# 启动成功会有如下信息
WARNING: ************************************************************
WARNING: Detected execution as "root" user. This is NOT recommended!
WARNING: ************************************************************
Starting nexus
上面启动成功后会警告不要使用 root
用户启动,这里既可以新建一个用户,也可以指定 root 用户启动,使他不出现警告,下面配置指定 root 用户启动。
# 该文件在 bin 目录下和启动程序 nexus 同级
vi nexus-3.14.0-04/bin/nexus.rc
# 修改
run_as_user=root
这样重新启动 Nexus 就可以了。
windows 上安装配置 Nexus
快捷下载地址:
https://sonatype-download.global.ssl.fastly.net/repository/repositoryManager/3/nexus-3.14.0-04-win64.zip
把它解压到磁盘,例如 D:\nexus
。
以管理员身份打开 cmd
命令行,进入 D:\nexus\nexus-3.14.0-04\bin
目录下,使用
nexus /install Nexus3
该命令将会将 Nexus Repository 注册成为 Windows 服务。
进入 windows 服务管理页面,启动刚刚注册的 Nexus3
服务。
等几分钟到 Nexus Repository 程序初始化完成,打开浏览器,输入 http://192.190.20.20:8081
,出现如下界面,安装成功。
手动更新索引 (可选)
我这里没有下载索引,以前配置过 nenus2.x 时下载过全部索引,很大很慢,下载了一晚上,不下载索引并不影响使用,这里会同步当前项目使用的依赖到私服的索引中,有新的依赖从私服中获取也会更新对应的索引,下面介绍一种离线安装的方式。
-
前往 maven 中央仓库下载 indexer-cli-5.1.1.jar 解压工具包
-
下载离线索引文件
nexus-maven-repository-index.gz
nexus-maven-repository-index.properties
- 将3个文件放在同一目录下解压
java -jar indexer-cli-5.1.1.jar -u nexus-maven-repository-index.gz -d indexer
- 拷贝索引
nexus2.x 拷贝到 {nexus-home}/sonatype-work/nexus/indexer/central-ctx
nexus3.x 拷贝到 /sonatype-work/nexus3/blobs/default
4.3.x 我没尝试过,需要的话请参考网上的例子:
由于使用代理之前需要先下索引,但是索引一般较大接近 300M,从国外下载的话非常的慢。我们可以使用迅雷之类的加速工具,离线下载然后再上传到nexus服务器即可。
从 http://repo.maven.apache.org/maven2/.index/ 找到需要下载的索引文件。 如:http://repo.maven.apache.org/maven2/.index/nexus-maven-repository-index.gz 还有 http://repo.maven.apache.org/maven2/.index/nexus-maven-repository-index.properties 将其上传到 nexus 服务器存储数据的仓库中,对应 web 管理界面上就是 Repository/Blob Stores/仓库名。
在我的服务器上地址是在 /var/opt/nexus-data/blobs/ 仓库名。
在仓库名目录下创建 .index
目录,然后将下载的文件 copy 到该目录中,之后很快就同步好了,同步完成状态可通过查看 web 管理界面仓库状态栏,当出现 Online - Remote Aviailable 时就表示已同步完成了。
其实网络比较好的情况下稍微等待一会就好了,我这次配置没有手动添加索引。
web 界面
- 访问 web 界面,使用默认管理账号
admin/admin123
登录http://192.190.20.20:8081
。 - 仓库浏览在左侧菜单栏 Browse,这里有多种仓库,相比于 nexus2.x 精简了很多仓库。
nexus 仓库类型
Group:这是一个仓库聚合的概念,用户仓库地址选择 Group 的地址,即可访问 Group 中配置的
所有仓库资源,访问顺序取决于配置顺序 3.x 默认 Releases,Snapshots,Central,可在 web 页面配置
在 web 界面点开
Hosted:私有仓库,专门用来存储我们自己生成的 jar 文件
3rd party:未发布到公网的第三方 jar (3.x 去除了)
Snapshots:本地项目的快照仓库
Releases: 本地项目发布的正式版本
Proxy:公网上发布的 jar 例如:spring
Central:中央仓库
Apache Snapshots:Apache专用快照仓库(3.x去除了)
- 配置 Releases 版本可重复上传
点击图片画框部分配置 Releases: Deployment pollcy –> Allow redeploy
http 网络代理设置
有时候局域网是不能直接访问网络的,需要通过防火墙代理来上网,这个时候就需要在 Nexus 里配置代理来访问中央仓库和索引文件了。
登录 Nexus,在 Http 菜单中选中 http 和 https 选项,填写代理 IP 和端口,如果代理需要认证,那么需要选中 Authentication 填写用户名密码。
使用 nexus 本地 maven 配置
配置好私有仓库之后,如何在开发的时候使用它呢?下面我们配置让工程依赖从私有仓库下载,并且可以从本地发布 jar 包到私服。
全局配置下载依赖
即项目 pom 无需配置。
在 maven 的 setting.xml
文件中配置私服配置,这种方式配置后所有本地使用该配置的 maven 项目的 pom 文件都无需配置私服下载相关配置。
<profiles>
<profile>
<id>spinfo</id>
<repositories>
<!-- 私有库地址-->
<repository>
<id>nexus</id>
<url>http://192.190.20.20:8081/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<!--插件库地址-->
<pluginRepository>
<id>nexus</id>
<url>http://192.190.20.20:8081/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
修改 setting.xml
激活使用上面的配置。
<activeProfiles>
<activeProfile>spinfo</activeProfile>
</activeProfiles>
同样是修改 setting.xml
指定镜像代理为我们的私服,这样,我们本地的 maven 包上传下载就全部请求私服了。
<mirrors>
<mirror>
<id>nexus-spinfo</id>
<!-- * 指的是访问任何仓库都使用我们的私服 -->
<mirrorOf>*</mirrorOf>
<name>Nexus spinfo</name>
<url>http://192.190.20.20:8081/repository/maven-public/</url>
</mirror>
</mirrors>
这里顺带说一句 setting.xml
配置的问题,一般情况我们会直接修改安装目录里面的例如 D:\Program Files\apache-maven-3.3.9\conf\setting.xml
,这样有个问题,当你管理很多工程的时候,很多 IDE 例如 IDEA 在初始化的时候都不会使用这个文件,使用的是自带的配置文件,如果你忘记在它的项目配置里指定 setting.xml
配置文件路径,可能实际情况就不是你期望的那样了。
所以为了避免这种情况,我们一般在操作系统的用户目录,创建一个 .m2
目录,然后把 setting.xml
文件放在里面,例如 C:\Users\daimafans\.m2\setting.xml
。maven 在编译的时候寻找配置文件的最高优先级,能够达到一处配置,所以工程都能使用的效果。
单独项目下载依赖
即在项目 pom 文件中配置,这种配置是修改单个项目的 pom 文件,无需修改 maven 的 setting.xml 配置。
<repositories>
<repository>
<id>nexus</id>
<url>http://192.190.20.20:8081/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
建议使用全局的 setting 配置,一个项目组共用一个 maven 的 setting 配置,项目中就无需配置下载相关的私服仓库配置。
使用私服后仓库访问顺序
使用私服后仓库访问顺序:
添加其它代理仓库
大多数时候,有 maven-central
代理中央仓库就可以了,但是有的时候网络访问速度不佳,或者有其它的仓库可以与中央仓库互补,那么我们可以添加第三方的代理仓库。这里以添加 ibiblio Repository 为例。
仓库地址:http://maven.ibiblio.org/maven2/
登录 Nexus,打开 Repositories
菜单,点击按钮 create repository
,然后在列表中选择 maven2(proxy)
。
把 ibiblio Repository 添加到仓库组
默认,nexus 会给你创建一个仓库组,nexus 3.x 中就是 maven-public
代理仓库组,现在就把他添加到这个默认的仓库组里,因为我们在 maven setting.xml
中配置的全局访问地址就是 maven-public
,把新增的代理仓库加到这个组之后就可以在需要的时候去这个代理仓库中下载依赖文件了。
在 Repositories 列表中点击 maven-public
列表进行修改。
定位到 Group
块,这里 Available
一栏就是我们添加的可用的代理仓库,Members
一栏中就是 maven-public
组拥有的仓库列表。
我们要做的就是点击选中 ibiblio
代理仓库,然后点击向右的按钮 >
把 ibiblio 加入到 Members 里。
注意顺序,这里的顺序会影响到你搜索组件的顺序,默认搜索组件的顺序是 maven-releases(本机发布版) > maven-snapshots(本机快照) > maven-central(远程代理中央仓库)> ibiblio(远程 ibiblio 代理仓库,在国内速度还是比较快的,可以放到中央仓库的前面)
上传 jar 包配置
对于中央仓库没有的 jar 包,需要我们自己将 jar 包发布到私服中去,其中 jar 包主要分为两类,一类是本地自己开发供给项目组其余同事使用,这种直接配置项目的 pom 文件和 maven 的 setting 文件,之后 deploy
发布即可发布到,另一类是第三方 jar 包,可以直接使用 web 页面上传并设置对应 GAV 即可。
本地 maven 开发的项目上传配置
- maven 的 setting 文件配置
这里要配置配置上传用户及仓库信息,我这里直接使用了 admin
用户,在 nenus2.x 中还内置了一个 deployment/deployment123 用户,在 3.x 该用户被移除了,这里可以自己配置角色和用户,我就直接使用 admin 用户了。
在 maven setting.xml
中修改。
<servers>
<server>
<id>nexus-releases</id>
<username>admin</username>
<password>admin123</password>
</server>
<server>
<id>nexus-snapshots</id>
<username>admin</username>
<password>admin123</password>
</server>
</servers>
- 项目中的 pom 文件配置
打开工程的 pom.xml
,添加 <distributionManagement>
节点配置。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.daimafans</groupId>
<artifactId>demo</artifactId>
<version>1.0-SNAPSHOT</version>
<distributionManagement>
<repository>
<id>nexus-releases</id>
<name>Nexus Release Repository</name>
<url>http://192.190.20.20:8081/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>nexus-snapshots</id>
<name>Nexus Snapshot Repository</name>
<url>http://192.190.20.20:8081/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
</project>
- 执行 maven 的 deploy 命令
eclipse 中上传本地项目 jar 到私服,右键工程,选择 Run As -> Run Configurations,然后配置。
IDEA 中就比较简单了,直接点击运行 maven 周期中的 deploy
即可。
出现 uploading 信息并且没报错说明上传成功。
到对应仓库查看。
注意:
- 这里只有 Snapshot 的仓库上传成功,Release 仓库并没有上传成功,这是因为版本号名称结尾有
-SNAPSHOT
,默认以这个结尾是不会上传到 Release 仓库去的,去除就会上传到 Release 仓库且不会上传到快照仓库。 - Release 仓库默认不支持重复发布,参考小节 “web 界面” 中的配置。
- 注意 setting.xml 中
<server>
标签下的id
要和 pom.xml 文件中仓库配置的id
相同,即指定上传到哪个仓库。
第三方 jar 包上传
对于第三方 jar 包的上传采用 nexus 提供的 web 界面上传,上传成功后需要使用该 jar 包的话,依赖中填写自定义的 GAV 即可。