Maven私服仓库配置-Nexus简洁版

Maven私服仓库配置-Nexus简洁版

一、什么是Maven私服?
Maven 私服是一种特殊的Maven远程仓库,它是架设在局域网内的仓库服务,用来代理位于外部的远程仓库(中央仓库、其他远程公共仓库)。

Nexus仓库属性和分类

在仓库列表中,每个仓库都具有一系列属性:
在这里插入图片描述

  1. Type:仓库的类型,这里一共有三种
    1.1 proxy:用来代理远程公共仓库,如 Maven 中央仓库、JBoss 远程仓库。
    1.2 hosted:又称 Nexus 本地仓库,该仓库通常用来部署本地项目所产生的构件。 hosted 宿主仓库又分为:releases 和shapshots,分别表示依赖的版本的发行版、快照版。快照版依赖不能上传到发行版仓库,反之亦然。nexus做了限制。
    1.3 group:仓库组,用来聚合代理仓库和宿主仓库,为这些仓库提供统一的服务地址,以便 Maven 可以更加方便地获得这些仓库中的构件。
  2. Format:仓库的格式有两种maven2、nuget。我们是搞java的,所以新建仓库一般都是选择的maven2格式。
  3. Status:仓库的状态,只有在线状态才能被访问。
  4. URL:仓库的路径。
    为了更加直观的理解仓库组、代理仓库和宿主仓库的概念,我们通过下图展示它们的用途和区别。
    在这里插入图片描述

由上图可知:

  1. Maven 可以直接从宿主仓库中下载构件。
  2. Maven 也可以从代理仓库中下载构件,代理仓库会从远程仓库下载并缓存构件。
  3. 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标签。加入以下内容

  1. mirror的优先级要高于profile,意味着当mirror中mirrorOf匹配到profile中的repository的ID,则该repository会失效(完全被mirror代理)
  2. 当mirrorOf配置为*时,所有的repository的配置都会失效
  3. 在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仓库上传。

上传依赖

  1. 更新项目使用setting.xml文件

在这里插入图片描述

  1. 执行deploy上传到私有仓库

在这里插入图片描述

当然也可以直接运行maven命令:mvn clean deploy -DskipTests

  • 提示:记得在profiles插件中勾选使用的环境
  1. 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,相当于配置账号密码
  • 15
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值