JavaEE从入门到起飞(七) ~ Maven进阶

什么时候pom不要写版本号?

版本锁定是指在项目中固定特定依赖的版本,以避免因依赖升级而导致的问题。

被springboot-dependencies中的<dependencyManagement>所管理的不需要声明版本,一般国内产品需要写版本spring提供了该功能的其他实现,比如Spring Boot 默认使用 Logback 作为日志框架。如果你希望使用其他的日志框架,比如 Log4j2,那么你需要在 pom.xml 中进行相应的配置。

Maven

基础知识

导入maven项目:直接导入pom文件即可,不要导入文件夹。

maven是一个项目管理工具,主要作用如下:

  • 统一结构 :maven规定了一套标准的目录结构,不会因为开发工具而改变,例如IDEA和Eclipse目录结构都相同。
  • 依赖管理:就是对jar包的管理,通过导入maven坐标,就相当于将仓库中的jar包导入了当前项目中,不是手动导致。
  • 项目构建:通过maven的一个命令就可以完成项目从清理、编译、测试、报告、打包,部署整个过程。

模块拆分

目前我们开发是将所有的功能都写在一个项目中,随着项目规模越来越大,各个业务之间的代码就会变得错综复杂

因此需要对项目进行模块拆分,这样各个模块完成自己业务内的功能,这些模块组装起来达成整个项目的功能

分模块的好处:

  • 模块之间边界清晰,每个模块可以单独开发,协作人员随之减少,出现代码冲突情况也会大大降低
  • 开发更加灵活,模块体积更小,任务安排和问题排查更加方便

怎么拆分模块:

大部分情况都是按照功能拆分,各模块具备的功能相对独立:

  • sky-common(项目中通用代码)
  • sky-service (核心业务模块)
  • sky-web(表示层代码)

创建父子工程

创建父工程

父工程不需要写任何代码,只负责子模块的构建工作,因此可以把src目录删除掉

创建common模块

zzyl-common作为通用工具模块,可以放一些工具类、配置类、常量...

创建service模块

zzyl-service模块主要存放持久层和业务层代码

创建web模块

zzyl-web模块用于编写表示层代码,也就是controller层

分模块细节

模块聚合

在父工程上执行的各种maven命令子模块都会执行,并且会自动按照依赖层级执行,例如A依赖B,B依赖C,你使用install命令会优先安装C到本地仓库,其次是B,然后是A。

在 Maven 多模块项目中,最终的打包过程涉及到将各个模块的内容和依赖项整合到一个完整的、可部署的应用程序单元。例如:A依赖B,B依赖C,最终打包为jar时,打包出的内容为A.jar,其中B和C以jar包的形式存在于A的lib目录中。

模块继承

写在父工程中的依赖会被各个子模块继承,从而在各个子模块中可以直接使用依赖中的类

模块聚合

在父工程上执行的各种maven命令,会自动在各个子模块执行,例如在父工程上执行package,子模块都会执行打包操作

依赖传递

在maven中,依赖是可以传递的,假设存在三个项目,分别是项目A,项目B以及项目C

假设C依赖B,B依赖A,那么我们可以根据maven项目依赖的特征不难推出项目C也依赖A

依赖冲突

在依赖的传递过程中,很容易出现同一jar包的版本冲突问题,这个就称为依赖冲突

为了防止出现依赖冲突,可以采用锁定版本的方法确定依赖构件的版本,版本锁定后,系统会以锁定的版本的为准添加到工程中

xml 复制代码
<properties>
    <!--提取版本号-->
    <spring.version>5.3.22</spring.version>
</properties>

<!--依赖管理: 仅仅声明依赖版本,不会引入-->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>${spring.version}</version>
        </dependency>
    </dependencies>
</dependencyManagement>

<!--依赖引入: 不在设置版本号-->
<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
    </dependency>
</dependencies>
相关推荐
我命由我123452 小时前
Android Studio - Android Studio 自定义预览尺寸
android·java·ide·java-ee·android studio·android-studio·android runtime
咖啡八杯3 小时前
GoF设计模式——迭代器模式
java·后端·设计模式·迭代器模式
AIGS0013 小时前
企业AI落地的关键认知:向量空间JBoltAI的本体语义平台
java·人工智能·人工智能ai大模型应用
KaMeidebaby4 小时前
卡梅德生物技术快报|抗体亲和力成熟工业化调控新机制:差异性浆细胞增殖工艺优化思路
java·开发语言·人工智能·算法·机器学习·架构·spark
醉城夜风~6 小时前
Java详解经典算法题:接雨水(三种实现方案+原理剖析)
java·开发语言·算法
数智化转型推荐官7 小时前
2026统一身份管理系统五大发展趋势解读
java·运维·微服务
看菜鸡互7 小时前
探索用 SlideML 让大模型生成 PPT 的实验方法
java·运维
程序员张39 小时前
SpringBoot集成BCrypt密码加密库
java·spring boot·后端
闲猫9 小时前
Spring AI Agentic 模式(第1部分):Agent Skills——模块化、可复用的能力
java·人工智能·spring
源图客9 小时前
云途物流API开发-鉴权认证(Java)
java·网络·python