Maven私服仓库配置-Nexus简洁版
一、什么是Maven私服?
Maven 私服是一种特殊的Maven远程仓库,它是架设在局域网内的仓库服务,用来代理位于外部的远程仓库(中央仓库、其他远程公共仓库)。
Nexus仓库属性和分类
在仓库列表中,每个仓库都具有一系列属性:
- Type:仓库的类型,这里一共有三种
1.1 proxy:用来代理远程公共仓库,如 Maven 中央仓库、JBoss 远程仓库。
1.2 hosted:又称 Nexus 本地仓库,该仓库通常用来部署本地项目所产生的构件。 hosted 宿主仓库又分为:releases 和shapshots,分别表示依赖的版本的发行版、快照版。快照版依赖不能上传到发行版仓库,反之亦然。nexus做了限制。
1.3 group:仓库组,用来聚合代理仓库和宿主仓库,为这些仓库提供统一的服务地址,以便 Maven 可以更加方便地获得这些仓库中的构件。 - Format:仓库的格式有两种maven2、nuget。我们是搞java的,所以新建仓库一般都是选择的maven2格式。
- Status:仓库的状态,只有在线状态才能被访问。
- URL:仓库的路径。
为了更加直观的理解仓库组、代理仓库和宿主仓库的概念,我们通过下图展示它们的用途和区别。
由上图可知:
- Maven 可以直接从宿主仓库中下载构件。
- Maven 也可以从代理仓库中下载构件,代理仓库会从远程仓库下载并缓存构件。
- Maven 还可以从仓库组中下载构件,仓库组会从其包含的宿主仓库和代理仓库中获取构件。
我们使用nexus私服,配置文件中配置的也就是仓库组地址,因为仓库组可以把代理仓库、宿主仓库聚合,这样就完美实现:从私服下载依赖,私服仓库找不到还能去代理仓库那找。找到了之后缓存到私服这样下次就能从私服直接获取了。
Nexus仓库配置以及创建仓库
刚安装好的nexus一共给我们创建了7个仓库(不同的nexus版本可能有一点差距),我们只需要关注Format为maven2的仓库即可,也就是一共有4个:
- maven-central:该仓库用来代理 Maven 中央仓库,其策略为 Release,只会下载和缓存中央仓库中的发布版本的构件。
- maven-releases:策略为 Release 的宿主仓库,用来部署公司或组织内部的发布版本构件。
- maven-snapshots:策略为 Snapshot 的宿主仓库,用来部署公司或组织内部的快照版本构件。
- maven-public:仓库组,默认聚合了以上三个仓库。
下面进行一个一个讲解:
新建四个仓库,名称分别为cmit-maven-central、cmit-maven-releases、cmit-maven-snapshots、cmit-maven-public
(1)cmit-maven-central
新建一个代理仓库,然后代理到阿里云镜像地址。通过阿里云镜像下载依赖要比maven中央仓库快的多。
选择maven2(proxy)
其他配置默认即可。然后代理地址写:
https://maven.aliyun.com/repository/public
(2)cmit-maven-releases
新建本地仓库,选择maven2(hosted)
注意:release仓库需要把这块改一下,设置为Allow redeploy代表允许我们对仓库中的依赖维护升级新版本,如果设置为Disable redeploy意味着我们无法将升级版本(同一个命名版本)上传上来。
- 使用releases版本,设置为Disable redeploy,再次部署时,提示更新失败!
code is:400,ReasonPhrase:Repository does not allow updating assets
(3)cmit-maven-snapshots
新建本地仓库,选择maven2(hosted)
通过测试,发现设置为Allow redeploy与Disable redeploy都可以。
- 注意点:需要把Version policy设置为Snapshots,不然推送快照版本到此仓库报错
- 报错内容:status code: 400, reason phrase: Repository version policy: RELEASE does not allow version: 0.0.2-20240620.061523-1 (400)
(4)cmit-maven-public
public仓库组就是将这几个仓库汇集到一块,然后项目使用nexus,不需要配置其他仓库的地址,只需要配置仓库组的地址即可。
新建本地仓库,选择maven2(group)
Maven SNAPSHOT(快照)
SNAPSHOT 版本 VS RELEASE 版本
Maven 仓库分为两种,Snapshot 快照仓库和 Release 发行仓库。Snapshot 快照仓库用于保存开发过程中的不稳定 SNAPSHOT 版本,Release 发行仓库则用来保存稳定的 RELEASE 版本。Maven 会根据模块的版本号(pom.xml 文件中的 version 元素)中是否带有 -SNAPSHOT 来判断是 SNAPSHOT 版本还是正式 RELEASE 版本。带有 -SNAPSHOT 是SNAPSHOT(快照)版本,不带 -SNAPSHOT 的就是正式 RELEASE(发布)版本。
项目当中配置Nexus上传依赖
复制使用的仓库url
首先找到本地maven的setting.xml(在maven安装目录的conf目录下),打开后找到servers标签。加入以下内容
<servers>
<!-- 这是配置访问私有仓库的用户名密码(文档中的密码为虚拟,真实密码请找维护人员) -->
<server>
<!-- id标签可以随便填,只需要在servers中唯一即可,后面很多地方会使用该id -->
<id>nexus-maven</id>
<username>admin</username>
<password>admin123</password>
</server>
</servers>
找到mirrors标签。加入以下内容
- mirror的优先级要高于profile,意味着当mirror中mirrorOf匹配到profile中的repository的ID,则该repository会失效(完全被mirror代理)
- 当mirrorOf配置为*时,所有的repository的配置都会失效
- 在maven中配置一个mirror时,有多种形式,例如
mirrorOf=“” //刚才经过,mirror一切,你配置的repository不起作用了
mirrorOf=my-repo-id //镜像my-repo-id,你配置的my-repo-id仓库不起作用了
mirrorOf=,!my-repo-id //!表示非运算,排除你配置的my-repo-id仓库,其他仓库都被镜像了。就是请求下载my-repo-id的仓库的jar不使用mirror的url下载,其他都是用mirror配置的url下载
mirrorOf=external:* //如果本地库存在就用本地库的,如果本地没有所有下载就用mirror配置的url下载
<mirror>
<id>nexus-maven</id>
<!--表示访问哪些工厂时需要使用镜像-->
<mirrorOf>cmit</mirrorOf>
<url>http://localhost:8081/repository/cmit-maven-public/</url>
</mirror>
我们可以在profiles节点下新增一个profile节点(cmit-profile),在repository标签修改id,对应mirrorOf标签。
拉取镜像会通过repository中id找到对应mirror,如果找不到,则从下面的url中获取(如https://repo.maven.apache.org/maven2)
<profile>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>17</jdk>
</activation>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<maven.compiler.compilerVersion>17</maven.compiler.compilerVersion>
</properties>
<repositories>
<repository>
<id>cmit</id>
<name>cmit nexus</name>
<url>https://repo.maven.apache.org/maven2</url>
</repository>
</repositories>
<id>cmit-profile</id>
</profile>
新增一个activeProfiles节点,该节点和profiles节点一个层次(通过测试,activeProfiles不需要增加),内容如下:
<!-- 让增加的 profile生效 -->
<activeProfiles>
<activeProfile>default</activeProfile>
<activeProfile>cmit-profile</activeProfile>
</activeProfiles>
maven配置好了,接下来去maven项目中设置:
在你想上传的模块的pom文件中,写入(修改ip和端口):
```yaml
<distributionManagement>
<repository>
<!--注意这个id一定要填写我们maven的setting.xml当中配置的id-->
<id>nexus-maven</id>
<name>release</name>
<url>http://ip:port/repository/cmit-maven-releases/</url>
</repository>
<snapshotRepository>
<!--注意这个id一定要填写我们maven的setting.xml当中配置的id-->
<!--准确来说是server标签,用于认证使用-->
<id>nexus-maven</id>
<name>snapshots</name>
<url>http://ip:port/repository/cmit-maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
- distributionManagement:负责将指定的构件部署到 Nexus 指定的仓库中。
- repository:代表上传release版本存储的仓库地址
- snapshotRepository:代表上传snapshot版本存储的仓库地址
- 标签中的 id,就是上面我们配置的server id,maven会通过这个id去server中拿用户名密码去访问私服仓库。
- 标签中的url,就是对应仓库的地址:仓库的url复制即可,注意对应仓库,弄反了是传不上去的
会根据该模块的版本进行自动选择,如果你的版本号带有SNAPSHOT如:<version>0.0.1-SNAPSHOT</version>,那么会上传到SNAPSHOT仓库,release也是这个道理,如果版本号不存在这两个单词,如1.0.0,那么会选择release仓库上传。
上传依赖
- 更新项目使用setting.xml文件
- 执行deploy上传到私有仓库
当然也可以直接运行maven命令:mvn clean deploy -DskipTests
- 提示:记得在profiles插件中勾选使用的环境
- deploy执行完不报错的话就上传成功了
由于我的项目设置的是0.0.1-SNAPSHOT,也就是SNAPSHOT版本,所以他会自动上传到cmit-maven-snapshots仓库当中,如下:
点击进去
同时在cmit-maven-public中也可以看到上传成功的jar包
- 本篇以实战为主,主要以创建仓库->仓库配置->maven集成私有仓库->打包上传
- 暂时使用的管理员账号,后续需要新建账号并授权对应的角色权限
- 注意需要勾选profiles中的环境,其次default环境不能识别mirrorOf为*,所以需要新增profile配置仓库(测试验证发现)
- 简单梳理其中的关系,maven中profiles插件勾选环境,通过环境id(profile-id)识别setting.xml文件中配置,匹配activeProfiles中的activeProfile标签,拿到内容匹配profile标签中id,拿到repositories内容,通过repository标签中id识别mirror,通过mirrorOf标签内容(mirrorOf-id)确定,如果匹配到,则使用mirror中的url,如果未匹配到,则使用repository标签中的url。其中mirror、distributionManagement中的标签(snapshotRepository、repository),使用id内容为server配置中的id,相当于配置账号密码