Maven高级(工程分模块开发,聚合于继承,版本锁定,Mavne私服的搭建和发布)【详解】

目录

一、Maven复习

1. Maven基本概念

1 Maven的作用

2 Maven的仓库

3 坐标的概念

2. Maven安装配置

3. Maven构建项目

4. Maven依赖管理

5. Maven依赖传递

二、工程分模块开发

1. 分模块开发介绍

2. 工程分模块示例

(1) 创建父工程

(2) 创建pojo模块步骤

(3) 创建utils模块

(4) 创建tlias-management模块

测试

3. 聚合与继承

1 聚合

2 聚合语法

3 继承

4. 版本锁定

1 版本锁定

2 定义properties

三、Maven私服

1. 什么是maven私服

2. 搭建maven私服

1 解压nexus程序包

2 启动nexus

3 进入nexus管理界面

3. 发布jar包到私服

1 配置私服地址

2 配置私服帐号和密码

3 把项目发布到私服

4. 从私服下载jar包

1 配置私服地址

2 测试效果


一、Maven复习

1. Maven基本概念

1 Maven的作用

Maven是Apache提供的一个项目管理工具

Maven的作用:

  • 可以帮我们管理依赖

    这里的“依赖”,通常指的是jar包,也可以是一个Module(一个Module完全可以被打包成jar)

    可以减少jar包的多次拷贝,导致的重复

    可以辅助我们分析jar包之间的依赖关系,当出现依赖冲突时,解决起来相对容易一些

    maven自动帮我们下载jar包,不需要我们自己查找、下载了

  • 可以帮我们构建项目

    “构建”是一个项目代码编写之后,所经历的一系列的编译、测试、打包、安装、发布等等一系列的过程

    如果没有idea,要构建一个项目是非常麻烦的

    而如果有maven软件,只要通过简单的maven命令就可以实现项目构建了

  • 可以实现项目的分模块开发

    项目可以分模块,就具备了开发大型项目的条件了

2 Maven的仓库

Maven的仓库:指的是jar包的仓库。maven始终从本地仓库里加载jar包

  • 本地仓库

  • 私服

  • 中央仓库

3 坐标的概念

什么是坐标:用于精准定位到一个jar包的标识,可以理解为jar包的唯一标识

注意:被maven管理的所有jar包、工程、模块等等,都必须有坐标,而且坐标不能重复

坐标的组成:

  • groupId:通常是公司名、组织名 域名倒写。比如:com.jd, com.baidu, com.itheima

  • artifactId:通常是包名

  • version:通常是版本号,完全可以自定义。不约而同的有两种常见的后缀

    1.0-SNAPSHOT:通常指的是 快照版本、不稳定版、尝鲜版

    1.0-RELEASE:通常指的是发行版、稳定版

2. Maven安装配置

修改maven的settings.xml,配置阿里云仓库镜像:在==mirrors标签内部==增加以下内容

<mirror><id>aliyunmaven</id><mirrorOf>*</mirrorOf><name>阿里云公共仓库</name><url>https://maven.aliyun.com/repository/public</url>
</mirror>

3. Maven构建项目

通过一些命令实现项目的构建的:

  • mvn clean:用于清理之前编译的结果(删除target文件夹)

  • mvn compile:用于编译项目的,maven会把编译的结果,放到自动生成的target文件夹里

  • mvn test:用于批量执行所有的单元测试类和测试方法。要求

    • 单元测试类名,必须以Test结尾。否则不会自动运行这个测试类的

    • 单元测试方法名,建议以test开头。只是建议,即使不以test开头,也会被test命令正常执行

  • mvn package:用于打包。一个项目会被打成什么格式的包:

    • jar包:如果pom.xml里有<packaging>jar<packaging>,或者没有这个标签,都会打成jar包

    • war包:在不使用SpringBoot的情况下,我们开发的应用,都要打成war包,然后部署到Tomcat里才能够运行

  • mvn install:把打包之后的包文件,安装到本地仓库里

  • mvn deploy:把jar包发布到远程仓库里

4. Maven依赖管理

项目里要导入的jar包,只要在pom.xml配置坐标就可以了

<dependencies><dependency><groupId>org.dom4j</groupId><artifactId>dom4j</artifactId><version>2.1.4</version><scope>配置依赖范围</scope></dependency>
</dependencies>

scope依赖范围:

  • compile:默认的,全范围有效。编译时有效(写代码时能用jar包里的类),运行时有效,单元测试里有效

  • provided:编译时有效,运行时忽略。通常用于开发时必须提供,但是开发完成部署到生产环境时,生产环境里有这个包。比如Servlet包

  • runtime:编译时忽略,运行时有效。比如数据库驱动包,写代码时如果没有驱动包,也不耽误写,但是程序运行时必须有驱动包

  • test:仅在单元测试时有效。比如spring-boot-starter-test可以设置为test范围有效

  • system:让maven引用仓库之外的本地的jar包

实际使用时:

  • 绝大多数jar包都使用默认的依赖范围compile,全范围有效

  • 单元测试相关的包,设置为test

5. Maven依赖传递

依赖传递:项目依赖于A,而A依赖于B,那么我们可以认为:项目也依赖于B

好处是:可以在pom.xml少写一些

坏处有:可能产生依赖冲突

  • 项目-->A-->X1

  • 项目-->B-->X2

  • 项目引用的X,就出现了版本冲突

依赖冲突:maven有自动调解冲突的原则

  • 最短路径优先。比如下面的例子,X2会生效

    项目-->A-->B-->X1

    项目-->C--X2

  • 第一声明优先。如果路径长度相同,哪个依赖先声明,哪个依赖就生效

    • 项目-->A-->X1

    • 项目-->B-->X2

  • 手动排除法:不依靠maven的自动调解

    • 项目-->A-->X1。导入A的时候,可以手动排除掉X1不导入

    • 项目-->B-->X2

二、工程分模块开发

1. 分模块开发介绍

  1. 一切功能,一切代码,一切业务模块全部放到一个项目里

    • 不同功能代码之间的耦合性强。

    • 不能对不同功能做针对性的增强。

      2.把一个项目拆分成多个子系统

        可以针对不同子系统,做针对性的增强

        可以降低不同子系统之间的耦合性

        问题:有重复类

      3.把一个项目拆分成多个子系统,并且把重复类提取到公用Module里

       可以针对不同子系统,做针对性的增强

       可以降低不同子系统之间的耦合性

       减少重复代码:哪个子系统需要使用公用模块里的类,只要在pom.xml里引用它的坐标就可以用了

2. 工程分模块示例

针对之前完成的tlias项目,改造成工程分模块的方式

项目的整体目录结构:

(1) 创建父工程
  1. 创建project,设置名称为tlias-parent

  2. 创建后,删除src文件夹。因为父工程里不需要放代码

  3. 修改pom.xml,添加依赖如下:

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.3</version>
</parent><!--锁定版本号-->
<dependencyManagement><dependencies><!--锁定Mybatis起步依赖的版本号--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.2</version></dependency><!--锁定mysql驱动的版本号--><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><version>8.0.33</version></dependency><!--锁定PageHelper起步依赖的版本号--><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.4.2</version></dependency><!--锁定FastJson的版本号--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.76</version></dependency></dependencies>
</dependencyManagement><dependencies><!--Lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency>
</dependencies>
(2) 创建pojo模块步骤
  1. 在父工程tlias-parent上右键,新建Module,名称为 tlias-pojo

  2. 创建包com.itheima.pojo,把实体类拷贝到包里

步骤

  1. 在父工程tlias-parent上右键,新建Module,名称为 tlias-pojo

  2. 创建包com.itheima.pojo,把实体类拷贝到包里

(3) 创建utils模块

步骤

  1. 在父工程tlias-parent上右键,新建Module,名称为tlias-utils

  2. 创建包com.itheima.util,把工具类拷贝到包里

  3. 修改pom.xml,添加依赖如下:

<dependencies><!--阿里云OSS--><dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.15.1</version></dependency><!--JWT--><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency><dependency><groupId>javax.xml.bind</groupId><artifactId>jaxb-api</artifactId><version>2.3.1</version></dependency><!--web起步依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
</dependencies>
(4) 创建tlias-management模块

步骤

  1. 在父工程tlias-parent上右键,新建Module,名称为tlias-managenent

  2. 创建包com.itheima,把剩余的包和类(除了pojo和util之外的)全部拷贝进来

  3. 修改pom.xml,添加依赖如下:

<dependencies><!--pojo依赖坐标--><dependency><groupId>org.example</groupId><artifactId>tlias-pojo</artifactId><version>1.0-SNAPSHOT</version></dependency><!--utils起步依赖--><dependency><groupId>org.example</groupId><artifactId>tlias-utils</artifactId><version>1.0-SNAPSHOT</version></dependency><!--AOP起步依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><!--web起步依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--mybatis起步依赖--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId></dependency><!--mysql驱动--><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId></dependency><!--PageHelper分页插件--><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId></dependency><!--fastJSON--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId></dependency>
</dependencies>

测试

运行tlias-management里的引导类,启动服务

启动nginx

打开浏览器访问 http://localhost:90,重新登录后测试功能

3. 聚合与继承

1 聚合

为什么要聚合:

项目开发通常是分组分模块开发, 每个模块开发完成要运行整个工程需要将每个模块聚合在 一起运行,比如: tlias-pojo、tlias-utils、tlias-management 三个模块最终会打一个独立的工程jar包运行。

聚合的特性:

  • 通过Maven命令操作一个模块,会同时操作其聚合的所有子模块

2 聚合语法

3 继承

为什么要继承:

继承是为了消除重复。如果多个模块的pom.xml中都要相同的配置(例如编译版本、依赖版本锁定等),则提取到父模块的pom.xml中配置即可,就避免了重复配置。

继承的特性:

  • 子模块继承父工程,可以直接使用父工程里的依赖

  • 如果父工程和子模块都引入了同一个依赖,则子模块自己的生效

效果演示

父工程里导入了lombok,那么子模块里不需要再导lombok,就能直接使用

4. 版本锁定

1 版本锁定

版本锁定:可以在父工程或父模块里,提前使用<dependencyManagement>锁定某些依赖的版本号。这样的话,子模块在真正引入依赖时,就不需要再写版本号了

好处:如果要修改某个依赖的版本号,只要去父工程的pom.xml修改锁定的版本号,之后所有的子模块里的依赖版本号就自动随之改变了

2 定义properties

说明:我们可以把pom.xml里的一些配置,提取到properties标签里统一进行维护。在pom.xml要使用这些配置时,按照请求${标签名}可以取值

三、Maven私服

注意:练习maven私服前,先把settings.xml复制一个副本作为备份;练习后再恢复回去,否则影响后续开发

1. 什么是maven私服

  • 公司在自己的局域网内搭建自己的远程仓库服务器,称为私服

  • 私服服务器即是公司内部的 maven 远程仓库, 每个员工的电脑上安装 maven 软件并且连接私服服务器,员工将自己开发的项目打成 jar 并发布到私服服务器,其它项目组从私服服务器下载所依赖的构件(jar)。

  • 私服还充当一个代理服务器,当私服上没有 jar 包会从互联网中央仓库自动下载,如下图 :

私服的使用模式

2. 搭建maven私服

【文件我上传置顶了】

1 解压nexus程序包

2 启动nexus

进入nexus的nexus-3.39.0-01/bin目录下,双击 start.bat 即可启动nexus

注意:启动后不要关闭黑窗口

3 进入nexus管理界面

打开浏览器,输入地址 http://localhost:8081并回车。nexus的帐号密码是 admin/admin

点击左侧菜单栏的Browse,可以浏览nexus里的私服仓库

3. 发布jar包到私服

并不是任何人都可以随便把jar包发布到私服上的,那会造成私服混乱。所以如果要把一个项目,或者把一个jar包发布到私服上,需要提供私服的地址、帐号和密码。

1 配置私服地址

在项目的==父工程pom.xml==里配置私服的地址,如下:

<distributionManagement><!-- release版本的发布地址 --><repository><!-- 仓库名称 --><id>maven-releases</id><!-- 仓库地址 --><url>http://localhost:8081/repository/maven-releases/</url></repository><!-- snapshot版本的发布地址 --><snapshotRepository><!-- 仓库名称 --><id>maven-snapshots</id><!-- 仓库地址 --><url>http://localhost:8081/repository/maven-snapshots/</url></snapshotRepository>
</distributionManagement>

2 配置私服帐号和密码

修改==maven的settings.xml==文件,在servers标签内部添加如下内容

<!-- release仓库的帐号密码 -->
<server><!-- 仓库id,要和上一步配置仓库地址时的id相同 --><id>maven-releases</id><username>admin</username><password>admin</password>
</server><!-- snapshots仓库的帐号密码 -->
<server><!-- 仓库id,要和上一步配置仓库地址时的id相同 --><id>maven-snapshots</id><username>admin</username><password>admin</password>
</server>

3 把项目发布到私服

针对项目父工程,执行deploy命令,即可把项目发布到私服上

  • 因为我们的项目坐标里,版本号后缀是snapshot,所以项目会发布到maven-snapshots仓库里

打开nexus的管理界面,找到maven-snapshots仓库,可以看到刚刚上传的jar包

4. 从私服下载jar包

要从私服里下载jar包到本地仓库,只要有私服的地址就可以了

1 配置私服地址

注意:如果之前配置了阿里云仓库镜像,需要把阿里云仓库镜像的配置删除掉或者注释掉

修改==maven的settings.xml==,找到其中的profiles标签,在标签内部添加以下内容

<profile><id>allow-snapshots</id><activation><activeByDefault>true</activeByDefault></activation><repositories><repository><id>maven-public</id><url>http://localhost:8081/repository/maven-public/</url><releases><enabled>true</enabled></releases><snapshots><enabled>true</enabled></snapshots></repository></repositories>
</profile>

2 测试效果

找到maven本地仓库,删除tlias-pojo对应的jar包

找到任意一个maven工程,在pom.xml里添加tlias-pojo的依赖坐标,编译项目,会自动从私服上把tlias-pojo对应的jar下载到本地仓库里

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

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

相关文章

【Redis】优惠券秒杀

全局唯一ID 全局唯一ID生成策略&#xff1a; UUIDRedis自增snowflake算法数据库自增 Redis自增ID策略&#xff1a;每天一个key&#xff0c;方便统计订单量ID构造是 时间戳 计数器 Component public class RedisIdWorker {// 2024的第一时刻private static final long BEGIN…

【Linux】vim配置及安装方法

注 安装方法在文章最后 配置文件的位置 在目录 /etc/ 下面&#xff0c;有个名为vimrc的文件&#xff0c;这是系统中公共的vim配置文件&#xff0c;对所有用户都有效。而在每个用户的主目录下&#xff0c;都可以自己建立私有的配置文件&#xff0c;命名为“.vimrc”。例如&…

20240319-图论

图论练习题目 拓扑排序深度优先搜索方法广度优先搜索方法 无向无权图无向有权图有向无权图 利用广度优先搜索算法有向有权图 带排序的广度优先算法/dijkstra最小生成树prims算法Kruskals Algorithm 最小割 min-cut二分图 Bipartite Graph 队列例题1 所有可能的路径例题2 岛屿数…

【Linux】写个日志和再谈线程池

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;信号量和线程池 目录 &#x1f449;&#x1f3fb;日志代码Log.cppMain.cc &#x1f449;&#x1f3fb;线程池代码LockGuard.hpp(自定义互斥锁&#xff0c;进…

Java获取方法参数名称方案||SpringBoot配置顺序注解

一: Java获取方法参数名称的方法 普盲: getDeclaredMethods与getMethods的的区别 1、getMethods返回一个包含某些 Method 对象的数组&#xff0c;这些对象反映此 Class 对象所表示的类或接口的公共 member 方法。 2、getDeclaredMethods返回 Method 对象的一个数组&#xff0c…

python绘图matplotlib——使用记录2

本博文来自于网络收集&#xff0c;如有侵权请联系删除 三维图绘制 1 三维散点图2 三维柱状图三维曲面 1 三维散点图 import matplotlib.pyplot as plt import numpy as npfrom mpl_toolkits.mplot3d import Axes3Dfig plt.figure() # ax fig.gca(projection"3d")…

Docker(二):Docker常用命令

docker 查看docker支持的所有命令和参数。 ➜ ~ docker Management Commands:config Manage Docker configscontainer Manage containersimage Manage imagesnetwork Manage networksnode Manage Swarm nodesplugin Manage pluginssecret …

操作系统究竟是什么?在计算机体系中扮演什么角色?

操作系统究竟是什么&#xff1f;在计算机体系中扮演什么角色&#xff1f; 一、操作系统概念二、操作系统如何管理软硬件资源2.1 何为管理者2.2 操作系统如何管理硬件 三、系统调用接口作用四、用户操作接口五、广义操作系统和狭义操作系统 一、操作系统概念 下面是来自百度百科…

51单片机学习笔记——LED闪烁和流水灯

任务分析 首先要知道LED闪烁主要是怎么工作的&#xff0c;闪烁亮灭自然是一下为高一下为低&#xff0c;亮灭的频率则需要延时来进行控制。 上节已经知道了如何点亮那延时如何做呢首先先编写主框架 这样是否可以通过循环将LED灯一直循环闪烁。 以为while一直在循环所以其实是可…

【评分标准】【网络系统管理】2019年全国职业技能大赛高职组计算机网络应用赛项H卷 无线网络勘测设计

第一部分&#xff1a;无线网络勘测设计评分标准 序号评分项评分细项评分点说明评分方式分值1点位设计图AP编号AP编号符合“AP型号位置编号”完全匹配5AP型号独立办公室、小型会议室选用WALL AP110完全匹配5员工寝室选用智分&#xff0c;其他用放装完全匹配5其它区域选用放装AP…

设计模式(十二):中介者模式(行为型模式)

Mediator&#xff0c;中介者模式&#xff1a;用一个中介对象封装一些列的对象交互。属于行为型模式 Facade&#xff0c;外观模式&#xff1a;为子系统中的一组接口提供一致的界面&#xff0c;facade 提供了一高层接口&#xff0c;这个接口使得子系统更容易使用。属于结构型模式…

Linux升级GCC

文章目录 一、安装 EPEL 仓库二、更新yum三、安装 CentOS 开发工具组四、安装scl五、安装gcc 11六、启用gcc 11七、设置永久使用 一、安装 EPEL 仓库 命令&#xff1a; yum install epel-release -y二、更新yum 命令&#xff1a; yum update -y三、安装 CentOS 开发工具组 …

opencv各个模块介绍(2)

Features2D 模块&#xff1a;特征检测和描述子计算模块&#xff0c;包括SIFT、SURF等算法。 Features2D 模块提供了许多用于特征检测和描述子匹配的函数和类&#xff0c;这些函数和类可用于图像特征的提取、匹配和跟踪。 FeatureDetector&#xff1a;特征检测器的基类&#xf…

[BT]BUUCTF刷题第6天(3.24)

第6天 Web [极客大挑战 2019]PHP Payload&#xff1a; O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";s:3:"100";}这道题考点是网站源码备份文件泄露和PHP反序列化&#xff0c;有篇介…

t-rex2开放集目标检测

论文链接&#xff1a;http://arxiv.org/abs/2403.14610v1 项目链接&#xff1a;https://github.com/IDEA-Research/T-Rex 这篇文章的工作是基于t-rex1的工作继续做的&#xff0c;核心亮点&#xff1a; 是支持图片/文本两种模态的prompt进行输入&#xff0c;甚至进一步利用两…

013_Linux(上传rz,下载sz,tar,zip,unzip)

目录 一、上传、下载 1、通过鼠标操作 &#xff08;1&#xff09;下载 &#xff08;2&#xff09;上传 2、通过命令操作 rz、sz &#xff08;1&#xff09;下载 sz &#xff08;2&#xff09;上传 rz 二、压缩、解压 1、tar命令 &#xff08;1&#xff09;压缩 &…

使用amd架构的计算机部署其他架构的虚拟机(如:arm)

1 下载quem模拟器 https://qemu.weilnetz.de/w64/2 QEMU UEFI固件文件下载(引导文件) 推荐使用&#xff1a;https://releases.linaro.org/components/kernel/uefi-linaro/latest/release/qemu64/QEMU_EFI.fd3 QEMU 安装 安装完成之后&#xff0c;需要将安装目录添加到环境变…

vscode的一些技巧

技巧1&#xff1a;调试时传参数 在launch.json的configuration中"pwd"或者"program"选项之后添加如下选项&#xff1a; “--args”:["参数1", "参数2", ..., "参数3] 参数之间使用逗号隔开 技巧2&#xff1a;断点 普通断点使…

通过dbeaver链接dm8数据库

一、环境说明 windows 11 vmware 17 ubuntu 22 tt:~$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.3 LTS Release: 22.04 Codename: jammytt:~$ docker info Client:Version: 24.0.5Context: d…

Python 全栈系列236 rabbit_agent搭建

说明 通过rabbit_agent, 以接口方式实现对队列的标准操作&#xff0c;将pika包在微服务内&#xff0c;而不必在太多地方重复的去写。至少在服务端发布消息时&#xff0c;不必再去考虑这些问题。 在分布式任务的情况下&#xff0c;客户端本身会启动一个持续监听队列的客户端服…