Chat 文章地址: 企业 Maven 依赖管理层次结构设计
由于文章涉及内容太多,不想在文章中包含太多基础的内容,但是对于了解不深的人来说,没有这些内容也不容易真正掌握,因此在博客上通过本文附加一些额外的内容来完善上述 Chat。
1. 搭建 Nexus 私服
下载地址
Docker方式
安装文档
为了简单快速演示,本文直接通过 Docker 方式运行。
DockerHub: Sonatype Nexus3 Docker: sonatype/nexus3
直接通过下面的命令启动:
docker run -d -p 8081:8081 --name nexus sonatype/nexus3
等待启动成功后,通过浏览器打开 http://localhost:8081/,此时可以看到下面的界面:
Browse 界面如下:
这个界面重要的仓库分别如下:
- maven-central: 类型是 proxy,代理的意思,这里会转发到 maven 中央仓库去下载。
- maven-releases: 类型是 hosted,当前仓库直接存放 releses 发布版的构建(jar,pom等)
- maven-snapshots: 和上面一样是 hosted,存放快照版。
- maven-public: 类型是 group,一个公开的组,最常用的仓库是 public,这个组包含了上面的 3 个仓库,并且按照 releases, snapshots, central 的顺序配置,优先选择本地的发布版,其次是快照版,最后是去中央仓库去找。下图是该仓库顺序的配置:
进入上述 Nexus 网站后,右上角可以登录,默认登录密码在(容器中) /nexus-data/admin.password
中:
# 通过下面命令进入容器
$ docker exec -it nexus /bin/bash
# 查看密码
$ cat /nexus-data/admin.password
得到密码后,使用 admin
账号进行登录,然后设置新的密码,这里为了演示和全文的一致,本文设置密码为 123456
。
2. 配置 Aliyun 代理仓库
虽然 Maven 中央仓库的速度已经可以接受了,但是配置一个国内的镜像源会让下载速度变得更快,国内目前最稳定的就是 AliRepo。
接下来我们增加一个代理来配置 AliRepo 的 central
。
登录 Nexus,然后点击下图所示按钮进入管理界面:
左侧菜单打开 Repositories
:
点击【Create Repository】按钮,然后选择 maven2(proxy)
,Name 输入 AliRepo
,然后粘贴前面提到的 url https://maven.aliyun.com/repository/central
到 Remote storage 中。输入内容如下图所示。
拖到最下面,点击 【Create repository】按钮即可创建完成。
前面提到过 maven-public 仓库是一个最常用的仓库组,真正使用的时候很少直接指定具体某个仓库,通常使用这个组,因此想要方便的使用刚刚新增的 AliRepo,还需要配置 maven-public 组中的内容和顺序:
如上图所示,将 AliRepo 从左侧添加到右侧 Members 中,然后调整顺序到 maven-central 上面,这样就会优先从 AliRepo 下载依赖。
3. 个人 Maven 配置
想要使用上面的仓库,以及 deploy 到 Nexus 私服,还需要每个用户(开发人员)在自己电脑上配置 Maven 的 settings.xml,关键的部分配置如下:
<servers>
<!-- 快照版用户配置 -->
<server>
<id>nexus-snapshots</id>
<username>admin</username>
<password>123456</password>
</server>
<!-- 发布版用户配置 -->
<server>
<id>nexus-releases</id>
<username>admin</username>
<password>123456</password>
</server>
</servers>
<!-- 所有 Maven 依赖下载都走私服 -->
<mirrors>
<mirror>
<id>central</id>
<name>central</name>
<url>http://localhost:8081/repository/maven-public/</url>
<mirrorOf>*</mirrorOf>
</mirror>
</mirrors>
注意上面配置的用户密码。
这里为了简单直接用的 admin, 企业为了控制权限可以创建不同的账号和密码。
有了上面的配置后,所有依赖都会通过上面的镜像地址进行下载。
4. 什么是 SNAPSHOT 快照版?
注意下面所示的 pom.xml 文件中的 version 标记的值有一个后缀: -SNAPSHOT
。
<project xmlns="http://maven.apache.org/POM/4.0.0"
...
<groupId>...</groupId>
<artifactId>my-app</artifactId>
...
<version>1.0-SNAPSHOT</version>
<name>Maven Quick Start Archetype</name>
...
The SNAPSHOT value refers to the ‘latest’ code along a development branch, and provides no guarantee the code is stable or unchanging. Conversely, the code in a ‘release’ version (any version value without the suffix SNAPSHOT) is unchanging.
SNAPSHOT
指的是开发分支上的“最新”代码,不能保证代码是稳定的或不变的。 相反,“发布”版本中的代码(没有SNAPSHOT
后缀)是稳定不变的。
In other words, a SNAPSHOT version is the ‘development’ version before the final ‘release’ version. The SNAPSHOT is “older” than its release.
换句话说,SNAPSHOT
版本是最终发布版本之前的开发版本。 SNAPSHOT
比它的发布版时间“更早”。
During the release process, a version of x.y-SNAPSHOT changes to x.y. The release process also increments the development version to x.(y+1)-SNAPSHOT. For example, version 1.0-SNAPSHOT is released as version 1.0, and the new development version is version 1.1-SNAPSHOT.
在发布过程中,x.y-SNAPSHOT
的一个版本更改为 x.y
。 发布过程还将开发版本递增到 x. (y + 1)-SNAPSHOT
。 例如,版本1.0-SNAPSHOT
作为版本1.0
发布,新的开发版本是1.1-SNAPSHOT
版本。
5. Redeploy 重新发布 Release
如果一个 release 版本发布到了 Nexus,默认情况下是不能再次发布的,如果允许发布,就会出现同一个版本的不同的版本。这是因为如果其他人使用了你这个版本,这个版本会下载到其他人本地仓库中,你重新 deploy 后,对方本地仓库的 release 版本不会重新下载,因此对已经下载的人就无效了。
所以如果想要 redeploy,还要通知所有下载过的人删除本地仓库的依赖再重新下载最新版本。一般遇到这个问题都是建议发布一个新的版本。
如果想让仓库可以 redeploy,可以在 maven-release 下面配置:
配置后,就可以重新执行 maven deploy
了。
转载:https://blog.csdn.net/isea533/article/details/104110775