让我们彻底了解Maven(二)--- Maven私服的搭建

2023-11-14

首先我们为什么需要搭建Maven私服,一切技术来源于解决需求,因为我们在实际开发中,当我们研发出来一个公共组件,为了能让别的业务开发组用上,则搭建一个远程仓库很有必要,写完公用组件后,直接发布到远程仓库,别人需要用到时,直接从远程仓库拉取即可,而你升级组件后,只需要再发布一个新版本即可。

Maven私服技术,最常用的就是基于Nexus来搭建

1. Nexus搭建过程

首先我们需要下载Nexus,官网如下:
Nexus官网

在这里插入图片描述
官网不好下载,我费了好大劲下载下来,不过是3.37版本,比较稳定,大家可以从下面这个地址下载:
https://download.csdn.net/download/wu2374633583/87879453

我这里演示用的是windows版本。
解压以后大家就可以看到如下:
在这里插入图片描述

nexus-3.37.3-02:里面会放Nexus启动时所需要的依赖、环境配置;
sonatype-work:存放Nexus运行时的工作数据,如存储上传的jar包等。

我们可以打开下面这个文件,修改一些默认配置,默认端口号是8081,如果你这个端口已被使用,就可以修改,通常不需要更改。

D:\nexus\nexus-3.37.3-02\etc\nexus-default.properties

接着去bin目录下,打开cmd终端,执行启动命令:

nexus.exe /run nexus

时间会比较长,耐心等待一段时间后,我等了足足十几分钟,如果看到如下:
在这里插入图片描述

表示启动成功,Nexus初次启动后,会在sonatype-work目录中生成一个/nexus3/admin.password文件,这里面存放着你的初始密码,默认账号就是admin,在浏览器输入:

http://localhost:8081

访问Nexus界面,通过初始密码登录,登录后修改密码,改完密码记得重新登录一次,否则后面的操作会没有权限。
在这里插入图片描述
在这里插入图片描述

2. Nexus私服仓库介绍

在这里插入图片描述

登录成功后,点击Repositories会看到一些默认仓库,每个字段含义如下:

Name:仓库的名字;
Type:仓库的类型;
Format:仓库的格式;
Status:仓库的状态;
URL:仓库的网络地址。

仓库总共分为四种类型,如下:
在这里插入图片描述
仓库的关系如下:
在这里插入图片描述
注意的是,本地的Maven需要配置私服地址,当项目需要的依赖,在本地仓库没有,就会去到相应的宿主/远程仓库拉取;如果宿主仓库也没有,就会根据配置的代理仓库地址,去到中央仓库拉取。

3. Maven的私服配置

步骤1: 修改配置文件

Maven要使用私服,需要修改settings.xml文件。修改settings.xml里的镜像源配置,之前配的阿里云镜像不能用了,改成如下:

<mirror>
    <id>nexus-zhuzi</id>
    <mirrorOf>*</mirrorOf>
    <url>http://localhost:8081/repository/maven-public/</url>
</mirror>

步骤2: 在私服中修改访问权限,允许匿名用户访问

在这里插入图片描述
最后记得保存。

步骤3:在私服中配置代理仓库地址,即配置镜像源

在这里插入图片描述
在这里插入图片描述

将默认的中央仓库地址,改为阿里云镜像:

http://maven.aliyun.com/nexus/content/groups/public/

点击Save保存即可。

步骤4:在Maven的settings.xml中,配置私服的账号密码
<servers>标签下,配置如下:

<server>
  <id>maven-test-release</id>
  <username>admin</username>
  <password>你的私服账号密码</password>
</server>

<server>
  <id>maven-test-snapshot</id>
  <username>admin</username>
  <password>你的私服账号密码</password>
</server>

4. 项目配置私服

前面配置了本地Maven与私服的关系,接着要配置项目和私服的连接。

步骤1: 为项目创建对应的私服仓库,如果已有仓库,可以直接复用。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

我们要注意的就是仓库格式,有三个可选项:

  • Release:稳定版,表示存放可以稳定使用的版本仓库;
  • Snapshot:快照版,代表存储开发阶段的版本仓库;
  • Mixed:混合版,不区分格式,表示混合存储代码的仓库。

为了规范性,建议是Release、Snapshot格式的仓库,各自都创建一个。

步骤2: 在Maven工程的pom.xml文件中,配置对应的私服仓库地址。

<!-- 配置当前工程,在私服中保存的具体位置 -->
<distributionManagement>
    <repository>
        <!-- 这里对应之前 settings.xml 里配置的server-id -->
        <id>maven-test-release</id>
        <!-- 这里代表私服仓库的地址,大家只需要把后面的名字换掉即可 -->
        <url>http://localhost:8081/repository/maven-test-release/</url>
    </repository>
    <snapshotRepository>
        <id>maven-test-snapshot</id>
        <url>http://localhost:8081/repository/maven-test-snapshot/</url>
    </snapshotRepository>
</distributionManagement>

步骤3:将当前项目发布到私服仓库

这里可以执行mvn clean deploy命令,也可以通过IDEA工具完成:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这里要注意:
由于配置了私服上的两个宿主仓库,一个为稳定仓库,另一个为快照仓库,所以发布时,默认会根据当前项目的<version>版本结尾,来选择上传到相应的仓库,例如上图中的结尾是SNAPSHOT,所以会被发布到快照仓库,如果结尾不是这个后缀时,就会被发布到Release仓库。

还有就是,你要发布的包不能带有上级,即不能有parent依赖,否则在其他人在拉取该项目时,会找不到其父项目而构建失败。要解决这个问题,可以先将parent项目打包并上传至远程仓库,然后再发布依赖于该parent项目的子模块。

5. Nexus配置仓库组

如果我们所处的公司,是一个大型企业,不同团队都有着各自的宿主仓库,而你如果需要其他团队的组件,这时我们不需要在pom.xml中,将远程仓库地址先改为其他团队的地址,而是可以创建一个仓库组来解决。

步骤1: 创建仓库组

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
大家可以看到,图中的Members区域代表当前仓库组的成员,而这些成员会按照你排列的顺序,具备不同的优先级,越靠前的优先级越高。创建好仓库组后,接着可以去配置一下仓库组,这里有两种方式。

步骤2:配置单个工程与仓库组的映射

这种方式只需修改pom.xml即可:

<repositories>
    <repository>
        <id>maven-test</id>
        <!-- 配置仓库组的地址 -->
        <url>http://localhost:8081/repository/maven-test/</url>
        <!-- 允许从中拉取稳定版的依赖 -->
        <releases>
            <enabled>true</enabled>
        </releases>
        <!-- 也允许从中拉取快照版的依赖 -->
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
    </repository>
</repositories>

<pluginRepositories>
    <pluginRepository>
        <id>plugin-group</id>
        <url>http://localhost:8081/repository/maven-test/</url>
        <releases>
            <enabled>true</enabled>
        </releases>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
    </pluginRepository>
</pluginRepositories>

在上述这组配置中,配置了<repositories>、<pluginRepositories>两个标签,第一个是普通依赖的仓库组地址,第二个是插件依赖的仓库组地址,前者针对于pom.xml中的<dependency>标签生效,后者针对<plugin>标签生效。

当你通过GAV坐标,引入一个依赖时,如果本地仓库中没找到,则会根据配置的仓库组地址,去到Nexus私服上拉取依赖。不过因为仓库组是由多个仓库组成的,所以拉取时,会根据仓库的优先级,依次搜索相应的依赖,第一个仓库将是最优先搜索的仓库。

步骤3: 配置本地Maven与仓库组的映射

上一种配置方式,只针对于单个Maven工程生效,如果你所有的Maven工程,都需要与Nexus私服上的仓库组绑定,这时就可以直接修改settings.xml文件,如下:

<profile>
	<id>maven-test</id>
	<repositories>
		<repository>
			<id>nexus-maven</id>
			<url>http://localhost:8081/repository/maven-test/</url>
			<releases>
				<enabled>true</enabled>
				<updatePolicy>always</updatePolicy>
			</releases>
			<snapshots>
				<enabled>true</enabled>
				<updatePolicy>always</updatePolicy>
			</snapshots>
		</repository>
	</repositories>
 
	<pluginRepositories>
		<pluginRepository>
			<id>nexus-maven</id>
			<url>http://localhost:8081/repository/maven-test/</url>
			<releases>
				<enabled>true</enabled>
				<updatePolicy>always</updatePolicy>
			</releases>
			<snapshots>
				<enabled>true</enabled>
				<updatePolicy>always</updatePolicy>
			</snapshots>
		</pluginRepository>
	</pluginRepositories>
</profile>

这组配置要写在<profiles>标签里面,其他的与前一种方式没太大区别,唯一不同的是多了一个<updatePolicy>标签,该标签的作用是指定仓库镜像的更新策略,可选项如下:

  • always:每次需要Maven依赖时,都先尝试从远程仓库下载最新的依赖项;
  • daily:每天首次使用某个依赖时,从远程仓库中下载一次依赖项;
  • interval:X:每隔X个小时,下载一次远程仓库的依赖,X只能是整数;
  • never:仅使用本地仓库中已经存在的依赖项,不尝试从远程仓库中拉取。

Maven工程使用依赖时,首先会从本地仓库中查找所需的依赖项,如果本地仓库没有,则从配置的远程仓库下载这时会根据<updatePolicy>策略来决定是否需要从远程仓库下载依赖。

还得激活一下上述配置:

<activeProfiles>
    <!-- 这里写前面配置的ID -->
	<activeProfile>maven-test</activeProfile>
</activeProfiles>

不过要记住,无论两种方式内的哪一种,都只允许从私服上拉取依赖,如果你的某个工程,想要打包发布到私服上,还是需要配置前面说的<distributionManagement>标签。

Maven系列就到此结束了,希望我的整理能够给大家带来帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

让我们彻底了解Maven(二)--- Maven私服的搭建 的相关文章

随机推荐

  • Opencv寻找轮廓的最小外接矩形,并获取矩形的中心点,旋转角度

    本代码可用于获取物体的坐标偏移量 旋转角度 if thresholdValue Mat src Mat imHeight imWidth CV 8U pImageBuffer Mat mat src copyTo mat threshold
  • springboot 普通类自动注入mapper

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 解决方法 解决方法 普通类使用 Component注解修饰 添加本类型静态属性 所需mapper属性 添加init方法 用 PostConstruct注解修饰 方法
  • vue +element实现图片上传加展示

    一 声明变量 我们在这里声明了两个qrcodeaddress 分别是绑定表单的字段和作为展示图片的字段 二 编写html部分 在这里img标签是我们上传之后 展示的地方 action是上传路径 on success是上传成功后的方法 三编写
  • Vue之路由

    Vue之路由 今天来看看vue怎么实现路由功能 我们在vue cil脚手架搭建好的基础上来实现路由功能 如果搭建完初始化项目时没有路由功能则需在npm安装路由 命令 npm install vue router 然后在main js中引用路
  • 【Python】os.path.exists()的含义 及文件存在但os.path.exists()返回False的原因

    os path exists 函数的功能是查看给定的文件 目录是否存在 存在返回True 不存在返回False 如果给定的文件只有文件名 会在当前文件的目录下索引 给定的文件 目录可以是绝对索引 文件存在但os path exists 返回
  • Nacos 注册中心的设计原理:让你的应用轻松实现高效注册与发现!

    当应用开始脱离单机运行和访问时 服务发现就诞生了 目前的网络架构是每个主机都有 个独立的 IP 地址 服务发现基本都是通过某种方式获取到服务所部署的 IP 地址 DNS 协议是最早将 个网络名称翻译为网络 IP 的协议 在最初的架构选型中
  • cenos自动启动tomcat

    首先创建一个脚本 关闭tomcat 等待2分钟 启动tomcat 并且把日志输出在 usr local tomcat tomcatchognqi log bin bash export JAVA HOME usr local jdk jdk
  • 创建Unity项目

    1 点击 新项目 2 根据实际所需选择对应模板 3 等待创建项目完成 4 点击项目即会在新窗口打开项目
  • 如何自动更新-CMD

    不打算讲得很细 我本人能看懂就行 现在客户端自动更新 一般要用到更新程序 这样就是两个项目 两个exe了 所以对我这来说比较反感 所以就选择了另外一种方法 cmd 由于是自动更新客户端 且是内置的 所以要关闭自身 但是cmd在process
  • VScode远程服务器docker环境

    经常会遇到需要对docker容器中的代码调试的问题 远程使用IDE是很好的选择 具体操作 1 在VScode中下载Remote SSH 2 创建一个ssh连接服务器 3 启动一个docker并注明服务器端口与docker端口的映射关系 Ti
  • 使用 RestSharp访问接口返回 空 数据原因(ssl加密)解决方法

    例子 var client new RestClient https wwwcie ups com rest Track var request new RestRequest Method POST request AddHeader p
  • QT中实现应用程序的单例化

    一介绍 通过编写一个QSingleApplication类 来实现Qt程序的单例化 原文的作者是在Windows Vista Qt4 4 下实现的 不过应用在其他平台上是没问题的 本文是我在http www qtcentre org wik
  • 女程序员的转型

    女 30 做了开发6年 各种语言都多少有点用 但以前都是野路子开发 两个人 一个人做pc端 一个人做web端 或者一个人做app 一个人做web 没有ui 没有前段 所有的人都是你 虽然之前也算是项目经理 但没有一个规范的流程 甚至连流程图
  • OpenCV中imread/imwrite与imdecode/imencode的异同

    OpenCV中的cv imdecode函数是从指定的内存缓存中读一幅图像 而cv imencode是将一幅图像写进内存缓存中 cv imread是从指定文件载入一幅图像 cv imwrite是保存一幅图像到指定的文件中 cv imread和
  • 如何阅读大型程序

    近期想读下程序 但发现非常难 比如一个网络程序模块 有6个cpp源程序 共5916行源代码 不包括头文件中引用的别的地方的代码 1 我对业务还算熟悉 但是看到那么多变量定义时还是感到理解起来很吃力 因为有些变量根本就是过程变量 2 函数层层
  • rust安装link.exe报错

    rust安装link exe报错 今天安装rust完成之后 直接cargo new一个hello world程序 等到cargo run代码的时候发现报错 linking with link exe failed exit code 113
  • PLC-串口通信实例

    随着微电子及控制技术的不断发展 PLC已逐渐成为一种智能型 综合型控制器 由PLC构成的集散控制是现代工业控制的一个重要组成部分 PLC具有使用简单方便 故障率低 抗干扰能力强等优点 但同时 数据的计算处理与管理能力较弱 且无法提供良好的人
  • 使用清华镜像编译aosp

    基础环境编译 与上一篇mac 编译 aosp 一样 http blog csdn net karts article details 54971227 只是 可以在 https mirrors tuna tsinghua edu cn he
  • 【第三阶段 day24】Axios的补充 IDEA自动注入mapper异常说明 Ajax的简化操作

    文章目录 1 Axios的补充 1 1 Axios Post请求 1 2 控制层 2 IDEA自动注入mapper异常说明 3 Ajax的简化操作 3 1 简化axios请求的前缀 3 2 关于promise对象的说明 3 3 Ajax 回
  • 让我们彻底了解Maven(二)--- Maven私服的搭建

    首先我们为什么需要搭建Maven私服 一切技术来源于解决需求 因为我们在实际开发中 当我们研发出来一个公共组件 为了能让别的业务开发组用上 则搭建一个远程仓库很有必要 写完公用组件后 直接发布到远程仓库 别人需要用到时 直接从远程仓库拉取即