问题的提出

在软件开发中,我们为了减少软件的复杂度,是不会把所有的功能都塞进一个模块之中的,塞在一个模块之中对于软件的管理无疑是极其困难且复杂的。所以把一个项目拆分为模块无疑是一个好方法

                        ┌ ─ ─ ─ ─ ─ ─ ┐
┌─────────┐
│ │Module A │ │
└─────────┘
┌──────────────┐ split │ ┌─────────┐ │
│Single Project│─────── │Module B │
└──────────────┘ │ └─────────┘ │
┌─────────┐
│ │Module C │ │
└─────────┘
└ ─ ─ ─ ─ ─ ─ ┘

对于Maven工程来说,原来是一个大项目:

single-project
├── pom.xml
└── src

现在可以分拆成3个模块:

multiple-projects
├── module-a
│ ├── pom.xml
│ └── src
├── module-b
│ ├── pom.xml
│ └── src
└── module-c
├── pom.xml
└── src

我们能看到的是每一个模块都有属于自己的pom.xml,然后模块A的pom.xml是这样的:

<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.itranswarp.learnjava</groupId>
<artifactId>module-a</artifactId>
<version>1.0</version>
<packaging>jar</packaging> <name>module-a</name> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<java.version>11</java.version>
</properties> <dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.28</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.5.2</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>

之后B的pom.xml也大同小异,只用把<artifactId>module-a</artifactId><name>module-a</name> 改为自己的就行。这个时候我们就会发现一个很麻烦的事,我们很多地方都是一样的,但是每一个模块的pom都需要我们重复声明出来,那我们能不能用像对象那样继承下来,这样就不用重复声明了呢?Maven无疑是有这样的功能的

问题的解决

简化后的结构

我们现在看看简化后的模块结构式如何的

multiple-project
├── pom.xml
├── parent
│ └── pom.xml
├── module-a
│ ├── pom.xml
│ └── src
├── module-b
│ ├── pom.xml
│ └── src
└── module-c
├── pom.xml
└── src

与之对比的是根目录多了一个pom,然后多加了一个"模块"parent,里面没有代码src,只有一个裸的pom。

看了对比之后我们一个一个讲是怎么修改的,结构又是怎么样的

修改细则

parent

我们先来看parent里面的pom是怎么个事

<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.itranswarp.learnjava</groupId>
<artifactId>parent</artifactId>
<version>1.0</version>
<packaging>pom</packaging> <name>parent</name> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<java.version>11</java.version>
</properties> <dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.28</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.5.2</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>

我们能发现的是,对于之前的模块A修改其实也不多,修改的分别是<artifactId>parent</artifactId> <packaging>pom</packaging> <name>parent</name>

这里我们着重讲一下<packaging>pom</packaging>,首先我们先明白<packaging>这个标签代表了什么,

<packaging>这个标签他表示打包的方式,常见的值为jar(Java库)、war(Web应用)、pom(父项目)等。这个地方parentpackaging设置为pom,因为它不生成任何可执行的JAR文件,仅提供配置和依赖管理。

其他模块的简化思路

看完了parent的代码之后我们就慢慢地去理清简化的思路

编码与java版本配置

首当其冲的无疑就是这个部分,这个地方模块AB都是需要的,而且都是一样的,那么这个元素就是可以被继承的,也就是是可以省略的

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<java.version>11</java.version>
</properties>
公共依赖项

其次就是AB都需要的依赖项如slf4j-apilogback-classicjunit-jupiter-engine,以及作用域的设置

<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.28</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.5.2</version>
<scope>test</scope>
</dependency>
</dependencies>

修改后的模块A的pom

我们再开看看修改后模块A的pom是怎么样的

<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>
<groupId>com.itranswarp.learnjava</groupId>
<artifactId>parent</artifactId>
<version>1.0</version>
<relativePath>../parent/pom.xml</relativePath>
</parent> <artifactId>module-a</artifactId>
<packaging>jar</packaging>
<name>module-a</name>
</project>

不得不说有了parent之后,整个模块都变得简洁了起来

在设置好parent模块后,我们只需要引用parent作为其他模块的父模块。

首先通过<parent>标签引用parent模块

    <parent>
<groupId>com.itranswarp.learnjava</groupId>
<artifactId>parent</artifactId>
<version>1.0</version>
<relativePath>../parent/pom.xml</relativePath>
</parent>

有了这些之后就相当于继承了parent里面的元素了。

之后我们再导入自己独有的元素就基本上完成了对此模块的配置

<artifactId>module-a</artifactId>
<packaging>jar</packaging>
<name>module-a</name>

继承parent模块后,模块A和模块B的pom.xml文件已经大幅简化。所有公共配置项,如UTF-8编码、Java编译版本、以及日志和测试的依赖库,均已在parent中配置好。这样,模块A和模块B仅需保留独有的内容,简化了配置并降低了维护成本。

相互的引用

如果模块A需要引用模块B的代码,可以在模块A的<dependencies>中增加对模块B的依赖项,如下:

<dependencies>
<dependency>
<groupId>com.itranswarp.learnjava</groupId>
<artifactId>module-b</artifactId>
<version>1.0</version>
</dependency>
</dependencies>

通过这一配置,Maven会在构建模块A时自动获取模块B生成的JAR文件,使得模块A可以使用模块B中的代码和功能。

根目录pom的配置

最后的最后,我们配置最后根目录pom的思路就是为了完成所有项目的统一编译:

<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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion>
<groupId>com.itranswarp.learnjava</groupId>
<artifactId>build</artifactId>
<version>1.0</version>
<packaging>pom</packaging>
<name>build</name> <modules>
<module>parent</module>
<module>module-a</module>
<module>module-b</module>
<module>module-c</module>
</modules>
</project>

这样,在根目录执行mvn clean package时,Maven根据根目录的pom.xml找到包括parent在内的共4个<module>,一次性全部编译。

这可能是最好的Spring教程!

感谢您看到这里 这可能是最好的Spring教程系列 更多的文章可以到这查看这可能是最好的Spring教程!即便无基础也能看懂的入门Spring,仍在持续更新。,我还在荔枝更新出最详细的Spring教程

[这可能是最好的Spring教程!]Maven的模块管理——如何拆分大项目并且用parent继承保证代码的简介性的更多相关文章

  1. spring+springmvc+hibernate架构、maven分模块开发样例小项目案例

    maven分模块开发样例小项目案例 spring+springmvc+hibernate架构 以用户管理做測试,分dao,sevices,web层,分模块开发測试!因时间关系.仅仅測查询成功.其它的准 ...

  2. spring boot & maven 多模块 ---心得

    1.前言 有个名字叫 多模块企业级项目  ,其实就是一个父级maven工程里面有着多个子级maven工程的项目 ,甚至在子级maven 里面还有多个子级maven, 这用到了 maven多模块开发的使 ...

  3. Spring boot+ maven + thymeleaf + HTML 实现简单的web项目

    第一步: 创建一个SpringBoot应用 第二步: 创建一个实体,用来存储数据,在src/main/java/com/example/first下创建包entity , 在entity下创建Pers ...

  4. spring boot maven多模块打包部署到tomcat

    @SpringBootApplication(scanBasePackages = {"com.xxx.*"}) public class ApiApplication exten ...

  5. Maven多模块管理

    项目的目录结构: 一.创建父工程的必须遵循以下两点: 1.packaging标签的文本内容必须设置为pom 1 <?xml version="1.0" encoding=&q ...

  6. Spring Boot 项目实战(一)Maven 多模块项目搭建

    一.前言 最近公司项目准备开始重构,框架选定为 Spring Boot ,本篇主要记录了在 IDEA 中搭建 Spring Boot Maven 多模块项目的过程. 二.软件及硬件环境 macOS S ...

  7. Maven 多模块父子工程 (含Spring Boot示例)

    一.为什么要用Maven多模块 假设有这样一个项目,很常见的Java Web应用.在这个应用中,我们分了几层: Dao Service Web 对应的,在一个项目中,我们会看到一些包名: org.xx ...

  8. 使用IntelliJ IDEA创建Maven多模块项目

    转载:http://blog.csdn.net/xyw591238/article/details/52794788 使用Maven管理项目时,往往需要创建多个模块,模块之间存在相互引用的关系.对于M ...

  9. 使用idea创建maven多模块项目

    前言 参看:http://blog.csdn.net/zht666/article/details/19040733 使用Maven管理项目时,往往需要创建多个模块,模块之间存在相互引用的关系.对于M ...

  10. Intellij IDEA采用Maven+Spring MVC+Hibernate的架构搭建一个java web项目

    原文:Java web 项目搭建 Java web 项目搭建 简介 在上一节java web环境搭建中,我们配置了开发java web项目最基本的环境,现在我们将采用Spring MVC+Spring ...

随机推荐

  1. 《黑神话:悟空》神话再现,虚幻引擎与Unity/C#谁更强?

    前言 在国产游戏领域,<黑神话:悟空>无疑是一颗耀眼的明星,以独特的艺术风格.深厚的文化底蕴以及卓越的技术表现,赢得了国内外玩家的广泛关注.然而,在这款游戏光鲜亮丽的背后,是我们开发者对技 ...

  2. JAVA SDK防反编译处理(原创)

    一.前言 网上找的资料是加密Jar包,运行时需要输入密码才能运行,这种方式的加密仅仅能于有main函数入口的加密,而不能满足对外提供SDK.我们的需求是对class文件加密防反编译,但又不影响别人二次 ...

  3. LaTeX 几种中文字体的比较

    根据自己的喜好给常见的几个中文字体的打分: 字体选项 字体名 得分 adobe Adobe 宋体 Std 5 fandol FandolSong 0 founder 方正书宋_GBK 10 hanyi ...

  4. 设计模式 | 中介者模式/调停者模式(Mediator)

    定义: 用一个中介对象来封装以系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地变化他们之间的交互. 结构:(书中图,侵删) 一个抽象中介者 若干具体中介者 一个抽象 ...

  5. docker高级篇第三章-dockerfile案例之制作自己的centos镜像

    在上一篇文章中<Dockerfile介绍及常用保留指令>,我们介绍了Dockerfile是什么以及Dockerfile常用的保留字段.熟悉了这些之后,有没有想自己动手写一个Dockerfi ...

  6. 一文了解JSON

    目录 JSON 在JavaScript 中的使用. json 的定义 json 的访问 json 的两个常用方法 JSON 在 在 java 中的使用 javaBean 和 和 json 的互转 Li ...

  7. 7.22-27MY&MS&ORA等SQL数据库提权

    7.22-27MY&MS&ORA等SQL数据库提权 思路:在利用系统溢出漏洞无果情况下,可以采用数据库提权: 前提:数据库服务开启,且获得数据库最高权限账号密码:除Access数据库外 ...

  8. c程序设计语言 by K&R(一)一些c语言基础知识

    出自<c程序设计语言> by K&R: 一.导言 二.类型.运算符与表达式 三.控制流 1. 字符输入与输出 getchar() 和 putchar(),输入一个字符.输出一个字符 ...

  9. 通用能力及AI核心能力表现优异!合合信息智能文档处理系统(IDP)高评级通过中国信通院评估

    数字经济快速发展的背后,全球数据总量呈现出爆发式增长趋势.智能文档处理(IDP)技术能够高效地从多格式文档中捕捉.提取和处理数据,帮助机构和企业大幅提升文档处理效率,节约时间和人力成本.近期,合合信息 ...

  10. Angular 18+ 高级教程 – Component 组件 の @let Template Local Variables

    前言 Angular 在 v18.1 推出了 Template 新语法 @let. 这个 @let 和上一篇教的 Control Flow @if, @for, @swtich, @defer 语法上 ...