第二部分:关键技术领域的开源实践【企业Maven私服】
企业Maven私服主要解决了以下几个关键的痛点需求:
- 网络访问限制: 许多企业出于安全考虑,限制了对外部网络的访问,尤其是对公网上的远程仓库如Maven中央仓库的直接访问。Maven私服作为内部的仓库,可以替代对中央仓库的依赖,使得即使在没有互联网连接的情况下,开发人员也可以获取到所需的依赖库。
- 带宽和性能优化: 直接从中央仓库下载依赖可能会占用大量的带宽,并且受到网络延迟的影响。通过使用Maven私服,企业可以缓存常用依赖,从而显著减少下载时间和网络负载,提高构建速度和整体开发效率。
- 版本控制和管理: Maven私服允许企业集中管理所有项目依赖的版本,确保所有团队成员使用的是相同的依赖版本,避免因版本不一致导致的问题。同时,企业可以控制特定版本的生命周期,比如标记某些版本为“已验证”,只允许使用这些经过测试的稳定版本。
- 内部组件共享: 企业内部开发的组件和库可以通过私服进行共享,无需每次都上传到公共仓库。这样不仅可以保护企业的知识产权,还可以简化内部项目之间的依赖关系管理,促进代码重用。
- 合规性和安全性: 使用私服可以更好地控制软件供应链的安全性,确保所有依赖都符合企业的安全政策和合规标准。企业可以对上传的组件进行审查,避免引入恶意代码或不受信任的第三方库。
- 搜索和元数据管理: 私服通常提供了比中央仓库更强大的搜索功能和元数据管理能力,使得查找特定的依赖变得更加容易。这对于拥有大量内部组件的大规模组织尤其重要。
- 构建自动化和集成: Maven私服可以与持续集成/持续部署(CI/CD)系统紧密集成,自动化构建流程中的依赖下载,确保每次构建使用的是最新的、经过验证的组件。
总的来说,Maven私服是企业级开发环境中不可或缺的一部分,它帮助企业实现了依赖管理的标准化、高效化和安全化。常见的Maven私服解决方案包括Sonatype Nexus、Artifactory等。本文开源实践【企业Maven私服】选用Sonatype Nexus
Nexus安装
通过1panel在线安装即可
如果未使用1panel可以参照:第二部分 关键技术领域的开源实践【Linux服务器自动化运维】
Nexus配置
Nexus内置的仓库
仓库有四种类型:group(仓库组)、hosted(宿主)、proxy(代理)和virtual(虚拟):
这个列表已经包含了所有类型的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:
创建Nexus宿主仓库
创建布道师budao
创建Nexus代理仓库
输入仓库名以及被代理仓库的URL,这里我输入阿里云的仓库地址,默认为中央仓库。
创建Nexus仓库组
自定义一个聚合maven组仓库:将其聚合成一个虚拟的仓库组。注意,仓库组所包含的仓库的顺序决定了仓库组遍历其所含仓库的次序,因此最好将常用的仓库放在前面,当用户从仓库组下载构件的时候,就能够尽快地访问到包含构件的仓库。
Nexus的索引与构件搜索
为了能够搜索Maven中央库,首先需要设置Nexus中的Maven Central代理仓库下载远程索引,如下图所示。需要注意的是,默认这个配置的值是关闭的。此外,由于中央库的内容比较多,因此其索引文件比较大,Nexus下载该文件也需要比较长的时间,耐心等待。
我们知道 Nexus 可以远程下载和缓存中央仓库索引,但是对于国内用户来说,Nexus 远程更新索引使用的站点位于国外且部分索引文件较大,经常会出现下载速度缓慢或索引文件不完整等情况。下面我们将介绍一种更加快捷可靠的索引更新方式:离线更新中央仓库索引。
离线更新中央仓库索引,顾名思义,就是直接将索引文件下载,然后拷贝至 Nexus 工作目录中,以达到离线更新索引的目的。
离线更新中央仓库索引主要分为以下 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
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”目录中
重启 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>