基于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 数据入湖方式
数据入湖遵循华为信息架构,以逻辑数据实体为粒度入湖,逻辑数据实体在首次入湖时应该考虑信息的完整性。原则上,一个逻辑数据实体的所有属性应该一次性进湖,避免一个逻辑实体多次入湖,增加入湖工作量。 数据入湖的方式…...
Vue3-03-reactive() 响应式基本使用
reactive() 的简介 reactive() 是vue3 中进行响应式状态声明的另一种方式; 但是,它只能声明 【对象类型】的响应式变量,【不支持声明基本数据类型】。reactive() 与 ref() 一样,都是深度响应式的,即对象嵌套属性发生了…...
OpenAI开源超级对齐方法:用GPT-2,监督、微调GPT-4
12月15日,OpenAI在官网公布了最新研究论文和开源项目——如何用小模型监督大模型,实现更好的新型对齐方法。 目前,大模型的主流对齐方法是RLHF(人类反馈强化学习)。但随着大模型朝着多模态、AGI发展,神经元…...
TeeChart.NET 2023.11.17 Crack
.NET 的 TeeChart 图表控件提供了一个出色的通用组件套件,可满足无数的图表需求,也针对重要的垂直领域,例如金融、科学和统计领域。 数据可视化 数十种完全可定制的交互式图表类型、地图和仪表指示器,以及完整的功能集,…...
计算机网络常见的缩写
计算机网络常见缩写 通讯控制处理机(Communication Control Processor)CCP 前端处理机(Front End Processor)FEP 开放系统互连参考模型 OSI/RM 开放数据库连接(Open Database Connectivity)ODBC 网络操作系…...
vue cli 脚手架之配置代理
方法二...
STM32启动流程详解(超全,startup_stm32xx.s分析)
单片机上电后执行的第一段代码 1.初始化堆栈指针 SP_initial_sp 2.初始化 PC 指针Reset_Handler 3.初始化中断向量表 4.配置系统时钟 5.调用 C 库函数_main 初始化用户堆栈,然后进入 main 函数。 在正式讲解之前,我们需要了解STM32的启动模式。 STM32的…...
小程序接口OK,桌面调试接口不行
手机小程序OK,桌面版出现问题; 环境:iis反向url的tomcat服务,提供接口。 该接口post了一个很大的数组,处理时间比较久。 1)桌面调试出现错误,提示 用apipost调用接口同样出错, 502 - Web 服务器在作为网关或代理服…...
【贪心】LeetCode-406. 根据身高重建队列
406. 根据身高重建队列。 假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。 请你重新…...
【C++11特性篇】C++11中新增的initializer_list——初始化的小利器
前言 大家好吖,欢迎来到 YY 滴C11系列 ,热烈欢迎! 本章主要内容面向接触过C的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! 目录 一.探究std::initializer_list是什么…...
springboot(ssm宠物美容机构CRM系统 宠物服务商城系统Java系统
springboot(ssm宠物美容机构CRM系统 客户关系管理系统Java系统 开发语言:Java 框架:ssm/springboot vue JDK版本:JDK1.8(或11) 服务器:tomcat 数据库:mysql 5.7(或8.0ÿ…...
小白怎么建设网站/百度网站域名
第一步:插件下载 http://spring.io/tools/sts/all 安装包链接 第二步:插件安装 第三步:安装成功检测 转载:http://www.cnblogs.com/damowang/p/6225076.html...
阜阳建设部网站/windows优化大师好用吗
一. 收集器 JVM通过GC来回收堆和方法区中的内存,通常采用收集器的方式实现GC,主要的收集器有引用计数收集器和跟踪收集器。 1、 引用计数收集器 引用计数收集器采用分散式的管理方式,通过计数器记录对象是否被引用。 引用计数收集器需要在每次…...
企业邮箱查找/莆田百度seo公司
今天来实现以下大众点评客户端的横向listview二级列表,先看一下样式。 这种横向的listview二级列表在手机软件上还不太常见,但是使用过平板的都应该知道,在平板上市比较常见的。可能是因为平板屏幕比较大,而且也能展现更多的内容。…...
大学生怎么做网站支付模块/百度推广登陆入口
过去几天我一直在努力解决这个问题.我使用JBPM 6.1.0.Final构建.我使用了这个mavenexample webapp project.关于环境设置的快速警告:我只能在JBoss EAP 6.3中部署该项目.我在Wildfly 8.1和8.2中尝试过,但我一直遇到错误,我无法弄清楚如何修复,所以你的milage可能会有…...
做门窗投标网站/ip域名解析查询
2012年12月21日的末日之说在网上传得很历害,当一切变得虚虚实实之时,很多专业人士就开始关心刀片服务器的安全问题了,由其是HP惠普刀片服务器与IBM刀片服务器,这两家的刀片服务器一直是全球服务器市场的主流配置,大家只…...
wordpress链接里的图像地址/郑州seo技术服务顾问
https://blog.csdn.net/p942005405/article/details/84764104 评论区: 上面的所有结论都是基于什么得到的?真是武断!!STL的实现版本很多,VS、GCC版本不同,实现都不同,建议翻看STL源代码。 新版…...