SpringBoot - Maven 补充

  • 依赖冲突
    • 解决方案 - dependencyManagement
    • 自定义属性
  • 分模块构建项目
    • 继承 - parent
    • 聚合 - modules
    • 依赖 - dependency
  • 各模块的分工 - 以层来划分
    • 父模块:全局定义
    • dao 模块:定义 dao 类、Model 类等
    • service 模块:定义 service 类等
    • web 模块:定义 controller 类等
    • optional

Java 从 0 到架构师目录:【Java从0到架构师】学习记录

Gitee 代码:https://gitee.com/szluyu99/mj_java_frame/tree/master/04_SpringBoot

依赖冲突

什么是依赖冲突

首先,spring-webmvc、spring-jdbc都依赖 spring-beans

  • 如果 spring-webmvc 的版本是 5.2.6,那么它依赖的 spring-beans 默认版本也是5.2.6
  • 如果 spring-jdbc的版本是 5.2.8,那么它依赖的 spring-beans 默认版本也是 5.2.8

如果将 5.2.6 版本的 spring-webmvc,5.2.8 版本的 spring-jdbc放一起:

  • 会出现 2 个版本的 spring-beans,即产生了依赖冲突
  • 需要想办法只保留一个版本的 spring-beans

解决方案 - dependencyManagement

方法一默认情况下,优先保留前面先声明的版本

  • 根据下面的代码,最终 spring-beans 将会是 5.2.6 版本:
<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.6.RELEASE</version>
</dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.2.8.RELEASE</version>
</dependency>

方法二:单独为依赖库增加 dependency 指定版本号

  • 根据下面的代码,最终 spring-beans 将会是 5.2.8 版本
<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.6.RELEASE</version>
</dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.2.8.RELEASE</version>
</dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>5.2.8.RELEASE</version>
</dependency>

方法三:使用 exclusion 排除某个依赖

  • 根据下面的代码,最终 spring-beans 将会是 5.2.8 版本
<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.6.RELEASE</version><exclusions><exclusion><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId></exclusion></exclusions>
</dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.2.8.RELEASE</version>
</dependency>

方法四(最常用):使用 dependencyManagement 锁定依赖库的版本号

  • 根据下面的代码,最终 spring-beans 将会是 5.2.8 版本
<!-- 仅用于锁定库的版本号,并不会去下载导入库 -->
<dependencyManagement><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>5.2.8.RELEASE</version></dependency></dependencies>
</dependencyManagement>

注意:dependencyManagement 只是声明版本号,并不会触发下载导入依赖库

自定义属性

<properties><!-- 统一管理依赖库的版本 --><spring.verison>5.2.8.RELEASE</spring.version>
</properties><dependencyManagement><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${spring.version}</version></dependency></dependencies>
</dependencyManagement>

分模块构建项目

项目规模比较庞大时,可以考虑对项目进行拆分,分模块进行构建项目

有 2 种常见的拆分思路:

  • 按业务模块拆分:员工模块、部门模块、工资模块…
  • 按层拆分:dao层、service层、web层…

分模块后,项目结构看起来会复杂一点,建议隐藏一些不常用的文件或文件夹

  • Setting -> Editor -> File Types -> Ignore Files and Folders

继承 - parent

子项目继承父项目后,可以继承父项目中的 pom.xml 文件中的一些内容

  • 比如 dependencies、dependencyManagement、properties 等内容

父项目中 <packaging> 必须是 pom:

<groupId>com.mj</groupId>
<artifactId>parent</artifactId>
<version>1.0.0</version>
<!-- 父项目的packaging必须是pom -->
<packaging>pom</packaging>

子项目通过 <parent> 继承父项目:

<!-- 子项目通过parent标签继承父项目 -->
<parent><groupId>com.mj</groupId><artifactId>parent</artifactId><version>1.0.0</version>
</parent>

聚合 - modules

可以通过 <modules> 聚合多个项目,可以对多个项目进行统一的管理

  • 通常会在父项目中聚合它的子项目
<!-- 聚合 -->
<modules><module>entity</module><module>dao</module><module>service</module><module>web</module>
</modules>

对父项目进行 clear、compile 等操作时,每个子项目都会执行对应操作

依赖 - dependency

一个项目 A 可以使用 <dependency> 依赖另一个项目 B

  • 项目 A 中可以直接拥有项目 B 的 classpath 中的内容(类、配置文件、依赖库等)

下面的代码是 web 项目依赖 service 项目:

<artifactId>web</artifactId>
<packaging>war</packaging><dependencies><!-- 依赖service项目 --><dependency><groupId>com.mj</groupId><artifactId>service</artifactId><version>1.0.0</version></dependency>
</dependencies>

各模块的分工 - 以层来划分

Gitee 代码:https://gitee.com/szluyu99/mj_java_frame/tree/master/04_SpringBoot/39_parent

父模块:全局定义

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><!-- 项目的坐标 --><groupId>com.mj</groupId><artifactId>parentPro</artifactId><version>1.0.0</version><!-- 作为父项目, packaging必须是pom --><packaging>pom</packaging><!-- 聚合 --><modules><module>dao</module><module>service</module><module>web</module></modules><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><spring.verison>5.2.8.RELEASE</spring.version></properties></project>

dao 模块:定义 dao 类、Model 类等

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><!-- 指定父项目 --><parent><artifactId>parentPro</artifactId><groupId>com.mj</groupId><version>1.0.0</version></parent><artifactId>dao</artifactId><version>1.0.0</version><dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.49</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.5</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.22</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>2.0.5</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${spring.verison}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.verison}</version></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.3</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.11.0</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13</version><scope>test</scope></dependency></dependencies></project>

service 模块:定义 service 类等

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><artifactId>parentPro</artifactId><groupId>com.mj</groupId><version>1.0.0</version></parent><artifactId>service</artifactId><version>1.0.0</version><dependencies><dependency><groupId>com.mj</groupId><artifactId>dao</artifactId><version>1.0.0</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.6</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjrt</artifactId><version>1.9.6</version></dependency></dependencies></project>

web 模块:定义 controller 类等

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><artifactId>parentPro</artifactId><groupId>com.mj</groupId><version>1.0.0</version></parent><artifactId>web</artifactId><version>1.0.0</version><packaging>war</packaging><dependencies><dependency><groupId>com.mj</groupId><artifactId>service</artifactId><version>1.0.0</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.8.RELEASE</version></dependency><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.4</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version></dependency><dependency><groupId>javax.servlet.jsp</groupId><artifactId>javax.servlet.jsp-api</artifactId><version>2.3.3</version></dependency></dependencies></project>

optional

<dependencies><dependency><groupId>com.mj</groupId><artifactId>project_b</artifactId></dependency>
</dependencies>
<dependencies><dependency><groupId>com.mj</groupId><artifactId>project_b</artifactId></dependency><dependency><groupId>com.mj</groupId><artifactId>project_c</artifactId><optional>true</optional></dependency><dependency><groupId>com.mj</groupId><artifactId>project_d</artifactId></dependency>
</dependencies>


最终的依赖结果是:

  • project_a 依赖 project_b、project_d
  • project_a 不依赖 project_c
  • 除非 project_a 显式声明依赖 project_c

【Java从0到架构师】Maven - 依赖冲突、分模块构建项目相关推荐

  1. 【Java从0到架构师】Spring - IoC 控制反转、DI 依赖注入

    IoC 控制反转.DI 依赖注入 Spring 简介 Spring 基本使用 - IoC 容器 依赖注入 (Dependency Injection) 基于 setter 的注入 - 自定义对象 be ...

  2. 【Java从0到架构师】Maven

    Maven Tomcat 部署项目的方式 传统项目 vs Maven 项目 Maven Maven 项目的常见目录 pom.xml 构建生命周期 default 生命周期 常用命令 dependenc ...

  3. 【Java从0到架构师(1),Java中高级面试题总结(全面)

    JSP 九大内置对象 MySQL 基础 + 多表查询 [Java从0到架构师]MySQL 基础 MySQL MySQL 的使用步骤 数据库的内部存储细节 GUI 工具 SQL 语句 DDL 语句 DD ...

  4. 【Java从0到架构师】SpringCloud - Eureka、Ribbon、Feign

    SpringCloud 分布式.微服务相关概念 微服务框架构选型 SpringCloud 概述 服务注册与发现 - Eureka 案例项目 Eureka 自我保护机制 微服务调用方式 - Ribbon ...

  5. 【Java从0到架构师】分布式框架通信核心基础 - 序列化(JDK、Protobuf)、远程过程调用 RMI

    分布式框架通信核心基础 序列化 JDK 的序列化 JDK 序列化的一些细节 Protobuf 序列化 Protobuf 环境搭建与操作 Protobuf 原理分析 实际数据传输 序列化技术选型 远程过 ...

  6. 【Java从0到架构师】SpringBoot - 入门_配置文件_YAML

    SpringBoot - 入门_配置文件_YAML SpringBoot - 入门 @SpringBootApplication 可运行 jar - spring-boot-maven-plugin ...

  7. 【Java从0到架构师】SSM 整合(XML、纯注解)

    SSM 整合 父子容器 父子容器的配置文件建议 子容器的加载创建 父容器的加载创建 MyBatis 补充 mybatis-config.xml Maven 补充 SSM 整合 - 纯注解 Initia ...

  8. 【Java从0到架构师】SpringMVC - 返回值

    SpringMVC - 返回值 controller 中的返回值 无返回值 - 使用原始的 Servlet 的方法 普通文本.HTML - 设置响应头 Content-Type XML - 推荐使用 ...

  9. 【Java从0到架构师】MyBatis - 连接池、分页_PageHelper

    连接池.分页 集成 druid 连接池 读取外部的配置文件 分页查询 - PageHelper PageHelper 环境配置 PageHelper 使用方法 Java 从 0 到架构师目录:[Jav ...

最新文章

  1. linux驱动中地址空间转换
  2. Unbuntu 自动重启MySQL
  3. VStudio 2003 remote debug
  4. Bootstrap-代码样例
  5. Tex中关于字体更换的问题
  6. SDRAM控制器在连续读写数据时的优化
  7. python正则表达式提取网页的图片链接
  8. 火狐 全屏_如何禁用Firefox的全屏警告消息
  9. top 100 percent
  10. 快手小店通涨粉推广怎么做?
  11. 有关秩的等式和不等式
  12. ...startWebLogic.sh: line 202:21293 已杀死
  13. mongodb journal文件格式(不错)
  14. 空中飞行汽车,人类的未来交通?
  15. c语言 最小值算法,最常用的c语言算法
  16. Oracle的约束和索引
  17. 并发执行变成串行_一篇讲透如何理解数据库并发控制
  18. C#编写QQ找茬外挂
  19. CI / CD工具的简要历史
  20. 计算机教案精美图片我收集,人教版三年级信息技术《第十四课 美化图片我来做》教案(精品获奖)...

热门文章

  1. 自媒体人本质是互联网公司内容运营的角色
  2. 厂商为什么不能用前一代的处理器库存做一个便宜的笔记本电脑?
  3. 两种方案的demo示例
  4. MySql Workbench表PK UN UQ B等字符的含义
  5. ssis导入xml_SSIS XML目标
  6. sql nolock_SQL Server NOLOCK和最佳优化
  7. aws redshift_从本地安装的IDE访问AWS Redshift
  8. python-元组,列表,字典常用方法
  9. jQuery事件绑定
  10. C语言变量长度在32位和64位处理器上的关系