maven依赖管理:依赖仓库管理

1、Maven的依赖如何存放管理?

        Maven中存在依赖组件(常用的是jar包、war包、pom等,也可把Zip包等通过POM文件定义为依赖组件)的地方称为仓库(Repository)。

在Maven中,仓库有三种类型:

  1. central:中央仓库
  2. local:本地仓库
  3. remote:远程仓库

1.1、中央仓库:

        Maven的中央仓库是由Maven社区提供的资源仓库,它包含了大量的常用程序库组件(jar包)。默认Maven的中央仓库地址为:http://repo1.maven.org/maven2/

        但是实际工作中,由于地域、网络等原因,从Maven中心仓库下载十分慢,可采用公司自建的镜像仓(mirror)或国内地区开放的镜像仓(如:阿里云的镜像仓http://maven.aliyun.com/nexus/content/groups/public

        如果公司内部和外部有防火墙,并使用了HTTP代理服务组织用户直接访问互联网,这种情况下访问Maven官方中央仓库、或互联网开放的镜像仓,就需要配置proxy。

中央仓库的配置:

        Maven默认中央仓库即为http://repo1.maven.org/maven2/,不需要配置什么内容。如果采用镜像,在maven安装目录/conf/setting.xml文件中配置,如下:

(注意:maven安装目录/conf/setting.xml是本地的全局目录,对本地登录的所有用户生效,如果向对指定用户生效,复制setting.xml到user/用户名/.m2下再配置)

<mirrors><mirror><id>aliyun</id><name>aliyun</name><url>http://maven.aliyun.com/nexus/content/groups/public</url><mirrorOf>central</mirrorOf></mirror>
</mirrors>

<mirrorOf>标签表示当前镜像替代的仓库类型,如上central标识当前镜像代替中央仓库。

<mirror>标签在setting.xml文件中可以配置多个,Maven在查找时,并不是按照在setting.xml文件中配置的先后顺序查找的,而是按照id的字母排序来优先查找的

1.2、本地仓库

        本地仓库是在开发人员开发PC上存放Maven依赖的一个文件夹,此文件夹在第一次运行Maven命令时就创建了。

        Maven在执行构建任务时,根据依赖关系从中心仓库、或远程仓库下载依赖组件到本地仓库,然后本地仓库的内容供项目引用。        

【本地仓库的配置】:本地仓库默认创建在%USER_HOME%\.m2目录下。用户也可以在“setting.xml”中自定义,如:

 <localRepository>F:\maven_repository</localRepository>

也可在执行命令时指定本地仓库地址,如:

mvn clean install -Dmaven.repo.local=/home/maven/local_repo/

也可在执行命令时指定配置文件地址,如:

mvn clean install -s /home/maven/settings.xml

1.3、远程仓库

一般在项目开发中,除了引用Maven中央仓库包含的常用程序库组件外,还需要:

(1)项目需要指定外部其他公司、或开源组织的jar包,这些依赖组件通用性等原因,未纳入Maven中央仓库。

(2)公司内部多个项目之间存在依赖,B项目开发过程中需要依赖A.jar。

(3)公司内部定义的各产品需要引用的公共依赖组件,这些依赖组件是公司私有的。

        这种情况下,可以在项目的pom.xml中为指定中央仓库以外的其他外部依赖组件仓库【如上(1)的仓库】、及公司内部的私有仓库【如上(2)、(3)的仓库,公司内部私有仓库即私服】,这类仓库称之为远程仓库。

示例:

<repositories><repository><id>jboss</id><name>JBoss Repository</name><url>http://repository.jboss.com/maven2/</url><releases><enabled>true</enabled><updatePolicy>daily</updatePolicy></releases><snapshots><enabled>false</enabled><checksumPolicy>warn</checksumPolicy></snapshots><layout>default</layout></repository><repository><id>xxxx</id><name>xxxxx</name><url>xxxxx</url></repository>
</repositories>

        <id>:声明远程仓库的唯一id。注意:Maven官方中央仓库的id是central,如果配置中把其他远程仓库的id设置为central,会覆盖Maven官方的中央仓库配置,后续会使用自配置的URI最为中央仓库。

        <name>:远程仓库的名称,自定义。

        <url>:远程仓库的地址。

        <releases><snapshots>:标识下载Release版、或Snapshot版依赖组件的权限。通过<enable>标签控制,可以配置一个远程仓库即可以下载Release版、Snapshot版依赖组件,也可以配置两个远程仓库分别下载Release版、Snapshot版依赖组件。

        <updatePolicy>:表示依赖组件的更新的频率,默认为daily,在后面下载过程详解部分再做描述。

        <checksumPolicy>:用来配置Maven检查校验策略。当构建被部署到Maven仓库时,会同时部署对应的检验和文件。在下载构件时,Maven会验证校验和文件。如果校验和验证失败,当checksumPolicy配置为默认warn时,Maven执行构建时会输出警告;当配置为fail-Maven时,遇到校验和错误构建失败;当配置为ignore时,Maven忽略校验和错误。

        如上为 远程仓库定义在某个项目的pom.xml中。但是,如果本地同步开发多个项目,远程仓库是各个项目的公共资源,不希望在每个项目的pom.xml中都配置一份,如何做呢?      
        答案是:可以把上面的<repositories>标签配置到Maven的setting.xml文件中,配置在<profile>标签内。样例:

<profiles><profile><id>cloud</id><activation><activeByDefault>true</activeByDefault></activation><repositories><repository><id>central</id><url>http://地址:端口/repository/maven-public/</url><snapshots><enabled>true</enabled></snapshots></repository>                <repository><id>snapshots</id><url>http://地址:端口/repository/maven-public/</url><snapshots><enabled>true</enabled></snapshots></repository></repositories><pluginRepositories><pluginRepository><id>central</id><url>http://地址:端口/repository/maven-public/</url><snapshots><enabled>false</enabled><updatePolicy>never</updatePolicy></snapshots></pluginRepository></pluginRepositories></profile><profile>    <id>downloadSources</id>    <properties>    <downloadSources>true</downloadSources>    <downloadJavadocs>true</downloadJavadocs>               </properties></profile>
</profiles>

   注意:<profiles>标签内的内容是需要指定激活才生效的,如何激活见本章节末尾。

1.4、Maven 从3类仓库中搜索下载依赖组件的顺序:

当我们执行 Maven 构建命令,Maven 依赖库按以下顺序进行搜索:

(1)搜索本地仓库,如果没有找到,跳到第2步。

(2)搜索中央仓库,如果找到,下载到本地仓库中,以备项目使用;如果没有找到,跳到第3步。

(3)如果自定义了远程仓库,那么也会在远程仓库中进行查找并获得依赖组件,如果都没有找到,那么Maven就会抛出异常。

2、把自研jar放入仓库

1、实际开发中,可能开发人员本地同步在开发A、B多个项目,B.jar依赖A.jar。希望A.jar编译、打包完毕后,A.jar也被Maven管理,通过Maven的依赖机制可以被B项目引用,如何做呢?

        答案是:执行Maven的install阶段,这个阶段的作用就是把项目jar包部署到Maven本地仓。

2、在多团队配合开发中,希望自己开发的jar包通过Mave的deploy阶段部署到远程仓库【一般为公司私有远程仓库,即私服,供其他团队更新引用,如何做的?

        答案是:在pom.xml文件中通过<distributionManagement>标签指定。

<!--发布到私服配置-->
<distributionManagement><!-- <repository>标签表示Release版本仓, Release版本仓: 用来保存稳定的发行版本  --><repository><id>releases</id><name>releases</name><url>http://地址:端口/repository/maven-releases/</url></repository><!-- <snapshotRepository>标签表示Snapshot版本仓, Snapshot版本仓: 用于保存开发过程中的不稳定版本 --><snapshotRepository><id>Snapshots</id><name>Snapshots</name><url>http://地址:端口/repository/maven-snapshots/</url></snapshotRepository>
</distributionManagement>
<!-- Maven会根据模块的版本号(pom.xml中定义)是否带有-SNAPSHOT来判断是Snapshot版本还是Release版本。如果是Snapshot版本,mvn deploy时会自动发布到Snapshot版本仓。如果是Release版本,mvn deploy时会自动发布到Release版本仓。
-->

        如上远程仓库定义在某个项目的pom.xml中。如果本地同步开发多个项目,远程仓库是各个项目的公共资源,不希望在每个项目的pom.xml中都配置一份,如何做呢?

        答案是:可以把上面的<distributionManagement>标签配置到Maven的setting.xml文件中,配置在<profile>标签内。

<profiles><profile><distributionManagement><repository><id>releases</id><name>releases</name><url>http://地址:端口/repository/maven-releases/</url></repository><snapshotRepository><id>Snapshots</id><name>Snapshots</name><url>http://地址:端口/repository/maven-snapshots/</url></snapshotRepository></distributionManagement></profile>
</profiles>

        注意:<profiles>标签内的内容是需要指定激活才生效的,如何激活见本章节末尾。

3、远程仓库的认证

        出于安全考虑,有些远程仓库是需要我们访问认证的,这种情况下就需要配置认证信息。和配置远程仓库地址不同,远程仓库可以配置在项目的pom.xml中。但是,远程仓库认证信息只能配置在Maven的setting.xml文件中。

        原因是,项目的pom.xml属于项目源码的一部分,是需要上传到git仓库的。如果你的认证信息存放在pom.xml中,则项目的所有成员都可以看到你的用户名、密码。而setting.xml则保存在开发人员本地环境。因此,在settings.xml中配置认证信息更为安全。

setting.xml中配置远程仓库认证信息样例:

<servers><server><id>releases</id><username>用户名</username><password>密码</password></server><server><id>Snapshots</id><username>用户名</username><password>密码</password></server>
</servers>

        注意:这里<id>信息十分重要,这个<id>标签信息必须和pom.xml中配置的远程仓库的<id>保持一致,Maven是通过<id>为配置的远程仓库找到正确的认证信息的。

4、<profiles>标签内的内容激活方式

4.1、方式一:

        执行mvn命令时,通过-D参数激活。

4.2、方式二:

        pom.xml或setting.xml中的<profiles>内的内容通过<activation>指定条件激活。

样例1:默认激活

<profile> <id>dev</id> <activation> <activeByDefault>true</activeByDefault> </activation> ... 
</profile>

样例2:条件激活。指定JDK版本激活、根据操作系统参数激活、根据Maven 属性等激活等。

<profile><id>dev</id><activation><activeByDefault>false</activeByDefault><jdk>1.5</jdk><os><name>Windows XP</name><family>Windows</family><arch>x86</arch><version>5.1.2600</version></os><property><name>mavenVersion</name><value>2.0.5</value></property><file><exists>file2.properties</exists><missing>file1.properties</missing></file></activation>...
</profile>

4.3、方式三:

        setting.xml中的<profiles>内的内容可以通过<activeProfiles>标签激活

样例:

<profiles><profile><id>profileTest1</id>......</profile>
</profiles>
<activeProfiles><activeProfile>profileTest1</activeProfile>
</activeProfiles>

5、私服

公司内部实际使用中,可能存在:

(1)公司内部很多团队都在开发项目,每个团队的每个组员都需要下载依赖组件,如果全部使用外部中央仓库/镜像、远程仓库,回存在:

  • 外部公共仓库如果不是那么稳定、或者由大家都在下载速度慢,影响开效率。
  • 公司内部和外部如果是租用带宽,每个项目、每个成员都从外部下载, 带宽占用情况、费用高。

 (2)另外,公司内部也可能存在私有的依赖组件,需要在公司内部共享:

  • 公司内部多个项目之间存在依赖,B项目开发过程中需要依赖A.jar。
  • 公司内部定义的各产品需要引用的公共依赖组件,这些依赖组件是公司私有的。

        这种情况下,就可以在公司内部搭建一个私服仓库。私服是一种特殊的远程仓库。私服仓库和中心仓库、本地仓库、镜像仓库的关系如下:

此时,私服的作用:

(1)可以代理任何外部的公共仓库,包括中央仓库、公共远程仓库。因此,对于公司内的Maven用户来说,使用一个私服地址就等于使用了所有需要的外部仓库。Maven需要的所有外部组件都可以优先从私服下载,私服中没有,私服再从公共仓库下载。此时私服即为所有外部仓库(中心仓库、远程仓库)的镜像。

(2)作为公司内自研依赖组件的归档、下载远程仓库。

5.1、私服搭建

        详见:https://www.cnblogs.com/caoweixiong/p/10522400.html

5.2、配置私服

        参考前面1、2、3章节,把<mirror>、远程仓库、自研上传仓库设置为私服地址,根据需要设置私服仓库认证。

5.3、私服配置后,下载依赖组件的顺序:

(1)搜索本地仓库,如果没有找到,跳到第2步。

(2)不论是中央仓库中的公共依赖组件,还是公司外部的其他组件,还是自研组件,都直接到私服搜索,如果找到,下载到本地仓库中,以备项目使用;如果没有找到,私服从中央仓库、外部远程仓库下载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/810765.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSS中grid网格布局(秒懂如何实现网格布局)-菜鸟教程

目录 一、概念 二、使用 1.网格元素 2.display属性 3.网格轨道 4.fr 单位 5.网格单元 6.网格区域 7.网格列与行 8.CSS 网格属性 三、网格容器 display&#xff1a; grid-template-columns 和 grid-template-rows&#xff1a; grid-gap、grid-row-gap 和 grid-column-…

如何使用SQL注入工具?

前言 今天来讲讲SQL注入工具&#xff0c;sqlmap。如何使用它来一步步爆库。 sqlmap官方地址如下。 sqlmap: automatic SQL injection and database takeover tool 前期准备&#xff0c;需要先安装好docker、docker-compose。 一个运行的后端服务&#xff0c;用于写一个存在…

计算机网络-TCP断开连接阶段错误应对机制

连接断开阶段 四次挥手机制&#xff1a;TCP连接的断开需要四次挥手&#xff0c;这是因为双方都需要独立地关闭数据传输。第二次和第三次挥手不能合并&#xff0c;因为在回复第二次挥手的时候&#xff0c;可能还有数据没有接收完成&#xff0c;所以需要先回复ACK报文&#xff0c…

【U8+】打开固定资产卡片,提示:运行时错误‘91’,未设置对象变量或with block变量。

【问题描述】 用友U8软件&#xff0c;固定资产模中打开某张卡片后&#xff0c; 提示&#xff1a;运行时错误‘91’&#xff0c;未设置对象变量或with block变量。 Ps&#xff1a;但不是所有卡片打开的时候都会提示&#xff0c;有的正常。 【解决方法】 跟踪数据库后&#xff…

SpringBoot入门(Hello World 项目)

SpringBoot关键结构 1.2.1 Core Container The Core Container consists of the Core, Beans, Context, and Expression Language modules. The Core and Beans modules provide the fundamental parts of the framework, including the IoC and Dependency Injection featur…

C语言易错知识点(3):字符数组的修改、sscanf、sprintf

字符数组是一个很细节的语法&#xff0c;涉及很多知识点&#xff0c;这篇文章我主要分享一下如何理解字符数组&#xff0c;以及对应的sscanf、sprintf有什么用 1.字符数组的初始化以及内容修改易错点 字符数组的初始化方式有两种&#xff0c;一种是直接用字符串进行初始化&am…

每日一题---OJ题: 相交链表

片头 嗨! 小伙伴们,大家好! 今天我们来一起学习这道OJ题---相交链表,准备好了吗? Ready Go! ! ! emmm,看这道题好像不怎么难,我们一起画图分析分析 上图中,A链表有5个结点,分别为 a1,a2,c1,c2,c3 ; B链表有6个结点,分别为 b1,b2,b3,c1,c2,c3 ; A链表和B链表在c1结点相交 …

渗压计在测压管与测井中的安装方法

在地下水动态监测与工程安全评估中&#xff0c;渗压计扮演着至关重要的角色。它能够精准地测量地下水压力的变化&#xff0c;为工程师提供决策依据。本文将详细阐述在测压管或测井中如何正确安装渗压计&#xff0c;以确保其准确度和可靠性。 一、建立零读数并浸透透水石 在安装…

PandasAI的应用与实战解析(一):环境安装、运行demo

文章目录 1.源码包下载、明确依赖版本2.安装python依赖3.运行demo 本博客源码仓库地址&#xff1a;gitlab&#xff0c;本篇博客对应01分支python版本为3.10.x 什么是PandasAI&#xff1f;一句话总结的话&#xff0c;PandasAI就是一个结合了Pandas和AI的开源工具&#xff0c;更…

windwos安全加固

一、账号管理 按用户类型分配账号 目的&#xff1a;根据系统要求&#xff0c;设定不同账户和组&#xff0c;管理员、数据库 sa、审计用户、来宾用户等 实施方法&#xff1a; 打开本地用户和计算机管理器 ​ 1.打开运行&#xff0c;输入lusrmgr.msc 2.根据用户要求将账户加入…

秋招算法刷题7

20240410 1.接雨水 方法一&#xff0c;动态规划&#xff0c;时间复杂度O&#xff08;n^2&#xff09;&#xff0c;空间复杂度O&#xff08;n&#xff09; public int trap(int[] height) { int nheight.length; if(n0){ return 0; } …

java:字符集和字符流

字符集 规定了字符和二进制之间对应关系的一张表 字节是计算机最基本的存储单位 字符则是通过字符组成和编码而成的文本 常见字符集 1,ASCII字符集 基础字符编码标准,包含128个字符,只包括英文字母,数字和一些常见的符号 一个字节表示一个字符 所有的字符集均兼容ASCII…

open-sora

Open-Sora&#xff0c;高效复现类Sora视频生成方案开源&#xff01;魔搭社区最佳实践教程来啦&#xff01;https://mp.weixin.qq.com/s/WMQIDgZs2MBPGtx18XSXgw Open-Sora开源方案讲解开源但“平替”的方案。https://mp.weixin.qq.com/s/nPYCzgBA7hIsPZ6PCyXxKQOpen-Sora/docs…

数据分析案例(一):地区收入的PCA主成分分析

练习1 地区收入的PCA主成分分析 0.变量说明 1.导包操作 核心思路&#xff1a;导入基础数据操作库包&#xff0c;PCA、k-means 库包&#xff0c;数据可视化库包 import pandas as pd import numpy as np from sklearn.decomposition import PCA from sklearn.preprocessing i…

YOLOV5训练KITTI数据集实践

目录 一、YOLOV5下载安装二、KITTI数据集三、标签格式转换四、修改配置文件五、训练六、测试 一、YOLOV5下载安装 git clone https://github.com/ultralytics/yolov5.git conda create -n yolov5 python3.8 -y conda activate yolov5 cd yolov5 pip install -r requirements.t…

2024最火的情感短视频素材在哪下载?这里有几个素材网站可以下载

在这个看似无边无际的短视频海洋中&#xff0c;我就像那个手握罗盘、脚踏破旧木筏的勇敢航海家&#xff0c;时刻准备着发现新大陆。而我的罗盘&#xff0c;就是那些能够指引我找到珍稀素材的网站。让我带你领略一下我的航海日记吧。九才素材网&#xff1a; 九才素材网提供了丰…

青少年体能素质教育平台

一、项目背景与意义 随着社会的快速发展和人们生活水平的提高&#xff0c;青少年体能素质教育逐渐受到社会各界的广泛关注。体能素质作为青少年全面发展的重要组成部分&#xff0c;对于提升他们的健康水平、增强自信心、培养团队协作精神和创新能力具有重要意义。然而&#xf…

继承【C/C++复习版】

目录 一、什么是继承&#xff1f;怎么定义继承&#xff1f; 二、继承关系和访问限定符&#xff1f; 三、基类和派生类对象可以赋值转换吗&#xff1f; 四、什么是隐藏&#xff1f;隐藏vs重载&#xff1f; 五、派生类的默认成员函数&#xff1f; 1&#xff09;派生类构造函…

关于转义符 \ 在php正则中的匹配问题

今天做题遇到一个很经典的问题&#xff0c;记录一下&#xff0c;先看一段代码 <?php $str&#xff0c;&#xff0c;"\\"; $pattern&#xff0c;&#xff0c;"/\\/"; if(preg_match($partern,$str,$arr)) { &#xff0c;&#xff0c;&#xff0c;&…

SpringBoot编写一个SpringTask定时任务的方法

1&#xff0c;在启动类上添加注解 EnableScheduling//开启定时任务调度 2&#xff0c; 任务&#xff08;方法&#xff09;上也要添加注解&#xff1a; Scheduled(cron " 0 * * * * ? ") //每分钟执行一次 域&#xff1a; 秒 分 时 日 月 周 &#xff08;年&#…