Maven高级
1,分模块开发
(1)按照功能拆分
项目都是在一个模块中,以后的SSM整合开发。虽然这样做功能也都实现了,但是也存在了一些问题,我们拿银行的项目为例来聊聊这个事。
- 网络没有那么发达的时候,我们需要到银行柜台或者取款机进行业务操作
- 随着互联网的发展,我们有了电脑以后,就可以在网页上登录银行网站使用U盾进行业务操作
- 再来就是随着智能手机的普及,我们只需要用手机登录APP就可以进行业务操作
上面三个场景出现的时间是不相同的,如果非要把三个场景的模块代码放入到一个项目,那么当其中某一个模块代码出现问题,就会导致整个项目无法正常启动,从而导致银行的多个业务都无法正常班理。所以我们会按照功能将项目进行拆分。
(2)按照模块拆分
比如电商的项目中,有订单和商品两个模块,订单中需要包含商品的详细信息,所以需要商品的模型类,商品模块也会用到商品的模型类,这个时候如果两个模块中都写模型类,就会出现重复代码,后期的维护成本就比较高。我们就想能不能将它们公共的部分抽取成一个独立的模块,其他模块要想使用可以像添加第三方jar包依赖一样来使用我们自己抽取的模块,这样就解决了代码重复的问题,这种拆分方式就说我们所说的”按照模块“拆分。
2,依赖管理
我们现在已经能把项目拆分成一个个独立的模块,当在其他项目中想要使用独立出来的这些模块,只需要在其pom.xml使用标签来进行jar包的引入即可。
其实就是依赖,关于依赖管理里面都涉及哪些内容,我们就一个个来看看:
我们先来说说什么是依赖: 依赖指当前项目运行所需的jar,一个项目可以设置多个依赖。
格式为:
<!--设置当前项目所依赖的所有jar-->
<dependencies>
<!--设置具体的依赖-->
<dependency>
<!--依赖所属群组id-->
<groupId>org.springframework</groupId>
<!--依赖所属项目id-->
<artifactId>spring-webmvc</artifactId>
<!--依赖版本号-->
<version>5.2.10.RELEASE</version>
</dependency>
</dependencies>
2.1 依赖传递与冲突问题
回到我们刚才的项目案例中,打开Maven的面板,你会发现:
依赖是具有传递性的:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lZG5lohh-1672725994109)(assets/1630853726532.png)]
**说明:**A代表自己的项目;B,C,D,E,F,G代表的是项目所依赖的jar包;D1和D2 E1和E2代表是相同jar包的不同版本
(1) A依赖了B和C,B和C有分别依赖了其他jar包,所以在A项目中就可以使用上面所有jar包,这就是所说的依赖传递
(2) 依赖传递有直接依赖和间接依赖
- 相对于A来说,A直接依赖B和C,间接依赖了D1,E1,G,F,D2和E2
- 相对于B来说,B直接依赖了D1和E1间接依赖了G
- 直接依赖和间接依赖是一个相对的概念
(3)因为有依赖传递的存在,就会导致jar包在依赖的过程中出现冲突问题,具体什么是冲突?Maven是如何解决冲突的?
这里所说的依赖冲突是指项目依赖的某一个jar包,有多个不同的版本,因而造成类包版本冲突。
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
通过对比,会发现一个结论
情况一: 特殊优先:当同级配置了相同资源的不同版本,后配置的覆盖先配置的。
情况二: 路径优先:当依赖中出现相同的资源时,层级越深,优先级越低,层级越浅,优先级越高
- A通过B间接依赖到E1
- A通过C间接依赖到E2
- A就会间接依赖到E1和E2,Maven会按照层级来选择,E1是2度,E2是3度,所以最终会选择E1
情况三: 声明优先:当资源在相同层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的
- A通过B间接依赖到D1
- A通过C间接依赖到D2
- D1和D2都是两度,这个时候就不能按照层级来选择,需要按照声明来,谁先声明用谁,也就是说B在C之前声明,这个时候使用的是D1,反之则为D2
但是对应上面这些结果,大家不需要刻意去记它。因为不管Maven怎么选,最终的结果都会在Maven的Dependencies
面板中展示出来,展示的是哪个版本,也就是说它选择的就是哪个版本。
如果想更全面的查看Maven中各个坐标的依赖关系,可以点击Maven面板中的show Dependencies
在这个视图中就能很明显的展示出jar包之间的相互依赖关系。
2.2 可选依赖和排除依赖
可选依赖
- 可选依赖指对外隐藏当前所依赖的资源—不透明
<dependency>
<groupId>com.gt</groupId>
<artifactId>maven03</artifactId>
<version>1.0-SNAPSHOT</version>
<!--可选依赖是隐藏当前工程所依赖的资源,隐藏后对应资源将不具有依赖传递-->
<optional>true</optional>
</dependency>
排除依赖
- 排除依赖指主动断开依赖的资源,被排除的资源无需指定版本—不需要
当然exclusions
标签带s
说明我们是可以依次排除多个依赖到的jar包,如下图中有依赖junit和mybatis,我们也可以一并将其排除。
<dependency>
<groupId>com.gt</groupId>
<artifactId>maven_04</artifactId>
<version>1.0-SNAPSHOT</version>
<!--排除依赖是隐藏当前资源对应的依赖关系-->
<exclusions>
<exclusion>
<groupId>com.gt</groupId>
<artifactId>maven_03_pojo</artifactId>
</exclusion>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
<exclusion>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</exclusion>
</exclusions>
</dependency>
介绍我这两种方式后,简单来梳理下,就是
A依赖B,B依赖C
,C
通过依赖传递会被A
使用到,现在要想办法让A
不去依赖C
- 可选依赖是在B上设置
<optional>
,A
不知道有C
的存在, - 排除依赖是在A上设置
<exclusions>
,A
知道有C
的存在,主动将其排除掉。
3,聚合和继承
我们的项目已经从以前的单模块,变成了现在的多模块开发。项目一旦变成了多模块开发以后,就会引发一些问题,在这里中我们主要会学习两个内容`聚合`和`继承`,用这两个知识来解决下分模块后的一些问题。
3.1 聚合:
用于快速构建maven工程,一次性构建多个项目/模块,父模块。
<modules>
<!--子项目相对路径-->
<module></module>
</modules>
3. 2 继承:
通过继承可以实现在子工程中沿用父工程中的配置。(maven中的继承与java中的继承相似,在子工程中配置继承关系)在子工程中声明其父工程坐标与对应的位置
<!-- 定义该工程的父工程-->
<parent>
<artifactId>ruoyi</artifactId>
<groupId>com.ruoyi</groupId>
<version>3.8.4</version>
</parent>
在父工程定义依赖管理
<!-- 声明此处进行依赖管理-->
<dependencyManagement>
<!-- 具体的依赖-->
<!-- SpringBoot的依赖配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.5.14</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- 阿里数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${druid.version}</version>
</dependency>
<!-- 解析客户端操作系统、浏览器等 -->
<dependency>
<groupId>eu.bitwalker</groupId>
<artifactId>UserAgentUtils</artifactId>
<version>${bitwalker.version}</version>
</dependency>
<!-- pagehelper 分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>${pagehelper.boot.version}</version>
</dependency>
<!-- 获取系统信息 -->
<dependency>
<groupId>com.github.oshi</groupId>
<artifactId>oshi-core</artifactId>
<version>${oshi.version}</version>
</dependency>
<!-- Swagger3依赖 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>${swagger.version}</version>
<exclusions>
<exclusion>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- io常用工具类 -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>${commons.io.version}</version>
</dependency>
<!-- 文件上传工具类 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>${commons.fileupload.version}</version>
</dependency>
<!-- excel工具 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>${poi.version}</version>
</dependency>
<!-- velocity代码生成使用模板 -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>${velocity.version}</version>
</dependency>
<!-- collections工具类 -->
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>${commons.collections.version}</version>
</dependency>
<!-- 阿里JSON解析器 -->
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>${fastjson.version}</version>
</dependency>
<!-- Token生成与解析-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>${jwt.version}</version>
</dependency>
<!-- 验证码 -->
<dependency>
<groupId>pro.fessional</groupId>
<artifactId>kaptcha</artifactId>
<version>${kaptcha.version}</version>
</dependency>
<!-- 定时任务-->
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-quartz</artifactId>
<version>${ruoyi.version}</version>
</dependency>
<!-- 代码生成-->
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-generator</artifactId>
<version>${ruoyi.version}</version>
</dependency>
<!-- 核心模块-->
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-framework</artifactId>
<version>${ruoyi.version}</version>
</dependency>
<!-- 系统模块-->
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-system</artifactId>
<version>${ruoyi.version}</version>
</dependency>
<!-- 通用工具-->
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-common</artifactId>
<version>${ruoyi.version}</version>
</dependency>
</dependencies>
<dependencyManagement>
在子工程中定义依赖关系,无需声明依赖版本,版本参照父工程依赖的版本
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0PMj7dAX-1672725994111)(C:\Users\15843\AppData\Roaming\Typora\typora-user-images\image-20230101110227510.png)]
3.相同点:
①聚合与继承的pom.xml文件打包方式均为pom,可以将两种关系制作到同一个pom文件中
②聚合与继承均属于设计型模块,并无实际的模块内容
4.不同点:
①聚合是在当前模块中配置关系,聚合可以感知到参与聚合的模块有哪些
②继承是在子模块中配置关系,父模块无法感知哪些子模块继承了自己
在Maven中的属性分为:
- 自定义属性(常用)
- 内置属性
- Setting属性
- Java系统属性
- 环境变量属性
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eblNWCWN-1672725994111)(assets/1630981519370.png)]
具体如何查看这些属性:
在cmd命令行中输入mvn help:system
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SE5W7CGC-1672725994112)(assets/1630981585748.png)]
具体使用,就是使用 ${key}
来获取,key为等号左边的,值为等号右边的,比如获取红线的值,对应的写法为 ${java.runtime.name}
。
3.3 版本管理
关于这个版本管理解决的问题是,在Maven创建项目和引用别人项目的时候,我们都看到过这两个单词,SNAPSHOT和RELEASE,它们所代表的含义是什么呢?
我们打开Maven仓库地址https://mvnrepository.com/
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VNHbVE90-1672725994113)(assets/1630983148662.png)]
在我们jar包的版本定义中,有两个工程版本用的比较多:
- SNAPSHOT(快照版本)
- 项目开发过程中临时输出的版本,称为快照版本
- 快照版本会随着开发的进展不断更新
- RELEASE(发布版本)
- 项目开发到一定阶段里程碑后,向团队外部发布较为稳定的版本,这种版本所对应的构件文件是稳定的
- 即便进行功能的后续开发,也不会改变当前发布版本内容,这种版本称为发布版本
除了上面的工程版本,我们还经常能看到一些发布版本:
- alpha版:内测版,bug多不稳定内部版本不断添加新功能
- beta版:公测版,不稳定(比alpha稳定些),bug相对较多不断添加新功能
- 纯数字版
对于这些版本,大家只需要简单认识下即可。
4,多环境配置与应用
4.1 多环境开发
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-844yaDgm-1672725994113)(assets/1630983617755.png)]
- 我们平常都是在自己的开发环境进行开发,
- 当开发完成后,需要把开发的功能部署到测试环境供测试人员进行测试使用,
- 等测试人员测试通过后,我们会将项目部署到生成环境上线使用。
- 这个时候就有一个问题是,不同环境的配置是不相同的,如不可能让三个环境都用一个数据库,所以就会有三个数据库的url配置,
- 我们在项目中如何配置?
- 要想实现不同环境之间的配置切换又该如何来实现呢?
maven提供配置多种环境的设定,帮助开发者在使用过程中快速切换环境。具体实现步骤:
步骤1:父工程配置多个环境,并指定默认激活环境
<profiles>
<!--开发环境-->
<profile>
<id>env_dep</id>
<properties>
<jdbc.url>jdbc:mysql://127.1.1.1:3306/ssm_db</jdbc.url>
</properties>
<!--设定是否为默认启动环境-->
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<!--生产环境-->
<profile>
<id>env_pro</id>
<properties>
<jdbc.url>jdbc:mysql://127.2.2.2:3306/ssm_db</jdbc.url>
</properties>
</profile>
<!--测试环境-->
<profile>
<id>env_test</id>
<properties>
<jdbc.url>jdbc:mysql://127.3.3.3:3306/ssm_db</jdbc.url>
</properties>
</profile>
</profiles>
所以总结来说,对于多环境切换只需要两步即可:
-
父工程中定义多环境
<profiles> <profile> <id>环境名称</id> <properties> <key>value</key> </properties> <activation> <activeByDefault>true</activeByDefault> </activation> </profile> ... </profiles>
-
使用多环境(构建过程)
mvn 指令 -P 环境定义ID[环境定义中获取]
4.2 跳过测试
前面在执行install
指令的时候,Maven都会按照顺序从上往下依次执行,每次都会执行test
,
对于test
来说有它存在的意义,
- 可以确保每次打包或者安装的时候,程序的正确性,假如测试已经通过在我们没有修改程序的前提下再次执行打包或安装命令,由于顺序执行,测试会被再次执行,就有点耗费时间了。
- 功能开发过程中有部分模块还没有开发完毕,测试无法通过,但是想要把其中某一部分进行快速打包,此时由于测试环境失败就会导致打包失败。
遇到上面这些情况的时候,我们就想跳过测试执行下面的构建命令,具体实现方式有很多:
方式一:IDEA工具实现跳过测试
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EF8Glrr5-1672725994114)(assets/1630985300814.png)]
图中的按钮为Toggle 'Skip Tests' Mode
,
Toggle翻译为切换的意思,也就是说在测试与不测试之间进行切换
说明测试已经被关闭,再次点击就会恢复。
这种方式最简单,但是有点"暴力",会把所有的测试都跳过,如果我们想更精细的控制哪些跳过哪些不跳过,就需要使用配置插件的方式。
方式二:配置插件实现跳过测试
在父工程中的pom.xml中添加测试插件配置
<build>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.12.4</version>
<configuration>
<skipTests>false</skipTests>
<!--排除掉不参与测试的内容-->
<excludes>
<exclude>**/BookServiceTest.java</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
skipTests:如果为true,则跳过所有测试,如果为false,则不跳过测试
excludes:哪些测试类不参与测试,即排除,针对skipTests为false来设置的
includes: 哪些测试类要参与测试,即包含,针对skipTests为true来设置的
方式三:命令行跳过测试
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5VUXLKUj-1672725994114)(assets/1630986926124.png)]
使用Maven的命令行,mvn 指令 -D skipTests
注意事项:
- 执行的项目构建指令必须包含测试生命周期,否则无效果。例如执行compile生命周期,不经过test生命周期。
- 该命令可以不借助IDEA,直接使用cmd命令行进行跳过测试,需要注意的是cmd要在pom.xml所在目录下进行执行。
5,私服
- 私服简介
- 私服仓库分类
- 资源上传与下载
5.1 私服简介
团队开发现状分析
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DV0uRN8m-1672725994115)(assets/1630987192620.png)]
(1)张三负责ssm_crm的开发,自己写了一个ssm_pojo模块,要想使用直接将ssm_pojo安装到本地仓库即可
(2)李四负责ssm_order的开发,需要用到张三所写的ssm_pojo模块,这个时候如何将张三写的ssm_pojo模块交给李四呢?
(3)如果直接拷贝,那么团队之间的jar包管理会非常混乱而且容器出错,这个时候我们就想能不能将写好的项目上传到中央仓库,谁想用就直接联网下载即可
(4)Maven的中央仓库不允许私人上传自己的jar包,那么我们就得换种思路,自己搭建一个类似于中央仓库的东西,把自己的内容上传上去,其他人就可以从上面下载jar包使用
(5)这个类似于中央仓库的东西就是我们接下来要学习的私服
所以到这就有两个概念,一个是私服,一个是中央仓库
私服:公司内部搭建的用于存储Maven资源的服务器
远程仓库:Maven开发团队维护的用于存储Maven资源的服务器
所以说:
- 私服是一台独立的服务器,用于解决团队内部的资源共享与资源同步问题
搭建Maven私服的方式有很多,我们来介绍其中一种使用量比较大的实现方式:
- Nexus
- Sonatype公司的一款maven私服产品
- 下载地址:https://help.sonatype.com/repomanager3/download
5.2 私服安装
步骤1:下载解压
将压缩包解压到一个空目录下。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AcnV7KfS-1672725994115)(assets/1630988572349.png)]
步骤2:启动Nexus
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KbOFA9ix-1672725994115)(assets/1630988673245.png)]
使用cmd进入到解压目录下的nexus-3.30.1-01\bin
,执行如下命令:
nexus.exe /run nexus
看到如下内容,说明启动成功。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PK98B6FD-1672725994116)(assets/1630988939301.png)]
步骤3:浏览器访问
访问地址为:
http://localhost:8081
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FmQ3d1lR-1672725994116)(assets/1630988857125.png)]
步骤4:首次登录重置密码
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jOIRfzaG-1672725994117)(assets/1630988983159.png)]
输入用户名和密码进行登录,登录成功后,出现如下页面
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GGsh66q7-1672725994117)(assets/1630989052183.png)]
点击下一步,需要重新输入新密码,为了和后面的保持一致,密码修改为admin
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-48Fp2w37-1672725994117)(assets/1630989094756.png)]
设置是否运行匿名访问
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E9r8aZT2-1672725994118)(assets/1630989122737.png)]
点击完成
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PpdqKDsU-1672725994118)(assets/1630989136097.png)]
至此私服就已经安装成功。如果要想修改一些基础配置信息,可以使用:
- 修改基础配置信息
- 安装路径下etc目录中nexus-default.properties文件保存有nexus基础配置信息,例如默认访问端口。
- 修改服务器运行配置信息
- 安装路径下bin目录中nexus.vmoptions文件保存有nexus服务器启动对应的配置信息,例如默认占用内存空间。
5.3 私服仓库分类
私服资源操作流程分析:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B3PV82LC-1672725994118)(assets/1630989320979.png)]
(1)在没有私服的情况下,我们自己创建的服务都是安装在Maven的本地仓库中
(2)私服中也有仓库,我们要把自己的资源上传到私服,最终也是放在私服的仓库中
(3)其他人要想使用你所上传的资源,就需要从私服的仓库中获取
(4)当我们要使用的资源不是自己写的,是远程中央仓库有的第三方jar包,这个时候就需要从远程中央仓库下载,每个开发者都去远程中央仓库下速度比较慢(中央仓库服务器在国外)
(5)私服就再准备一个仓库,用来专门存储从远程中央仓库下载的第三方jar包,第一次访问没有就会去远程中央仓库下载,下次再访问就直接走私服下载
(6)前面在介绍版本管理的时候提到过有SNAPSHOT
和RELEASE
,如果把这两类的都放到同一个仓库,比较混乱,所以私服就把这两个种jar包放入不同的仓库
(7)上面我们已经介绍了有三种仓库,一种是存放SNAPSHOT
的,一种是存放RELEASE
还有一种是存放从远程仓库下载的第三方jar包,那么我们在获取资源的时候要从哪个仓库种获取呢?
(8)为了方便获取,我们将所有的仓库编成一个组,我们只需要访问仓库组去获取资源。
所有私服仓库总共分为三大类:
宿主仓库hosted
- 保存无法从中央仓库获取的资源
- 自主研发
- 第三方非开源项目,比如Oracle,因为是付费产品,所以中央仓库没有
代理仓库proxy
- 代理远程仓库,通过nexus访问其他公共仓库,例如中央仓库
仓库组group
- 将若干个仓库组成一个群组,简化配置
- 仓库组不能保存资源,属于设计型仓库
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PlV1dSv4-1672725994119)(assets/1630990244010.png)]
5.4 本地仓库访问私服配置
- 我们通过IDEA将开发的模块上传到私服,中间是要经过本地Maven的
- 本地Maven需要知道私服的访问地址以及私服访问的用户名和密码
- 私服中的仓库很多,Maven最终要把资源上传到哪个仓库?
- Maven下载的时候,又需要携带用户名和密码到私服上找对应的仓库组进行下载,然后再给IDEA
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B8lPARaF-1672725994119)(assets/1630990538229.png)]
上面所说的这些内容,我们需要在本地Maven的配置文件settings.xml
中进行配置。
步骤1:私服上配置仓库
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jmW60ioz-1672725994119)(assets/1630991211000.png)]
说明:
第5,6步骤是创建snapshot仓库
第7,8步骤是创建release仓库
步骤2:配置本地Maven对私服的访问权限
<servers>
<server>
<id>snapshot</id>
<username>admin</username>
<password>admin</password>
</server>
<server>
<id>release</id>
<username>admin</username>
<password>admin</password>
</server>
</servers>
步骤3:配置私服的访问路径
<mirrors>
<mirror>
<!--配置仓库组的ID-->
<id>maven-public</id>
<!--*代表所有内容都从私服获取-->
<mirrorOf>*</mirrorOf>
<!--私服仓库组maven-public的访问路径-->
<url>http://localhost:8081/repository/maven-public/</url>
</mirror>
</mirrors>
为了避免阿里云Maven私服地址的影响,建议先将之前配置的阿里云Maven私服镜像地址注释掉,等练习完后,再将其恢复。
至此本地仓库就能与私服进行交互了。
5.5 私服资源上传与下载
本地仓库与私服已经建立了连接,接下来我们就需要往私服上上传资源和下载资源,具体的实现步骤为:
步骤1:配置工程上传私服的具体位置
<!--配置当前工程保存在私服中的具体位置-->
<distributionManagement>
<repository>
<!--和maven/settings.xml中server中的id一致,表示使用该id对应的用户名和密码-->
<id>release</id>
<!--release版本上传仓库的具体地址-->
<url>http://localhost:8081/repository/release/</url>
</repository>
<snapshotRepository>
<!--和maven/settings.xml中server中的id一致,表示使用该id对应的用户名和密码-->
<id>snapshot</id>
<!--snapshot版本上传仓库的具体地址-->
<url>http://localhost:8081/repository/snapshot/</url>
</snapshotRepository>
</distributionManagement>
步骤2:发布资源到私服
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nsWk7bPJ-1672725994120)(assets/1630992305191.png)]
或者执行Maven命令
mvn deploy
注意:
要发布的项目都需要配置distributionManagement
标签,要么在自己的pom.xml中配置,要么在其父项目中配置,然后子项目中继承父项目即可。
发布成功,在私服中就能看到:
现在发布是在itheima-snapshot仓库中,如果想发布到itheima-release仓库中就需要将项目pom.xml中的version修改成RELEASE即可。
如果想删除已经上传的资源,可以在界面上进行删除操作:
如果私服中没有对应的jar,会去中央仓库下载,速度很慢。可以配置让私服去阿里云中下载依赖。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lEQGy7Ac-1672725994120)(assets/1630993028454.png)]
至此私服的搭建就已经完成,相对来说有点麻烦,但是步骤都比较固定,后期大家如果需要的话,就可以参考上面的步骤一步步完成搭建即可。