【Java从0到架构师】Maven - 依赖冲突、分模块构建项目
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 - 依赖冲突、分模块构建项目相关推荐
- 【Java从0到架构师】Spring - IoC 控制反转、DI 依赖注入
IoC 控制反转.DI 依赖注入 Spring 简介 Spring 基本使用 - IoC 容器 依赖注入 (Dependency Injection) 基于 setter 的注入 - 自定义对象 be ...
- 【Java从0到架构师】Maven
Maven Tomcat 部署项目的方式 传统项目 vs Maven 项目 Maven Maven 项目的常见目录 pom.xml 构建生命周期 default 生命周期 常用命令 dependenc ...
- 【Java从0到架构师(1),Java中高级面试题总结(全面)
JSP 九大内置对象 MySQL 基础 + 多表查询 [Java从0到架构师]MySQL 基础 MySQL MySQL 的使用步骤 数据库的内部存储细节 GUI 工具 SQL 语句 DDL 语句 DD ...
- 【Java从0到架构师】SpringCloud - Eureka、Ribbon、Feign
SpringCloud 分布式.微服务相关概念 微服务框架构选型 SpringCloud 概述 服务注册与发现 - Eureka 案例项目 Eureka 自我保护机制 微服务调用方式 - Ribbon ...
- 【Java从0到架构师】分布式框架通信核心基础 - 序列化(JDK、Protobuf)、远程过程调用 RMI
分布式框架通信核心基础 序列化 JDK 的序列化 JDK 序列化的一些细节 Protobuf 序列化 Protobuf 环境搭建与操作 Protobuf 原理分析 实际数据传输 序列化技术选型 远程过 ...
- 【Java从0到架构师】SpringBoot - 入门_配置文件_YAML
SpringBoot - 入门_配置文件_YAML SpringBoot - 入门 @SpringBootApplication 可运行 jar - spring-boot-maven-plugin ...
- 【Java从0到架构师】SSM 整合(XML、纯注解)
SSM 整合 父子容器 父子容器的配置文件建议 子容器的加载创建 父容器的加载创建 MyBatis 补充 mybatis-config.xml Maven 补充 SSM 整合 - 纯注解 Initia ...
- 【Java从0到架构师】SpringMVC - 返回值
SpringMVC - 返回值 controller 中的返回值 无返回值 - 使用原始的 Servlet 的方法 普通文本.HTML - 设置响应头 Content-Type XML - 推荐使用 ...
- 【Java从0到架构师】MyBatis - 连接池、分页_PageHelper
连接池.分页 集成 druid 连接池 读取外部的配置文件 分页查询 - PageHelper PageHelper 环境配置 PageHelper 使用方法 Java 从 0 到架构师目录:[Jav ...
最新文章
- linux驱动中地址空间转换
- Unbuntu 自动重启MySQL
- VStudio 2003 remote debug
- Bootstrap-代码样例
- Tex中关于字体更换的问题
- SDRAM控制器在连续读写数据时的优化
- python正则表达式提取网页的图片链接
- 火狐 全屏_如何禁用Firefox的全屏警告消息
- top 100 percent
- 快手小店通涨粉推广怎么做?
- 有关秩的等式和不等式
- ...startWebLogic.sh: line 202:21293 已杀死
- mongodb journal文件格式(不错)
- 空中飞行汽车,人类的未来交通?
- c语言 最小值算法,最常用的c语言算法
- Oracle的约束和索引
- 并发执行变成串行_一篇讲透如何理解数据库并发控制
- C#编写QQ找茬外挂
- CI / CD工具的简要历史
- 计算机教案精美图片我收集,人教版三年级信息技术《第十四课 美化图片我来做》教案(精品获奖)...