黑马程序员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

Flutter 组件 spry 适配鸿蒙 HarmonyOS 实战:轻量化 Web 框架,构建高性能端侧微服务与 Middleware 治理架构

Flutter 组件 spry 适配鸿蒙 HarmonyOS 实战:轻量化 Web 框架,构建高性能端侧微服务与 Middleware 治理架构

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 spry 适配鸿蒙 HarmonyOS 实战:轻量化 Web 框架,构建高性能端侧微服务与 Middleware 治理架构 前言 在鸿蒙(OpenHarmony)生态迈向全场景分布式协同、涉及设备端侧 API 暴露、轻量化资源服务镜像及严苛的跨端 RPC 通信背景下,如何实现一套既能保持极低内存足迹(Footprint)、又能提供类似后端(Node.js/Koa)般丝滑开发体验且具备全异步处理能力的“端侧 Web 基座”,已成为决定应用分布式自治能力与全栈同构效率的关键。在鸿蒙设备这类强调 AOT 极致效能与背景任务严格限制的环境下,如果应用依然采用重量级的 HTTP 服务端,由于由于进程级的上下文切换开销,极易由于由于“算力溢出”导致鸿蒙应用在作为服务端响应时发生明显的电量损耗。 我们需要一种能够解耦路由逻辑、支持

Web 可访问性最佳实践:构建人人可用的前端界面

Web 可访问性最佳实践:构建人人可用的前端界面 代码如诗,包容如画。让我们用可访问性的理念,构建出人人都能使用的前端界面。 什么是 Web 可访问性? Web 可访问性(Web Accessibility)是指网站、工具和技术能够被所有人使用,包括那些有 disabilities 的人。这意味着无论用户的能力如何,他们都应该能够感知、理解、导航和与 Web 内容交互。 为什么 Web 可访问性很重要? 1. 法律要求:许多国家和地区都有法律法规要求网站必须具有可访问性。 2. 扩大用户群体:约 15% 的世界人口生活有某种形式的 disability,可访问性可以让更多人使用你的网站。 3. SEO 优化:搜索引擎爬虫依赖于可访问性良好的网站结构。 4. 更好的用户体验:可访问性改进通常会使所有用户受益,而不仅仅是那些有 disabilities 的用户。 5. 社会责任:

用Java飞算AI打造磁盘大文件搜寻助手,轻松解决C盘爆满难题

用Java飞算AI打造磁盘大文件搜寻助手,轻松解决C盘爆满难题

文章目录 * 一、前言 * 二、Java飞算AI开发体验 * 第一步:安装Java飞算插件 * 第二步:智能需求分析 * 第三步:智能接口设计 * 第四步:处理逻辑设计 * 第五步:一键生成源码 * 三、实战效果展示 * 发现问题的根源 * 清理前后对比 * 优化用户体验 * 深度清理成果 * 四、总结与感悟 一、前言 相信很多朋友都遇到过这样的困扰:C盘突然爆红,系统运行缓慢,却不知道到底是哪些文件在"偷偷"占用宝贵的磁盘空间。市面上的清理软件要么功能有限,要么需要开通会员才能查看大文件详情,着实让人头疼。 最近我在使用Java飞算插件开发MES系统时,深深被其强大的AI代码生成能力所震撼。今天,我决定用Java飞算来解决这个磁盘空间的老大难问题——开发一个磁盘大文件搜寻助手。 项目目标:基于Java 8开发一款轻量级工具,能够快速扫描指定磁盘或目录下的所有文件,按文件大小降序排列,并通过REST API提供查询功能,帮助用户精准定位大文件,高效分析磁盘空间占用情况。

从 XMLHttpRequest 到 Fetch API:现代前端网络请求的演进与迁移指南

从 XMLHttpRequest 到 Fetch API:现代前端网络请求的演进与迁移指南

🧑 博主简介:ZEEKLOG博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c=1000,移动端可关注公众号 “ 心海云图 ” 微信小程序搜索“历代文学”)总架构师,16年工作经验,精通Java编程,高并发设计,分布式系统架构设计,Springboot和微服务,熟悉Linux,ESXI虚拟化以及云原生Docker和K8s,热衷于探索科技的边界,并将理论知识转化为实际应用。保持对新技术的好奇心,乐于分享所学,希望通过我的实践经历和见解,启发他人的创新思维。在这里,我希望能与志同道合的朋友交流探讨,共同进步,一起在技术的世界里不断学习成长。 🤝商务合作:请搜索或扫码关注微信公众号 “ 心海云图 ” 从 XMLHttpRequest 到 Fetch API:现代前端网络请求的演进与迁移指南 引言:为什么我们需要新的网络请求方案? 在前端开发领域,XMLHttpRequest (XHR) 长期统治着浏览器端的网络请求。然而,随着 Web