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>
相关推荐
qq_4419960523 分钟前
Mybatis官方生成器使用示例
java·mybatis
巨大八爪鱼30 分钟前
XP系统下用mod_jk 1.2.40整合apache2.2.16和tomcat 6.0.29,让apache可以同时访问php和jsp页面
java·tomcat·apache·mod_jk
码上一元2 小时前
SpringBoot自动装配原理解析
java·spring boot·后端
计算机-秋大田2 小时前
基于微信小程序的养老院管理系统的设计与实现,LW+源码+讲解
java·spring boot·微信小程序·小程序·vue
魔道不误砍柴功4 小时前
简单叙述 Spring Boot 启动过程
java·数据库·spring boot
冰芒猓4 小时前
SpringMVC数据校验、数据格式化处理、国际化设置
开发语言·maven
失落的香蕉4 小时前
C语言串讲-2之指针和结构体
java·c语言·开发语言
枫叶_v4 小时前
【SpringBoot】22 Txt、Csv文件的读取和写入
java·spring boot·后端
wclass-zhengge4 小时前
SpringCloud篇(配置中心 - Nacos)
java·spring·spring cloud
路在脚下@4 小时前
Springboot 的Servlet Web 应用、响应式 Web 应用(Reactive)以及非 Web 应用(None)的特点和适用场景
java·spring boot·servlet