私服的配置也是企业开发中经常用到的,主要是为了协助多人或者多台设备的共同开发。
我们知道 Maven 项目可以 install 到本地仓库,但是其他设备无法访问我们本地的仓库,我们需要将做好的模块部署(deploy)到一个服务器上,供其他设备下载使用。
这时可以想到,Maven 的中央仓库做的就是这样的事情,也许我们可以把自己的项目上传到 Maven 中央仓库?
确实可行但并不实用,因为中央仓库并不会随意供人上传文件,需要申请,另外中央仓库里的东西都是公开的,有时我们并不希望这样。
所以私服就体现出了作用,私服可以作为中央管理系统来管理 Maven 依赖,一来它能供我们自由的上传和下载我们自己开发的项目,二来它能帮助我们下载中央仓库中的依赖。私服就成了属于我们自己的中央仓库,可以自由使用。
本文借助 Nexus 工具来实现私服的搭建。
官网下载地址:https://help.sonatype.com/repomanager3/product-information/download
官网也许下载不了,需要翻墙
网盘地址(3.31版本):https://pan.baidu.com/s/1oqUR_xmauprG-3V-PWHq-Q
提取码:o8bg
这篇文章里有其他版本的网盘地址:nexus3下载地址
下载之后解压就好,无需安装
解压之后有两个文件夹, nexus-3.31.1-01 和 sonatype-work,两个都有用,如下图:
进入 nexus-3.31.1-01\bin
目录下:
路径栏输入 cmd,回车打开命令行:
输入命令:nexus.exe /run nexus 回车:
等待片刻后,出现 Started Sonatype Nexus OSS 就完成了:
在命令行中按下 ctrl + c 即可正常关闭 Nexus,直接点 × 是强制关闭
服务器启动之后,浏览器访问 localhost:8081 即可打开管理页面:
点击右上角 Sign In 进行登录:
用户名为 admin,密码在 sonatype-work\nexus3\admin.password
文件中,用记事本打开文件,将里面的密码复制出来:
登录成功之后会进行第一次启动的配置,点击 next:
重新设置 admin 用户的密码,需要输入两次,我先以 admin 作为密码设置:
是否允许匿名访问,若开启,任何人无需密码就能访问私服并下载文件,但没有管理权限,自己用怎么选都行,我先选择 Disable 禁止:
是否发送使用信息给开发者,怎么选都行,我先选 No 不发送:
完成了!点击 Finish:
点击上方的齿轮进入设置,在点击 repositories 进入仓库设置:
如上图中可以看到,不同于本地仓库,私服中可以有多个仓库,且每一个仓库都有类别,此处简单说明一下这三种类别:
现在私服里有默认创建的一些仓库可以使用,不过我们来尝试自己创建仓库。
对于项目的版本,通常有开发中的 SNAPSHOT(快照版本),和开发完成的 RELEASE(发布版本),通常为这两种版本的项目分别设置仓库,接下来我们试着创建 my-snapshot 和 my-release 两个仓库
(如果你不想新建仓库,可以把已有的 maven-snapshot 和 maven-release 代替之后的 my-snapshot 和 my-release)
首先创建 my-snapshot 仓库点击 Create repository:
选择 maven2(hosted) 仓库:
输入仓库名,并选择 Version policy 为 Snapshot,除此以外什么都不需要改:
点击页面底部的 Create repository 按钮即可:
同样的方法,来创建 my-release 仓库,这时需要选择 Version policy 为 Release:
前面说过,仓库组(group)是将几个仓库联合起来的组,下载包时只需要指定仓库组,就能找到需要的依赖,而不必指定具体的仓库
比如将我们自己创建的仓库和 Maven 中央仓库联合,私服就能自己判断哪些包是我们上传的,而哪些需要去中央仓库下载
我们直接用默认创建好 maven-public 仓库组来设置一下,将刚才创建的 my-snapshot 和 my-release 仓库添加到组内(自己创建仓库组也是可以的,需选择仓库类别为 maven2(group) )
点击仓库组的名称 maven-public:
在页面底部,选择 my-snapshot 和 my-release 两个仓库(ctrl + 左键 可以多选),点击右箭头,或者直接拖拽到右侧,即可加入此仓库组
点击 Save 保存即可:
Maven 通过 url 定位 仓库或者仓库组,点开一个仓库(组)即可看到它的 url:
或者点击 仓库列表中 URL 列的 copy 按钮:
mirror 是 Maven 下载依赖时访问的镜像,我们将私服中的仓库组 maven-public 作为镜像
打开 maven 的目录下的 conf\setting.xml 文件,找到 mirrors 标签,添加一个 mirror,表示下载依赖时访问的仓库组:
<mirrors>
<mirror>
<id>maven-publicid>
<mirrorOf>*mirrorOf>
<name>nexus mavenname>
<url>http://localhost:8081/repository/maven-public/url>
mirror>
mirrors>
server 是 Maven 上传包时访问的服务器中的仓库,配置 server 不需要仓库的 URL,因为我们会在项目的 pom.xml 中配置
打开 maven 的目录下的 conf\setting.xml 文件,找到 servers 标签,添加两个 server,分别表示我们自己创建的 my-snapshot 和 my-release 两个仓库:
<servers>
<server>
<id>my-snapshotid>
<username>adminusername>
<password>adminpassword>
server>
<server>
<id>my-releaseid>
<username>adminusername>
<password>adminpassword>
server>
servers>
上传的项目 pom.xml 文件中需要设置 distributionManagement 标签,如下:
<distributionManagement>
<repository>
<id>my-releaseid>
<url>http://localhost:8081/repository/my-release/url>
repository>
<snapshotRepository>
<id>my-snapshotid>
<url>http://localhost:8081/repository/my-snapshot/url>
snapshotRepository>
distributionManagement>
distributionManagement 有 repository 和 snapshotRepository,分别表示 release 和 snapshot 两个版本上传的两个仓库,上传到哪个仓库取决于项目的 version 版本号后面有没有 SNAPSHOT
如上图中这个简单的小项目,它的坐标是 com.mzz,版本是 1.0-SNAPSHOT
用命令 mvn deploy 构建项目并上传,看到 BUILD SUCCESS 就成功了
可以看出这个项目上传到了 my-snapshot 仓库,因为现在项目版本号是 1.0-SNAPSHOT,如果想上传到 my-release 仓库,只需去掉版本号后的 SNAPSHOT 或者将 SNAPSHOT 改成 RELEASE 即可
在模块间的继承关系中,在父模块中设置 distributionManagement 会继承给子模块
点击上方的方格按钮,再点击左侧的 Browse,在仓库列表中点击要查看的仓库名称即可
修改中心仓库的代理地址为阿里云,点击 maven-central 仓库:
修改 Remote storage 为 https://maven.aliyun.com/repository/public,如下图:
到页面最下方 Save 保存即可
nexus 默认的端口号是 8081,如果想要修改,在 sonatype-work\nexus3\etc
路径下,打开 nexus.properties 文件,修改 application-port 的值,取消注释即可: