基于Nexus搭建Maven私服基础入门
什么是Nexus?它有什么优势?
要了解为什么需要nexus的存在,我们不妨从以下几个问题来简单了解一下:
为什么需要搭建私服?如果没有私服会出现什么问题?
对于企业开发而言,如果没有私服,我们所有的依赖都需要从 Maven 的中央仓库或者第三方的 Maven 仓库下载到本地。如果一个团队中的所有人都重复的从 Maven 仓库下载组件无疑加大了仓库的负载和带宽的消耗,而且如果企业的带宽资源紧张,引入依赖等待时长更是灾难的存在。
另外,很多情况下项目的开发都是在内网进行的,我们某些组件不可能发布到外网,所以我们可能需要一个自己的maven私服。
搭建私服有什么优势?
Maven 私服的概念就是在本地架设一个 Maven 仓库服务器,在代理远程仓库的同时维护本地仓库。当我们需要下载一些构件(artifact)时,如果本地仓库没有,则再去私服下载,私服没有再去中央仓库下载(例如阿里云仓库)并将其缓存下来,这样一来下一个用户可以直接在本地私服得到自己需要的资源,这就避免了没必要的带宽消耗。
小结一下,这种私服的依赖部署方式会有以下几个优点:
- 减少网络带宽流量。
- 加速 Maven 构建。
- 便于获取第三方隐私组件。
- 提高稳定性、增强控制。
- 降低中央仓库的负载。
什么是Nexus?
Nexus 是一个专门管理Maven、npm等仓库管理软件,它不仅可以实现快速搭建私服,还具备如下一些优点使其日趋成为最流行的 Maven 仓库管理器:
- 提供了强大的仓库管理功能,构件搜索功能。
- 它基于 REST,友好的 UI 是一个 ext.js 的 REST 客户端。
- 它对于资源的占用较少。
- 基于简单文件系统而非数据库。
基于Linux搭建nexus
准备nexus
了解nexus之后,我们不妨基于Linux服务器搭建一个属于自己的nexus私服。首先我们需要到nexus官网下载一下nexus的资源。下载地址为:https://help.sonatype.com/repomanager3/product-information/download
这里需要补充一下,笔者nexus用的不是最新版本,所以到老版本里面找到了nexus-3.28.0-01-unix.tar.gz这个资源,地址为:https://help.sonatype.com/repomanager3/product-information/download/download-archives—repository-manager-3
选择的版本如下图所示:
完成资源下载之后,我们不妨将其上传到服务器上。以笔者为例,将其上传到tmp目录,意味一次实验性的部署。
完成上传后,我们先将其解压。
tar -zxvf nexus-3.28.0-01-unix.tar.gz
然后进入nexus的bin目录。
cd nexus-3.28.0-01/bin/
运行如下命令,将nexus启动(笔者这里为了方便排查问题,先将nexus前台启动)
./nexus run
不久后控制台输出下面这段内容,就说明nexus启动成功了。我们不妨到浏览器访问这个页面。
启动nexus并测试可用性
nexus默认端口号为8081,所以我们到浏览器键入ip:8081即可进入登录页面,刚刚进入时需要初始化一下,这里我们稍等片刻。
完成初始化之后,我们点击sign in,准备进行登录。
初次进入时需要输入用户名和密码,用户名为admin,密码读者可以按照页面提示找到对应文件完成输入,如下图所示:
我们不妨使用cat命令查看一下,如下所示,得到一串字符串复制下来去登录。
[root@iZ8vb7bhe4b8nhhhpavhwpZ ~]# cat /tmp/sonatype-work/nexus3/admin.password
6f1d326f-b030-4043-ab37-xxxxxxx
拿着上文复制的密码点击登录。
然后我们就进入了初始化页面,这里直接点击next。
然后页面会提示我们修改密码,这里我们按照提示输入两次点击下一步即可。
下一个设置页面,我们设置允许匿名访问。
自此完成所有的基本配置。
配置nexus
接下来就开始我们nexus的配置步骤了,如果我们希望私服缓存的依赖需要指定到一个位置,我们可以自己创建一个blob,这个其实非必须的,这个blob配置完成之后,我们就可以将后续仓库的blob指定到到这个blob中,笔者这里为了简单就没有配置,直接用default的。如下图所示,关于blob的具体配置,笔者会在后续系列教程中演示。
我们希望nexus的工作流程为,现在自己本地releases仓库里面找,如果没有则去snapshots仓库里面找,如果快照仓库没有就去阿里云那边找,如果阿里云有则直接将其缓存到blob中。
为了做到这一点,我们首先需要配置一个阿里云的仓库,首先点击创建仓库
选择maven-proxy,创建一个代理仓库,如果本地没有找到依赖资源则通过这个代理帮我们查找。
如下图,读者可以按照读者的解释将名称、版本策略,原创仓库地址等配置设置好。
完成后点击下方create即可。
完成了代理仓库的创建,我们希望自己平时自定义的jar上传时可以按需传到release和snapshot上,比如我现在写了个临时的snapshot组件给其他开发用,我希望自己能够上传到到snapshot的仓库中,这样分门别类的规范便于后续团队包的控制。
所以我们首先配置一个快照的仓库,在配置过程中,我们发现nexus提供了一个现成的仓库,我们不妨修改一下它的配置直接使用。如下图所示,找到maven-snapshots直接点击箭头进入修改界面。
我们点击进去可以看到它的策略就是我们需要的仅仅存放快照包,然后我们将layout policy改为permissive。
往下查找,将部署策略也改为允许重复部署,避免我们对于同一版本的组件无法再次上传到maven私服中。
完成后到下方点击save即可保存。
同理,maven-release一样的配置,这里就不多做赘述了。
自此我们完成了大半部分的工作,接下来我们就要实现我们的私服查找jar包策略了,即:
- 先看看release,没有看snapshots
- snapshots没有,到代理仓库中找。
- 代理仓库中有,直接缓存到blob中。
要做到这一点,我们还是需要创建一个仓库,将上述我们配置的仓库组合起来,对外暴露。
选择配置一个maven-group,将我们上文配置的仓库按照顺序组合起来。
设置好group名称之后,我们滑倒最下方设置依赖查找顺序,以笔者为例,可以看到策略就是我们上文所说的方式自顶向下配置,完成后点击save即可。
测试从nexus私服获取资源
自此我们完成的nexus的配置了,现在我们不妨就来试试看nexus私服配置是否生效,我们到自己本机上配置一下maven的setting.xml。
首先指定本地仓库地址为E:/repository,方便自己后续查看私服下载是否成功。
<localRepository>E:/repository</localRepository>
然后我们需要配置maven私服的地址,所以我们到nexus的页面找到我们配置的group点击copy。
此时页面就会弹出这个地址的值,我们将其复制下来。
然后在镜像中配置这个私服地址,确保我们后续的依赖都是通过这个私服地址去下载,而该私服地址就是我们上文配置的组合地址,它会严格按照 release仓库->snapshots仓库->阿里云仓库
顺序依次查找,配置如下所示:
<mirrors><mirror> <id>nexus</id> <name>nexus repository</name> <url>http://192.168.43.98:8081/repository/my-group/</url> <mirrorOf>central</mirrorOf> </mirror> </mirrors>
补充说明,如果需要下载快照包的读者需要将mirror注释掉,改用下面这段配置,原因很简单,笔者在测试过程中发现maven默认不允许拉取快照包的,所以我们保留id和url的值,改用下面这段配置确保快照包可以正常拉取。
<profile><id>nexus</id><repositories><repository><id>nexus</id><url>http://192.168.43.98:8081/repository/my-group/</url><releases><enabled>true</enabled></releases><snapshots><enabled>true</enabled></snapshots></repository></repositories></profile></profiles><activeProfiles><activeProfile>nexus</activeProfile>
</activeProfiles>
用到私服时,我们需要其账户密码,所以在setting.xml上方我们需要配置一下和我们mirror的id一直的server标签,表明私服的账户和密码值。
<servers><server><id>nexus</id><username>admin</username><password>123456</password></server></servers>
这两个配置的关系如下所示,通过id来进行关联的。
然后我们创建一个spring boot项目,maven和setting.xml都设置为我们上文修改的maven。打开项目点击reimport。如下图所示,可以看到我们的maven就会到maven私服中下载资源。
完成后查看我们上文配置的仓库,可以发现jar包都从私服那边下载下来了。
回到nexus管理页面,我们也可以看到nexus把代理仓库的jar都缓存下来了。
还记得我们上文提到一个缓存jar包到blob中吗?这个blob默认名字为default,我们不妨到这个目录查看一下default有什么变化。
cd /tmp/sonatype-work/nexus3/blobs/default/
输入du查看大小,可以看到大小变为90M,由此可知阿里云这个代理仓库的依赖都被缓存下来了。
[root@localhost blobs]# du -sh *
90M default
上传自定义组件
接下来我们再来测试一下组件的上传,对此我们首先编写一个maven项目。写下一个测试类。
然后我们在mave项目的pom文件中添加下面这段配置,意为:如果是releases版本则传到releases对应的url,如果是snapshots则传到snapshots的url。
<!-- 如果是releases版本则传到releases对应的url,如果是snapshots则传到snapshots的url--><distributionManagement><repository><id>releases</id><name>Nexus Release Repository</name><url>http://192.168.43.98:8081/repository/maven-releases/</url></repository><snapshotRepository><id>snapshots</id><name>Nexus Snapshot Repository</name><url>http://192.168.43.98:8081/repository/maven-snapshots/</url></snapshotRepository></distributionManagement>
为了确保源码可以被下载,我们还需添加下面这段配置
<build><plugins><!-- 要将源码放上去,需要加入此配置 --><plugin><artifactId>maven-source-plugin</artifactId><version>2.1</version><configuration><attach>true</attach></configuration><executions><execution><phase>compile</phase><goals><goal>jar</goal></goals></execution></executions></plugin></plugins></build>
最后指定我们的maven项目版本为1.0,这意味着这个项目是发布版本,所以它会传到release仓库中。
<groupId>org.example</groupId><artifactId>test-nexus</artifactId><version>1.0</version>
总结一下每个配置的位置如下图所示,读者可以自行核对一下。
注意,我们上文指定了两个新的url,其id对应的账户密码我们也得补充的maven的setting.xml中,内容如下所示:
<server><id>releases</id><username>admin</username><password>123456</password></server><server><id>snapshots</id><username>admin</username><password>123456</password></server><server><id>nexus</id><username>admin</username><password>Z120194199</password></server></servers>
截图如下:
完成后,我们点击clean,再点击deploy。
如果deploy输出下面这段结果就说明部署成功了。
我们不妨到nexus上找到点击browse选择发布仓库。
可以看到我们的jar包传上来了。
同样的我们到maven一栏中通过精确搜索的方式也能找到这个jar包。快照版的jar发布方式也是一样的,这里就不多做介绍了。
下载自定义组件
为了测试jar包是否可用,我们不妨创建一个新的maven项目试着将其引入看看。这里我们不妨介绍一下如何通过nexus获取自定义组件的坐标,首先点击箭头。
然后点击jar包
选择usage,即可看到maven坐标,我们将其复制下来。
然后到新项目中引入,如下图所示
然后等待该项目将从私服中不断下载依赖。
随着时间的推移,我们可以看到该我们自己的组件也下载成功了。
在项目中也能正常使用这个类。
步入源码,点击下载也能正常下载。
可以看到源码正常下载了。
自此我们nexus私服的简单入门就完成了。
一些常见的操作
删除jar包
有时候我们很多没必要的jar包上传多了会占用没必要的内存,我们希望将其从nexus中删除。我们可以选择browser,然后选择发布仓库。
找到要删除的jar包点击删除,随后页面就会提示该删除在后台进行。
随后我们就可以看到这个仓库对应的依赖空了。
我们回到本地,将对应快照包删除,尝试从私服拉取看看能不能拉取到,可以看出私服删除后,本地就拉取不到这个jar包了。
上传jar包
我们不妨接着上一个操作演示一下jar包的上传,点击upload选择mave-release
点击该选项,查找本地jar包
然后手动输入坐标,点击上传
回到broswer,可以看到这个jar包我们上传上来了。
再一次拉取,同步成功,由此nexus基本入门完成。
参考文献
Nexus搭建Maven私服并使用私服
Linux安装nexus3 (带Linux压缩包)
linux配置部署nexus
手动上传SNAPSHOT文件到Maven私服Nexus的方法
解决maven私服nexus无法下载snapshot版本包
Maven不能下载SNAPSHOT包但是能下载RELEASE包的解决办法
相关文章:

基于Nexus搭建Maven私服基础入门
什么是Nexus?它有什么优势? 要了解为什么需要nexus的存在,我们不妨从以下几个问题来简单了解一下: 为什么需要搭建私服?如果没有私服会出现什么问题? 对于企业开发而言,如果没有私服,我们所有…...
JavaScript自执行函数:用途、好处
JavaScript中的自执行函数是一个常见的编程技巧,它可以在特定的场景中发挥重要作用。本文将介绍自执行函数的用途、好处,并提供代码示例进行说明。 引言 在JavaScript编程中,自执行函数是一种特殊的函数调用方式,它能够在定义后…...
Git使用无法拉取
错误提示: error setting certificate verify locations: CAfile: C:/Program Files/Git/mingw64/ssl/certs/ca-bundle.crt CApath: none 问题原因: 这个问题是因为git配置里crt证书的路径不正确导致的 解决办法: 这个路径配置是在C:\Pro…...
来聊聊CAS
什么是CAS CAS全称Compare-And-Swap,是一种无锁编程算法,即比较当前的值与旧值是否相等若相等则进行修改操作(乐观锁机制),该类常用于多线程共享变量的修改操作。而其底层实现也是基于硬件平台的汇编指令,JVM只是封装其调用仅此而…...

【EventBus】EventBus源码浅析
二、EventBus源码解析 目录 1、EventBus的构造方法2、订阅者注册 2.1 订阅者方法的查找过程2.2 订阅者的注册过程1. subscriptionsByEventType 映射:2. typesBySubscriber 映射:2.3 总结订阅者的注册过程 3、事件的发送 3.1 使用Post提交事件3.2 使用p…...

Buck电源设计常见的一些问题(二)MOS管炸机问题
MOS管炸机问题 1.概述2.MOS管的相关参数3.过电压失效4.过电流失效5.静电放电和热失效1.概述 在我们做电源产品或者电机控制器时候,经常会坏MOS管。我相信90%以上的硬件工程师在职场生涯中都会遇到这类问题。然而这类问题也总是让人防不胜防。经常我们都会开玩笑的说,没烧过管…...

Javascript高频面试题
系列文章目录 文章目录 系列文章目录前言1.JavaScript常见数据类型null 和 undefind区别symbol(ES6新增)、bigInt(ES10新增) 2.JavaScript判断数据类型的方式3. 和 区别,分别在什么情况使用?4.变量声明 va…...

锁--07_2---- index merge(索引合并)引起的死锁
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 案例分析生产背景死锁日志表结构执行计划 EXPLAN为什么会用 index_merge(索引合并)为什么用了 index_merge就死锁了解决方案注:M…...

后端打印不了trace等级的日志?-SpringBoot日志打印-Slf4j
在调用log变量的方法来输出日志时,有以上5个级别对应的方法,从不太重要,到非常重要 调用不同的方法,就会输出不同级别的日志。 trace:跟踪信息debug:调试信息info:一般信息warn:警告…...
声明式编程Declarative Programming
接下来要介绍第五种编程范式 -- 声明式编程。分别从它的优缺点、案例分析和适用的编程语言这三个方面来介绍这个歌编程范式。 声明式编程是一种编程范式,其核心思想是通过描述问题的性质和约束,而不是通过描述解决问题的步骤来进行编程。这与命令式编程…...

人工智能与天文:技术前沿与未来展望
人工智能与天文:技术前沿与未来展望 一、引言 随着科技的飞速发展,人工智能(AI)在各个领域的应用越来越广泛。在天文领域,AI也发挥着越来越重要的作用。本文将探讨人工智能与天文学的结合,以及这种结合带…...
JeecgBoot 框架升级至 Spring Boot3 的实战步骤
JeecgBoot 框架升级 Spring Boot 3.1.5 步骤 JEECG官方推出SpringBoot3分支:https://github.com/jeecgboot/jeecg-boot/tree/springboot3 本次更新由于属于破坏式更新,有几个生态内的组件,无法进行找到平替或无法升级,目前尚不完…...

论文阅读——Semantic-SAM
Semantic-SAM可以做什么: 整合了七个数据集: 一般的分割数据集,目标级别分割数据集:MSCOCO, Objects365, ADE20k 部分分割数据集:PASCAL Part, PACO, PartImagenet, and SA-1B The datasets are SA-1B, COCO panopt…...

gitlab下载,离线安装
目录 1.下载 2.安装 3.配置 4.启动 5.登录 参考: 1.下载 根据服务器操作系统版本,下载对应的RPM包。 gitlab官网: The DevSecOps Platform | GitLab rpm包官网下载地址: gitlab/gitlab-ce - Results in gitlab/gitlab-ce 国内镜像地…...

【SpringBoot篇】Interceptor拦截器 | 拦截器和过滤器的区别
文章目录 🌹概念⭐作用 🎄快速入门⭐入门案例代码实现 🛸拦截路径🍔拦截器interceptor和过滤器filter的区别🎆登录校验 🌹概念 拦截器(Interceptor)是一种软件设计模式,…...
conan入门(三十六):在set_version方法中从pom.xml中读取版本号实现动态版本定义
一般情况下,我们通过self.version字段定义conan 包的版本号如下: class PkgConan(ConanFile):name "pkg"version "1.7.3"因为版本号是写死的,所以这种方式有局限性: 比如我的java项目中版本号是在pom.xml中…...

为什么 GAN 不好训练
为什么 GAN 不好训练?先看 GAN 的损失: 当生成器固定时,堆D(x)求导,推理得到(加号右边先对log求导,再对负项求导) 然后在面对最优Discriminator时,Generator的优化目标就变成了&…...
select、poll、epoll 区别有哪些
文章目录 select、poll、epoll 区别有哪些?select:poll:epoll: select、poll、epoll 区别有哪些? select: 它仅仅知道了,有 I/O 事件发生了,却并不知道是哪那几个流(可…...

大模型下开源文档解析工具总结及技术思考
1 基于文档解析工具的方法 pdf解析工具 导图一览: PyPDF2提取txt: import PyPDF2 def extract_text_from_pdf(pdf_path):with open(pdf_path, rb) as file:pdf_reader PyPDF2.PdfFileReader(file)num_pages pdf_reader.numPagestext ""f…...

【华为数据之道学习笔记】5-4 数据入湖方式
数据入湖遵循华为信息架构,以逻辑数据实体为粒度入湖,逻辑数据实体在首次入湖时应该考虑信息的完整性。原则上,一个逻辑数据实体的所有属性应该一次性进湖,避免一个逻辑实体多次入湖,增加入湖工作量。 数据入湖的方式…...

网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...

HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...

用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...

Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...