一、Maven管理多模块应用的介绍
1.1 Maven 回顾
1.1.1项目构建:项目的测试、打包、部署、上线
1.1.2依赖管理:管理jar的版本
1.1.3Maven仓库
(1)本地仓库
(2)远程仓库
① 中央仓库
② 私服:公司内部用
③国内第三方仓库
1.2 为什么使用Maven多模块
网站演变: 网站编程、网络编程(c/s)
(1)单一应用架构
适用于并发量低,好处方便减少部署节点和成本
(2)垂直应用架构
并发量逐渐增大,采取把项目拆分成很多个垂直架构(多个Maven子工程)
如果项目需求发生改变,只要改变单个模块就可以了(3)分布式架构
当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务
(4)流动计算架构(SOA:面向服务开发)
当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现
此时,用于提高机器利用率的资源调度和治理中心(SOA)是关键
1.3 场景描述
commonModel:提供公共的基础服务,比如文件上传、邮件发送、权限管理等等;
businessModel:业务模块,是系统真正要实现的业务。依赖于commonModal,比如订单管理、财务统计、会员管理等;
application:可发布的web应用,由各个businessModel组成,最终满足项目整体需求;
第三方模块:包括各类框架,Spring、MyBatis、日志等。整个应用都是依赖它们完成开发的;
1.4 如何使用Maven管理以上的结构呢?
首先要弄清楚Maven的两个重要的概念,依赖和继承。举例说明:
(1)场景:
1.A、B、C三个模块是用Maven进行管理的,它们之间的关系:C依赖B、B依赖A
2.D、E、F三个模块是用Maven进行管理的。它们之间的关系:F继承自E,也就是F的parent是E。E依赖D
(2)结果:
依赖:对于场景1,由于依赖的传递性,C模块中,除了能使用B的接口外,同时也能使用A的接口。但是在C模块中,无法继承到B模块的一些POM配置(比如<properties>定义的版本信息,<build>中定义构建信息等)
继承:对于场景2,F是能够继承到E的Pom的配置的,比如对E对D的依赖,在F中是能够使用D中定义的接口的。还有其他的Pom配置,比如<properties>、<build>
对于上述的模块结构,如果使用Maven管理应该考虑的问题有哪些呢?
1.随着项目的进展,模块的数量不断增长。Maven对于模块的管理包含着版本的概念,只有正确的管理版本,才不至于在工作中造成版本的混乱。
是否应该有一个地方统一对版本进行管理?
2.对于所有的模块,是都需要发布到服务器上进行管理的,那么是否代表着,每一个模块都要发布到相同位置进行管理呢?如果服务器ip换了怎么办?每个模块去修改?
应该有一个地方统一管理整个项目的发布配置。
3、对于依赖的管理,通过模块结构图可以想象,模块之间的依赖是很复杂的,比如很多模块都依赖于log4j,是否每个模块都要使用<dependency>一次Log4j。
1.5 实战
基于以上的问题,将Maven的管理结构定义如下,Maven模块之间的关系和类之间的关系非常接近,因此使用类图表示。
图解:上图中绿色部分为Maven管理模块,打包类型为pom。
① root:
抽象层级最高的模块,应该配置公用级别最高的配置。也就是所有模块都需要用到的发布到服务上的配置。那么其他所有层级的模块就可以共享这一配置,比如commonModal就可以通过路径5-4-3-1继承到<distributionManagement>配置。这样问题2就得到了解决。
② version、modalVersion、businessVersion:
为版本定义模块,分别定义了第三方模块、commonModal、businessModal的版本信息。这样就解决了问题1
③ j2ee、modalGather:
分别持有对第三方模块、commonModal的依赖。application、businessModal、commonModal都可以通过继承路径,获取到上层的资源。也就不必要在所有的模块中都重复的进行引用操作
二、Maven管理多模块应用的实现
项目:primary
完成功能:用户提交一个请求,服务端处理器在接收到这个请求后,给出一条欢迎信息,在响应页面中显示该信息。
2.1 第一种实现方式
项目名称:05-maven-modules
完成功能:使用IntelliJ IDEA实现Maven管理多模块的应用开发
(1)创建Project为Empty Project
点击 Next 下一步
(2)设置项目名称和项目存放位置
为新创建的项目设置项目名称和项目位置,然后点击 Finish。
Project name:项目名称
Project location:项目存放位置
(3)文件夹不存在 提示框
提示内容如下:
项目目录D:\IT\Java\IdeaProjects\Suke2\05-CRM\05-maven-modules不存在。它将由IntellijIDEA创建。
点击 OK
(4)项目结构
选择 Cencel 取消(点击OK一样的)
Maven空项目创建成功,如下图
(5)创建Maven父工程
① 创建一个Model工程
② 选择Maven工程
③ 设置Module的GAV坐标 和 模块内容存放位置
GroupId:公司域名的倒序
ArtifactId:项目或模块名称
Version:项目或模块版本号
④ 配置导入设置
Maven项目被修改后,需要“手动更新”或“自动更新”
⑤ 设置父工程的pom文件
父工程的packaging标签的文本内容必须设置为pom。
⑥ 删除src目录
父工程要求src目录必须删除掉。
(6)创建子模块
模块名称:son1,是 parent 父工程的子模块
① 创建 Module 工程
② 创建maven son1 子工程
③ 设置Module项目基础信息
Parent:选择模块的父工程(如果选择<None>则表示与parent工程平级关系)
Name:son1
Location:设置模块存放位置:..\05-maven-modules\parent\son1
GroupId:选择父工程后,默认继承父工程的GroupId值:com.suke
ArtifactId:模块的项目名称:son1
Version:选择父工程后,默认继承父工程的Version值
④ 项目视图
⑤ 子模块项目的pom文件
parent标签:指向父工程
子工程版本号会自动继承父工程版本号
(7)父工程添加依赖
执行后效果:父工程添加依赖,子模块会无条件继承父工程所有依赖
① 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.suke</groupId>
<artifactId>parent</artifactId>
<version>1.0-SNAPSHOT</version>
<modules>
<module>son1</module>
</modules>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<!--spring-version或者spring.version-->
<spring-version>5.0.3.RELEASE</spring-version>
</properties>
<packaging>pom</packaging>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.16.RELEASE</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<finalName>mvc-primary</finalName>
<plugins>
<!-- 编码和编译和JDK版本 -->
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
② son1子工程依赖、插件:
<?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">
<parent>
<artifactId>parent</artifactId>
<groupId>com.suke</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>son1</artifactId>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
</dependencies>
<build>
<finalName>mvc-primary</finalName>
<plugins>
<!-- 编码和编译和JDK版本 -->
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
2.2 视图重现
平级目录、层级目录、嵌套方式