第二部分:关键技术领域的开源实践【企业Maven私服】

企业Maven私服主要解决了以下几个关键的痛点需求:

  1. 网络访问限制: 许多企业出于安全考虑,限制了对外部网络的访问,尤其是对公网上的远程仓库如Maven中央仓库的直接访问。Maven私服作为内部的仓库,可以替代对中央仓库的依赖,使得即使在没有互联网连接的情况下,开发人员也可以获取到所需的依赖库。
  2. 带宽和性能优化: 直接从中央仓库下载依赖可能会占用大量的带宽,并且受到网络延迟的影响。通过使用Maven私服,企业可以缓存常用依赖,从而显著减少下载时间和网络负载,提高构建速度和整体开发效率。
  3. 版本控制和管理: Maven私服允许企业集中管理所有项目依赖的版本,确保所有团队成员使用的是相同的依赖版本,避免因版本不一致导致的问题。同时,企业可以控制特定版本的生命周期,比如标记某些版本为“已验证”,只允许使用这些经过测试的稳定版本。
  4. 内部组件共享: 企业内部开发的组件和库可以通过私服进行共享,无需每次都上传到公共仓库。这样不仅可以保护企业的知识产权,还可以简化内部项目之间的依赖关系管理,促进代码重用。
  5. 合规性和安全性: 使用私服可以更好地控制软件供应链的安全性,确保所有依赖都符合企业的安全政策和合规标准。企业可以对上传的组件进行审查,避免引入恶意代码或不受信任的第三方库。
  6. 搜索和元数据管理: 私服通常提供了比中央仓库更强大的搜索功能和元数据管理能力,使得查找特定的依赖变得更加容易。这对于拥有大量内部组件的大规模组织尤其重要。
  7. 构建自动化和集成: Maven私服可以与持续集成/持续部署(CI/CD)系统紧密集成,自动化构建流程中的依赖下载,确保每次构建使用的是最新的、经过验证的组件。

总的来说,Maven私服是企业级开发环境中不可或缺的一部分,它帮助企业实现了依赖管理的标准化、高效化和安全化。常见的Maven私服解决方案包括Sonatype Nexus、Artifactory等。本文开源实践【企业Maven私服】选用Sonatype Nexus

Nexus安装

通过1panel在线安装即可
如果未使用1panel可以参照:第二部分 关键技术领域的开源实践【Linux服务器自动化运维】

image.png

Nexus配置

Nexus内置的仓库

仓库有四种类型:group(仓库组)、hosted(宿主)、proxy(代理)和virtual(虚拟):
image.png
这个列表已经包含了所有类型的Nexus仓库:

仓库类型 说明
proxy 某个远程仓库的代理
group 存放:通过 Nexus 获取的第三方 jar 包
hosted 存放:本团队其他开发人员部署到 Nexus 的 jar 包

每个仓库的格式为maven2或者maven1。此外,仓库还有一个属性为Policy(策略),表示该仓库为发布(Release)版本仓库还是快照(Snapshot)版本仓库。最后两列的值为仓库的状态和路径。

下面解释一下各个仓库的用途:

仓库名称 说明
maven-central Nexus 对 Maven 中央仓库的代理,其策略为Release,因此只会下载和缓存中央仓库中的发布版本构件。
maven-public Nexus 默认创建,供开发人员下载使用的组仓库
maven-releasse Nexus 默认创建,供开发人员部署自己 jar 包的宿主仓库,要求 releasse 版本
maven-snapshots Nexus 默认创建,供开发人员部署自己 jar 包的宿主仓库,要求 snapshots 版本
其中 maven-public 相当于仓库总和,默认把其他 3 个仓库加进来一起对外提供服务了,另外,如果有自己建的仓库,也要加进该仓库才有用。

创建仓库
除了自带的仓库,有时候我们需要单独创建自己的仓库,按照默认创建的仓库类型来创建我们自己的仓库。
点击Create Repository:
image.png

创建Nexus宿主仓库

创建布道师budao
image.png

创建Nexus代理仓库

输入仓库名以及被代理仓库的URL,这里我输入阿里云的仓库地址,默认为中央仓库。
image.png

创建Nexus仓库组

自定义一个聚合maven组仓库:将其聚合成一个虚拟的仓库组。注意,仓库组所包含的仓库的顺序决定了仓库组遍历其所含仓库的次序,因此最好将常用的仓库放在前面,当用户从仓库组下载构件的时候,就能够尽快地访问到包含构件的仓库。
image.png

Nexus的索引与构件搜索

为了能够搜索Maven中央库,首先需要设置Nexus中的Maven Central代理仓库下载远程索引,如下图所示。需要注意的是,默认这个配置的值是关闭的。此外,由于中央库的内容比较多,因此其索引文件比较大,Nexus下载该文件也需要比较长的时间,耐心等待。
我们知道 Nexus 可以远程下载和缓存中央仓库索引,但是对于国内用户来说,Nexus 远程更新索引使用的站点位于国外且部分索引文件较大,经常会出现下载速度缓慢或索引文件不完整等情况。下面我们将介绍一种更加快捷可靠的索引更新方式:离线更新中央仓库索引。
离线更新中央仓库索引,顾名思义,就是直接将索引文件下载,然后拷贝至 Nexus 工作目录中,以达到离线更新索引的目的。
离线更新中央仓库索引主要分为以下 3 步:

  1. 文件下载
  2. 解压
  3. 更新并验证索引

文件下载

首先,我们需要下载以下 3 个文件:

  • nexus-maven-repository-index.gz
  • nexus-maven-repository-index.properties
  • indexer-cli-5.1.1.jar

1、下载索引文件:

https://repo1.maven.org/maven2/.index/

或者

http://repo.maven.apache.org/maven2/.index/

2、下载索引生成器浏览器访问 http://mvnrepository.com/,搜索 Indexer CLI,选择 Maven :: Indexer CLI

把下载的文件放在同一目录/mnt
image.png

java -jar indexer-cli-5.1.1.jar -u nexus-maven-repository-index.gz -d indexer

等待几分钟,先关闭nexus服务,注意1Panel索引目录。搜索:sonatype-work

类似:/var/lib/docker/overlay2/f3ee56a2733f068683bfc11fabac54382d48d15c89c2f548454c6e3b8fd5d855/merged/opt/sonatype/sonatype-work

新建目录:nexus\indexer\central-ctx

更新并验证索引 将所有索引文件(不包含目录)全部拷贝到“….\sonatype-work\nexus\indexer\central-ctx”目录中
image.png

重启 Nexus

项目中使用自己的私服

修改maven 的settings.xml文件

配置权限用户,关闭匿名用户能连接到私服下载公共资源包

<server>
         <id>maven-public</id>
         <username>budaos</username>
         <password>budaos_2222!!@@1234</password>
     </server>
<mirrors>
   <!-- mirror
    | Specifies a repository mirror site to use instead of a given repository. The repository that
    | this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used
    | for inheritance and direct lookup purposes, and must be unique across the set of mirrors.
    |
   -->
 <mirror>
    <id>maven-public</id>
    <mirrorOf>*</mirrorOf>
    <name>maven-public</name>
    <url>http://maven.budaos.com/repository/maven-public/</url>
 </mirror>
  
 <mirror>
   <id>nexus-tencentyun</id>
   <name>Nexus tencentyun</name>
   <url>http://mirrors.cloud.tencent.com/nexus/repository/maven-public/</url>
   <mirrorOf>*</mirrorOf>
   </mirror>
 </mirrors>

> 项目中的pom.xml加入

<repositories>
       <repository>
           <id>maven-public</id>
           <name>maven-public</name>
           <url>http://maven.budaos.com/repository/maven-public/</url>
           <snapshots>
               <enabled>true</enabled>
               <updatePolicy>always</updatePolicy>
               <checksumPolicy>warn</checksumPolicy>
           </snapshots>
           <releases>
               <enabled>true</enabled>
               <updatePolicy>always</updatePolicy>
               <checksumPolicy>warn</checksumPolicy>
           </releases>
       </repository>
   </repositories>


   <distributionManagement>
       <repository>
           <id>maven-public</id>
           <name>maven-releases</name>
           <url>http://maven.budaos.com/repository/maven-releases/</url>
       </repository>
       <snapshotRepository>
           <id>maven-public</id>
           <name>maven-snapshot</name>
           <url>http://maven.budaos.com/repository/maven-snapshots/</url>
       </snapshotRepository>
   </distributionManagement>
posted @ 2024-07-14 22:30  TechLearn  阅读(8)  评论(0编辑  收藏  举报
写代码、聊产品、懂设计、热爱阅读和分享
http://www.budaos.com