黑马程序员java web学习笔记--后端进阶(三)Maven高级

目录

1 分模块设计与开发

2 继承与聚合

2.1 继承(简化依赖配置、统一管理依赖版本)

2.1.1 继承关系

2.1.2 版本锁定 

2.2 聚合 (快速构建项目,在父工程/聚合工程中配置聚合的模块)

maven 中继承与聚合的联系与区别?

3 私服


Maven 是一款构建和管理 Java 项目的工具

1 分模块设计与开发

分模块设计就是将项目按照功能/结构拆分成若干个子模块,方便项目的管理维护、拓展,也方便模块键的相互调用、资源共享。

  1. 策略一:按照功能模块拆分,比如:公共组件、商品模块、搜索模块、购物车模块、订单模块等。
  2. 策略二:按层拆分,比如:公共组件、实体类、控制层、业务层、数据访问层。
  3. 策略三:按照功能模块 + 层拆分。

eg:

注意:分模块开发需要先针对模块功能进行设计,再进行编码。不会先将工程开发完毕,然后进行拆分。

2 继承与聚合

在案例项目分模块开发之后,我们会看到 tlias-pojo、tlias-utils、tlias-web-management 中都引入了一个依赖 lombok 的依赖。我们在三个模块中分别配置了一次。

若需要修改版本,则需要每一个都去修改,非常的繁琐,Maven的继承用来解决这个问题。

2.1 继承(简化依赖配置、统一管理依赖版本)

2.1.1 继承关系<parent>

创建一个父工程 tlias-parent ,然后让上述的三个模块 tlias-pojo、tlias-utils、tlias-web-management 都来继承这个父工程 。 然后再将各个模块中都共有的依赖,都提取到父工程 tlias-parent中进行配置。

作用:简化依赖配置、统一管理依赖。

<parent> <groupId>...</groupId> <artifactId>...</artifactId> <version>...</version> <relativePath>....</relativePath> </parent>

Maven不支持多继承,一个maven项目只能继承一个父工程,如果tlias-web-management继承了spring-boot-starter-parent,就没法继承我们自己定义的父工程 tlias-parent了。

解决:自己创建的三个模块,都继承 tlias-parent,而 tlias-parent 再继承 spring-boot-starter-parent,就可以了。

Maven打包方式:jar:普通模块打包,springboot项目基本都是jar包(内嵌tomcat运行)。war:普通web程序打包,需要部署在外部的tomcat服务器中运行。pom:父工程或聚合工程,该模块不写代码,仅进行依赖管理。

创建maven模块 tlias-parent ,该工程为父工程,设置打包方式pom(默认jar)。

Maven 的继承关系实现步骤:

在父工程中配置各个工程的共有依赖。

在子工程中配置继承关系。
注意:
①在子工程中,配置了继承关系之后,坐标中的groupId是可以省略的,因为会自动继承父工程的 。
②relativePath指定父工程的pom文件的相对位置(如果不指定,将从本地仓库/远程仓库查找该工程)。其中../ 代表的上一级目录。
③若父子工程都配置了同一个依赖的不同版本,以子工程的为准。

创建父工程,设置打包方式为 pom。并继承 spring-boot-starter-parent。

工程结构说明:

实际项目中,可能还会见到下面的工程结构:tlias-parenttlias-pojotlias-utilstlias-web-management

而在真实的企业开发中,都是先设计好模块之后,再开始创建模块,开发项目。 那此时呢,一般都会先创建父工程 tlias-parent,然后将创建的各个子模块,都放在父工程parent下面。 这样层级结构会更加清晰一些。

2.1.2 版本锁定 <dependencyManagement> <properties>

问题:如果项目拆分的模块比较多,每一次更换版本,我们都得找到这个项目中的每一个模块,一个一个的更改。 很容易就会出现,遗漏掉一个模块,忘记更换版本的情况。那我们又该如何来解决这个问题,如何来统一管理各个依赖的版本呢?

答案:Maven的版本锁定功能。

在maven中,可以在父工程的pom文件中通过 <dependencyManagement> 来统一管理依赖版本。

  • 父工程:在父工程中所配置的 <dependencyManagement> 只能统一管理依赖版本,并不会将这个依赖直接引入进来。 这点和 <dependencies> 是不同的。
<!--统一管理依赖版本--> <dependencyManagement> <dependencies> <!--JWT令牌--> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.1</version> </dependency> </dependencies> </dependencyManagement>
  • 子工程:子工程要使用这个依赖,还是需要引入的,只是此时就无需指定 <version> 版本号了,父工程统一管理。变更依赖版本,只需在父工程中统一变更。
<dependencies> <!--JWT令牌--> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> </dependency> </dependencies>

2.1.3 属性配置

通过自定义属性及属性引用的形式,在父工程中将依赖的版本号进行集中管理维护。

面试题:<dependencyManagement> 与 <dependencies> 的区别是什么?<dependencies> 是直接依赖,在父工程配置了依赖,子工程会直接继承下来。<dependencyManagement> 是统一管理依赖版本,不会直接依赖,还需要在子工程中引入所需依赖(无需指定版本)。

2.2 聚合<modules>(快速构建项目,在父工程/聚合工程中配置聚合的模块)

我们的项目被拆分为多个模块,而模块之间的关系错综复杂。

tlias-web-management 模块的父工程是 tlias-parent,该模块又依赖了 tlias-pojo、tlias-utils 模块。 那此时,在进行tlias-web-management 模块打包时,maven会从本地仓库中来查找 tlias-parent 父工程,以及它所依赖的模块 tlias-pojo、tlias-utils,而本地仓库目前是没有这几个依赖的。

所以,在打包tlias-web-management 模块前,需要将 tlias-parent、tlias-pojo、tlias-utils 分别执行install生命周期安装到maven的本地仓库,然后再针对于 tlias-web-management 模块执行package进行打包操作。

如果开发一个大型项目,拆分的模块很多,模块之间的依赖关系错综复杂,那此时要进行项目的打包、安装操作,是非常繁琐的。

maven的聚合就是来解决这个问题的,通过maven的聚合就可以轻松实现项目的一键构建(清理、编译、测试、打包、安装等)。

  • 聚合:将多个模块组织成一个整体,同时进行项目的构建。
  • 聚合工程:一个不具有业务功能的“空”工程(有且仅有一个pom文件) 【PS:一般来说,继承关系中的父工程与聚合关系中的聚合工程是同一个】
  • 作用:快速构建项目(无需根据依赖关系手动构建,直接在聚合工程上构建即可)
<!--聚合哪些模块--> <modules> <module>../tlias-pojo</module> <module>../tlias-utils</module> <module>../tlias-web-management</module> </modules>

此时,maven面板也会发生改变,只剩下tlias-parent这个父工程。

那此时,我们要进行编译、打包、安装操作,就无需在每一个模块上操作了。只需要在聚合工程上,统一进行操作就可以了。

maven 中继承与聚合的联系与区别?

联系:继承与聚合都属于设计型模块,打包方式都为 pom,常将两种关系制作到同一个 pom 文件中。

区别:继承用于简化依赖配置、统一管理依赖版本,是在子工程中配置继承关系。聚合用于快速构建项目,是在父工程(聚合工程)中配置聚合的模块。

3 私服

私服:是一种特殊的远程仓库,它是架设在局域网内的仓库服务,用来代理位于外部的中央仓库,用于解决团队内部的资源共享与资源同步问题。

依赖查找顺序:本地仓库~私服仓库~中央仓库

注意事项:私服在企业项目开发中,一个项目/公司,只需要一台即可(无需我们自己搭建,会使用即可)。

私服仓库说明:

  • RELEASE:存储自己开发的RELEASE发布版本的资源。
  • SNAPSHOT:存储自己开发的SNAPSHOT发布版本的资源。
  • Central:存储的是从中央仓库下载下来的依赖。

项目版本说明:

  • RELEASE(发布版本):功能趋于稳定、当前更新停止,可以用于发行的版本,存储在私服中的RELEASE仓库中。
  • SNAPSHOT(快照版本):功能不稳定、尚处于开发中的版本,即快照版本,存储在私服的SNAPSHOT仓库中。

https://heuqqdmbyk.feishu.cn/wiki/BPzFwIajLi8GXyk3JXmcLRYVn5c

Read more

我用Openclaw + Claude搭了一套自动写作系统,每天省3小时

我用Openclaw + Claude搭了一套自动写作系统,每天省3小时

这是我目前最重要的一套AI工作流。从信息获取到发布,几乎不用手动完成。 一、为什么我要搭建这套系统? 信息过载的困境 如果你也在持续关注AI,应该会有同样的感受: 信息太多了。 每天打开 X、公众号、GitHub、技术社区,都会冒出大量新内容。 AI模型更新、工具更新、Agent框架、自动化方案…… 想跟上这些信息,本身就已经是一项工作。 手动写作的低效循环 更别说: * 整理信息 * 找选题 * 写文章 * 配图 * 发布到各个平台 如果全部手动完成,写作就会变成一件非常消耗精力的事。 我一度也在这种状态里: 想持续输出,但写作本身占用了太多时间。 一个关键问题 后来我开始思考一个问题: 如果写作这件事可以被"系统化",会发生什么? 于是,我不再把AI当成写作工具。 而是开始搭一套完整的 AI写作工作流。 二、思路转变:从优化写作到优化流程 大多数人的AI写作方式 大多数人使用AI写作,是这样:

为什么“虚拟现实“和“增强现实“不同?——从虚拟到混合的视觉革命

🕶️ 为什么"虚拟现实"和"增强现实"不同?——从虚拟到混合的视觉革命 🌈 大家好,我是无限大,欢迎收看十万个为什么系列文章 希望今天的内容能对大家有所帮助 今天咱们来聊聊VR和AR这个"视觉科技的双生子"!想象一下,你戴着头显在虚拟世界里打游戏,仿佛身临其境;你用手机对着桌子,屏幕上出现一个3D模型,仿佛它真的在桌子上——这些炫酷的体验,都是VR和AR带来的!但你知道它们的区别吗? 🤔 核心问题:VR和AR的区别是什么?它们的技术原理和应用场景有何不同? 很多人觉得VR和AR是"一回事",其实它们差别很大!VR就像"完全进入另一个世界",而AR是"在现实世界里加东西"。今天咱们就来揭开它们的神秘面纱! VR和AR的本质 * 🎮 VR(Virtual Reality):虚拟现实,通过头显完全沉浸在虚拟世界中,

FPGA原理和应用

FPGA原理和应用

大家好,我是良许。 说到 FPGA,可能很多做嵌入式的朋友都听说过,但真正深入了解的可能不多。 作为一名嵌入式程序员,我在工作中虽然主要接触的是单片机和嵌入式 Linux,但在汽车电子领域,FPGA 也是一个非常重要的技术方向。 今天就来和大家聊聊 FPGA 的原理和应用,希望能帮助大家对这个"神秘"的器件有更清晰的认识。 1. FPGA 是什么 1.1 FPGA 的基本概念 FPGA 的全称是 Field Programmable Gate Array,翻译过来就是"现场可编程门阵列"。 这个名字听起来有点拗口,但其实很好理解。 我们可以把 FPGA 想象成一块"电子积木",你可以根据自己的需求,把这些积木搭建成不同的电路结构。 与我们常用的单片机(如 STM32)

基于腾讯云云服务器搭建一个Clawdbot,实现Telegram机器人自动回复

基于腾讯云云服务器搭建一个Clawdbot,实现Telegram机器人自动回复

哈咯大家好,这里依然是码农的搬运工!! 从25年开始,全球都开始走向AI,拥抱AI。 最近博主,也就是我,发现一个国外作者,【Peter Steinberger】在本月推出了一个新的智能体【Clawdbot】,首先我们可以先去官网看一下这个东西是什么:Clawdbot  那么我也是研究了一把,但是这个文档实在是差点把我这个大专生劝退,纯英文,废了九牛二虎之力,我才差不多看懂了。肯定有小伙伴比较好奇,那么文档给你们放出来你们也可以看看:https://docs.molt.bot/start/getting-started OK!话不多说,那我们开始实操一下: 首先呢,看了一下这个文档,安装环境还是不错的,macOS/Linux、Windows【Powershell/CMD】 而且作者还贴心的给了安装命令,这样就省了好大一部分精力。不需要费劲去git拉取代码编译了。【这里需要注意一点,macos系统得14+,作者只有13的系统,所以是没有办法弄mac的】 当然,如果有小伙伴就是头铁,还是想从git上拉代码,那我也给你贴一下这个文档,你来安装: