当前位置: 首页 > news >正文

Maven 私服的搭建与使用(一)

一、引言

在 Java 项目开发中,Maven 作为强大的项目管理和构建工具,极大地提高了开发效率,而 Maven 私服在开发过程中也扮演着至关重要的角色。私服是一种特殊的远程仓库,架设在局域网内,代理广域网上的远程仓库,供局域网内的 Maven 用户使用。当 Maven 需要下载构件时,它首先从私服请求,如果私服上不存在该构件,才从外部的远程仓库下载,缓存在私服上之后,再为 Maven 的下载请求提供服务。

搭建 Maven 私服有诸多好处。在带宽方面,对于一个团队或企业来说,如果所有成员都直接从中央仓库或其他公共远程仓库下载依赖,会消耗大量的外网带宽。有了私服后,只需首次从外网下载构件,后续团队成员都可从私服获取,大大节省了带宽资源 。比如在一个拥有 100 人的开发团队中,若每人每天因构建项目需从外网下载 100MB 的依赖,那么一天就会消耗 10GB 的外网带宽,而使用私服后,外网带宽消耗将大幅减少。

构建速度上,不停连接请求外部仓库相当耗时,特别是当项目配置了很多外部远程仓库时,构建速度会明显降低。使用私服,Maven 只需检查局域网内部私服的数据,构建速度便会有显著提高。假设一个项目构建时原本需要连接外部仓库 10 次,每次平均耗时 5 秒,那么构建一次就需要 50 秒,使用私服后,若连接私服平均每次耗时 1 秒,构建一次则只需 10 秒,构建效率大幅提升。

此外,在一些情况下,我们可能需要使用一些无法从外部仓库下载到的构件,比如 Oracle 的 JDBC 驱动由于版本原因不能发布到公共仓库中。建立私服后,便可以将这些构件部署到这个内部仓库中,供内部 Maven 项目使用。同时,私服还能提高稳定性,增强控制。当外网不可用时,Maven 构建有可能因为依赖没有下载而不可行,搭建并应用私服后,即使没有外网,如果该构件之前被其他人下载过就会存在私服上,此时再次依赖该构件就可以不用连接外网,直接从私服上下载到。

本文将详细介绍 Maven 私服的搭建与使用,帮助大家充分利用 Maven 私服提升开发效率。

二、Maven 私服简介

2.1 什么是 Maven 私服

Maven 私服是一种特殊的 Maven 远程仓库,它架设在局域网内 ,主要用于代理外部的远程仓库,如中央仓库以及其他远程公共仓库。私服的存在,就像是在局域网内建立了一个专属的资源中转站。当项目需要下载构件时,Maven 首先会向私服发起请求,如果私服中有该构件,就会直接下载到本地仓库供项目使用;若私服中没有,它才会去外部的远程仓库下载,然后将下载的构件缓存到私服,以便下次有相同需求时可以直接从私服获取 。这就好比你所在的社区建立了一个图书馆,大家需要借阅书籍时,先到社区图书馆找,如果没有,社区图书馆再去更大的图书馆借回来,同时把借回来的书存放在社区图书馆,方便下次借阅。这样一来,私服就大大提高了构件的获取效率,减少了对外部网络的依赖和重复下载。

2.2 Maven 私服的优势

  • 节省带宽:在一个团队或企业中,如果没有私服,每个成员在构建项目时都直接从外部远程仓库下载依赖,会消耗大量的外网带宽资源。有了私服后,团队成员首次从外网下载构件到私服,后续其他人就可以直接从私服获取,大大节省了外网带宽。例如,一个拥有 50 名开发人员的团队,每天构建项目可能需要下载大量的依赖包,假设每个依赖包平均大小为 5MB,若没有私服,每天因下载依赖包消耗的外网带宽就可能达到 50 * 5MB = 250MB,而使用私服后,外网带宽的消耗会显著降低。
  • 加快下载速度:私服位于局域网内,与外部远程仓库相比,从私服下载构件的速度更快且更稳定。在构建项目时,减少了等待依赖下载的时间,从而提高了构建效率。当项目依赖较多时,若直接从外部仓库下载,可能会因为网络波动等原因导致下载速度缓慢,甚至下载失败。而通过私服下载,由于网络环境更稳定,下载速度会得到明显提升,比如原本从外部仓库下载一个 20MB 的依赖包需要 1 分钟,从私服下载可能只需要 10 秒左右。
  • 便于部署第三方构件:在实际开发中,有些构件无法从外部仓库下载到,如公司内部的私有构件、某些受版权限制的第三方库(如 Oracle 的 JDBC 驱动)等。建立私服后,就可以将这些构件部署到私服中,供内部 Maven 项目使用,方便团队成员共享和管理这些特殊的构件。
  • 提高稳定性和增强控制:如果项目构建高度依赖外部远程仓库,当外部网络不稳定时,构建过程就会受到影响,甚至导致构建失败。而私服缓存了所需的构件,即使外部网络状况不佳甚至中断,只要私服中已经缓存了相应构件,Maven 项目依然能够正常构建 。此外,一些私服软件(如 Nexus)还提供了丰富的控制功能,如权限管理、版本控制等,可以对仓库进行更高级的管理,确保项目的稳定性和安全性。比如,通过权限管理,可以限制不同人员对构件的访问和操作权限,防止误操作或非法访问。

2.3 常见的 Maven 私服产品

  • Nexus:由 Sonatype 公司推出,是目前最流行、使用最广泛的 Maven 私服产品。它提供了强大的仓库管理功能和构件搜索功能,基于 REST 架构,拥有友好的 UI 界面(基于 ext.js 的 REST 客户端),占用内存较少,并且使用简单文件系统而非数据库来组织数据 。Nexus 支持多种仓库格式,除了 Maven 仓库,还支持 npm、Docker 等仓库,能满足不同项目和团队的多样化需求。许多大型企业和开源项目都选择使用 Nexus 来搭建私服,例如一些互联网公司的内部项目开发中,Nexus 被广泛应用于管理项目依赖和构件。
  • Artifactory:JFrog 公司开发的一款领先的构建制品仓库管理工具,支持各种构建工具,如 Maven、Gradle、npm 等。它具有高度可伸缩性和灵活的部署选项,可以根据企业的规模和需求进行定制化部署。Artifactory 提供了丰富的功能,包括版本控制、访问控制、安全扫描、依赖分析等,能够帮助企业更好地管理软件制品,保障项目的安全和稳定。不过,Artifactory 是一款商用产品,相比一些开源的私服产品,使用成本较高,但对于对功能和服务有较高要求的企业来说,它是一个不错的选择。
  • Apache Archiva:这是由 Apache 软件基金会提供的开源 Maven 私服工具,提供了基本的仓库管理功能,适用于小型项目或对简单配置有需求的团队。它的优点是简单易用,部署和配置相对较为简便,对于一些资源有限、项目规模较小的团队来说,使用 Apache Archiva 搭建私服是一个经济实惠的选择 。虽然它的功能没有 Nexus 和 Artifactory 那么丰富和强大,但对于一些基础的仓库管理需求,如构件的存储、下载和简单的权限控制等,也能够很好地满足。

三、搭建 Maven 私服(以 Nexus 为例)

在众多 Maven 私服产品中,Nexus 以其强大的功能、友好的界面和广泛的应用而备受青睐,因此本文选择 Nexus 来详细介绍 Maven 私服的搭建过程。

3.1 准备工作

在搭建 Nexus 私服之前,需要确保系统中已经安装了 Java 环境。Nexus 要求 Java 版本为 1.8 及以上 ,你可以通过以下命令检查 Java 版本:

 

java -version

如果系统中没有安装 Java 或者 Java 版本不符合要求,请先安装或升级 Java 环境。

此外,还需要下载 Nexus 安装包。Nexus 官方提供了多种版本的下载,包括适用于 Windows、Linux 等不同操作系统的版本。你可以访问 Nexus 官方下载页面:https://help.sonatype.com/repomanager3/product-information/download,根据你的操作系统选择合适的版本进行下载。

3.2 下载与安装 Nexus

以 Windows 系统为例,下载完成后,得到一个压缩包(如nexus-3.x.x-01-win64.zip)。将压缩包解压到你希望安装 Nexus 的目录,例如D:\nexus 。解压完成后,进入解压后的nexus-3.x.x-01\bin目录,该目录下有nexus.exe文件。

启动 Nexus 有两种方式,一种是在命令行中运行nexus.exe /run,这种方式会在前台启动 Nexus,控制台会输出 Nexus 的启动信息,便于查看启动过程中的日志和错误信息;另一种方式是运行nexus.exe /install将 Nexus 安装为系统服务,然后通过net start nexus命令启动服务 ,这种方式适合在后台长期运行 Nexus,即使关闭命令行窗口,Nexus 服务依然会继续运行。

3.3 初始设置

Nexus 启动成功后,打开浏览器,访问http://localhost:8081(默认端口为 8081,如果在启动前修改了端口配置,则需使用修改后的端口),进入 Nexus 登录页面。

首次登录 Nexus 时,用户名是admin,密码需要从sonatype-work\nexus3\admin.password文件中获取 。打开该文件,复制其中的密码,然后在登录页面输入用户名和密码进行登录。登录成功后,系统会提示修改密码,按照提示设置新的密码。

为了提高私服的安全性,建议禁用匿名登录。在 Nexus 界面中,点击右上角的用户头像,选择 “Settings”,在左侧菜单中选择 “Anonymous”,将 “Allow anonymous users to access the server” 选项的勾选去掉,然后点击 “Save” 保存设置。这样,只有通过认证的用户才能访问 Nexus 私服。

3.4 认识 Nexus 中的仓库

Nexus 默认创建了多个仓库,这些仓库根据其用途和类型可以分为不同的类别。

  • maven-central:这是一个代理仓库,它代理了 Maven 中央仓库,用于从中央仓库下载构件到私服。当本地项目需要某个构件时,如果私服中没有,就会从这个代理仓库去中央仓库查找并下载,然后缓存到私服中,方便后续再次使用。
  • maven-releases:宿主仓库,用于存储项目发布的正式版本构件。通常,当项目开发完成,准备发布正式版本时,会将构件部署到这个仓库中。
  • maven-snapshots:同样是宿主仓库,用于存储项目开发过程中的快照版本构件。快照版本是指在开发过程中,尚未正式发布的版本,这些版本可能会频繁更新,通过这个仓库可以方便地管理和获取这些快照版本的构件。
  • maven-public:仓库组,它将多个仓库组合在一起,方便用户进行统一的访问。例如,它可以包含maven-central、maven-releases、maven-snapshots等仓库,当配置项目的依赖仓库时,只需要配置这个仓库组,就可以同时访问组内的所有仓库,简化了配置过程 。

3.5 配置私服

为了提高下载速度,我们可以将中央仓库的位置修改为阿里云镜像地址。在 Nexus 界面中,点击左侧菜单中的 “Repositories”,找到 “maven-central” 仓库,点击进入其配置页面。在 “Remote Storage” 部分,将 “URL” 修改为阿里云镜像地址:http://maven.aliyun.com/nexus/content/groups/public/,然后点击 “Save” 保存配置。

创建 hosted 类型的仓库,用于存储我们自己项目的发布版本(release)和快照版本(snapshot)。点击 “Create repository” 按钮,在弹出的仓库类型选择页面中,选择 “maven2 (hosted)”。

  • 创建 release 仓库:在创建仓库的配置页面中,填写仓库的 “Name”(例如maven-releases),“Version Policy” 选择 “Release”,“Deployment Policy” 选择 “Allow redeploy”(允许重新部署,方便在开发过程中对构件进行更新),其他配置保持默认,然后点击 “Create repository” 按钮完成创建。
  • 创建 snapshot 仓库:同样点击 “Create repository” 按钮,选择 “maven2 (hosted)”,在配置页面中填写 “Name”(例如maven-snapshots),“Version Policy” 选择 “Snapshot”,“Deployment Policy” 选择 “Allow redeploy”,其他配置默认,点击 “Create repository” 按钮完成创建。

在实际使用中,为了更好地管理权限,我们可以添加角色和用户。点击左侧菜单中的 “Security”,然后选择 “Roles”,点击 “Create role” 按钮创建新角色。在创建角色页面,填写角色的 “Name” 和 “Description”,并在 “Privileges” 部分为角色分配相应的权限,例如 “nx-repository-view-< 仓库名 >--read” 表示对某个仓库的读取权限,“nx-repository-view-< 仓库名>--write” 表示对某个仓库的写入权限等。根据实际需求为角色分配好权限后,点击 “Create role” 按钮完成角色创建。

创建用户,点击 “Security” 下的 “Users”,然后点击 “Create local user” 按钮。在创建用户页面,填写 “User ID”、“Password”、“Full Name” 等信息,并在 “Roles” 部分选择为该用户分配之前创建的角色,最后点击 “Create user” 按钮完成用户创建。通过这样的角色和用户管理,可以实现对不同人员访问和操作私服仓库的精细控制。

相关文章:

Maven 私服的搭建与使用(一)

一、引言 在 Java 项目开发中&#xff0c;Maven 作为强大的项目管理和构建工具&#xff0c;极大地提高了开发效率&#xff0c;而 Maven 私服在开发过程中也扮演着至关重要的角色。私服是一种特殊的远程仓库&#xff0c;架设在局域网内&#xff0c;代理广域网上的远程仓库&…...

Ubuntu20.04双系统安装及软件安装(五):VSCode

Ubuntu20.04双系统安装及软件安装&#xff08;五&#xff09;&#xff1a;VSCode 打开VScode官网&#xff0c;点击中间左侧的deb文件下载&#xff1a; 系统会弹出下载框&#xff0c;确定即可。 在文件夹的**“下载”目录**&#xff0c;可看到下载的安装包&#xff0c;在该目录下…...

linux网络(3)—— socket编程(1)socket基础认识

欢迎来到博主的专栏&#xff1a;linux网络 博主ID&#xff1a;代码小豪 文章目录 IP与端口号socket字节序问题 IP与端口号 我们现在知道了&#xff0c;只要发送的报文的报头包含目的IP地址和源IP地址&#xff0c;就能通过通信设备&#xff0c;是两台主机进行远程通信&#xff…...

【Kubernets】K8S内部nginx访问Service资源原理说明

文章目录 原理概述**一、核心概念****二、Nginx 访问 Service 的流程****1. Service 的作用****2. Endpoint 的作用****3. Nginx Pod 发起请求****(1) DNS 解析****(2) 流量到达 kube-proxy****(3) 后端 Pod 处理请求** **三、不同代理模式的工作原理****1. iptables 模式****2…...

使用Docker搭建Oracle Database 23ai Free并扩展MAX_STRING_SIZE的完整指南

使用Docker搭建Oracle Database 23ai Free并扩展MAX_STRING_SIZE的完整指南 前言环境准备目录创建启动Docker容器 数据库配置修改进入容器启动SQL*PlusPDB操作与字符串扩展设置配置验证 管理员用户创建注意事项总结 前言 本文将详细讲解在Docker环境中配置Oracle Database 23a…...

使用pytorch和opencv根据颜色相似性提取图像

需求&#xff1a;将下图中的花朵提取出来。 代码&#xff1a; import cv2 import torch import numpy as np import timedef get_similar_colors(image, color_list, threshold):# 将图像和颜色列表转换为torch张量device torch.device(cuda if torch.cuda.is_available() el…...

MySQL 8.X 报错处理

1.重新加载配置 reload the configuration mysql> ALTER INSTANCE RELOAD KEYRING; ERROR 1227 (42000): Access denied; you need (at least one of) the ENCRYPTION_KEY_ADMIN privilege(s) for this operation 提示需要ENCRYPTION_KEY_ADMIN权限 重新授权 GRANT ENCR…...

Ubuntu 22.04安装OpenJDK 17

步骤一&#xff1a;更新软件包 sudo apt update步骤二&#xff1a;安装openjdk-17 sudo apt install openjdk-17-jdk当系统要求输入密码时&#xff0c;请输入密码。然后键入 Y 并按 Enter 继续安装 步骤三&#xff1a;查看安装版本 java -version步骤四&#xff1a;查看安装…...

【时序预测】时间序列有哪些鲁棒的归一化方法

时间序列数据在金融、气象、医疗等领域中广泛存在&#xff0c;而股票数据作为典型的时间序列之一&#xff0c;具有非平稳性、噪声多、波动大等特点。为了更好地进行数据分析和建模&#xff0c;归一化是一个重要的预处理步骤。然而&#xff0c;由于时间序列数据的特殊性&#xf…...

nlp第九节——文本生成任务

一、seq2seq任务 特点&#xff1a;输入输出均为不定长的序列 自回归语言模型&#xff1a; 由前面一个字预测下一个字的任务 encoder-decoder结构&#xff1a; Encoder-Decoder结构是一种基于神经网络完成seq2seq任务的常用方案 Encoder将输入转化为向量或矩阵&#xff0c;其…...

STM32MP1xx的启动流程

https://wiki.st.com/stm32mpu/wiki/Boot_chain_overview 根据提供的知识库内容&#xff0c;以下是STM32 MPU启动链的详细解析&#xff1a; 1. 通用启动流程 STM32 MPU启动分为多阶段&#xff0c;逐步初始化外设和内存&#xff0c;并建立信任链&#xff1a; 1.1 ROM代码&…...

wgcloud-server端部署说明

Wgcloud 是一款开源的轻量级服务器监控系统&#xff0c;支持多平台&#xff0c;可对服务器的 CPU、内存、磁盘、网络等指标进行实时监控。 以下是 Wgcloud Server端的详细部署步骤&#xff1a; 环境准备 服务器&#xff1a; 至少准备两台服务器&#xff0c;一台作为监控端&a…...

大模型Agent:人工智能的崭新形态与未来愿景

在人工智能技术高歌猛进的当下&#xff0c;大模型 Agent 作为 AI 领域的关键研究方向&#xff0c;正日益彰显出其独有的魅力以及广阔无垠的应用前景。大模型 Agent 不但具备对环境的感知、自主的理解、决策的制定以及行动的执行能力&#xff0c;而且能够游刃有余地应对繁杂任务…...

专题二最大连续1的个数|||

1.题目 题目分析&#xff1a; 给一个数字k&#xff0c;可以把数组里的0改成1&#xff0c;但是只能改k次&#xff0c;然后该变得到的数组能找到最长的子串且都是1。 2.算法原理 这里不用真的把0变成1&#xff0c;因为改了比较麻烦&#xff0c;下次用就要改回成1&#xff0c;这…...

【ORACLE】ORACLE19C在19.13版本前的一个严重BUG-24761824

背景 最近在某客户的ORACLE开发环境(oracle 19.10)中&#xff0c;发现一个非常奇怪情况, 开发人员反馈&#xff0c;有一条SQL&#xff0c;查询了两个sum函数作为两个字段&#xff0c; select sum(c1),sum(c2) from ...当两个sum一起出现时&#xff0c;第一个sum的结果不对&am…...

2025国家护网HVV高频面试题总结来了03(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 0x1 高频面试题第一套 0x2 高频面试题第二套 0x3 高频面试题第三套 0x4高频面试题第四套 0x1 高频面试题…...

CentOS vs Ubuntu - 常用命令深度对比及最佳实践指南20250302

CentOS vs Ubuntu - 常用命令深度对比及最佳实践指南 引言 在 Linux 服务器操作系统领域&#xff0c;CentOS 和 Ubuntu 是广泛采用的发行版。它们在命令集、默认工具链及生态系统方面各有特点。本文深入剖析 CentOS 与 Ubuntu 在常用命令层面的异同&#xff0c;并结合实践案例…...

SQL命令详解之常用函数

目录 1 简介 2 字符串函数 2.1 字符串函数语法 2.2 字符串函数练习 3 数学函数 3.1 数学函数语法 3.2 数学函数练习 4 日期时间函数 4.1 日期时间函数语法 4.2 日期时间函数练习 5 条件函数 5.1 条件函数语法 5.2 条件函数练习 6 总结 1 简介 在SQL中我们经常会用…...

IndexError: index 0 is out of bounds for axis 1 with size 0

IndexError: index 0 is out of bounds for axis 1 with size 0 欢迎来到英杰社区&#xff0c;这里是博主英杰https://bbs.csdn.net/topics/617804998 报错原因 数组或数据结构为空 如果数组或 DataFrame 在指定的维度上没有任何元素&#xff08;例如&#xff0c;没有列&#x…...

C++学习之C++初识、C++对C语言增强、对C语言扩展

一.C初识 1.C简介 2.第一个C程序 //#include <iostream> //iostream 相当于 C语言下的 stdio.h i - input 输入 o -output 输出 //using namespace std; //using 使用 namespace 命名空间 std 标准 &#xff0c;理解为打开一个房间&#xff0c;房间里有我们所需…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

Go 并发编程基础:通道(Channel)的使用

在 Go 中&#xff0c;Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式&#xff0c;用于在多个 Goroutine 之间传递数据&#xff0c;从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...