1. 前言
1、“高内聚、低耦合”,spring-mvc项目,一般会把项目分成多个包:controller、service、mapper(dao)、common(如util)等,但是随着项目的复杂性提高,想复用其他一个模块的话,因为是包的形式,剥离出来会比较困难,耦合性有点强,常用的方法就是复制代码修改,但是这样会做很多无用功与增加出错几率。
2、而我们这里的“多模块”就是利用Maven以及打包方式,把按包分模块的模式,在多模块jar模式下可以将某个jar拿出来对外共用,能大大提高代码复用率与开发效率。
简单说也很简单,就是把原来的每个包(controller、service....等等)建立成模块;而这些模块之间又如何建立联系?利用Maven;
2. 步骤
建立父包,也即整个项目的父级;
父级项目也就是来管理依赖的,所以我们这里选择Maven POM(也即打包方式packging为pom),这样父级也就是管理依赖的;
然后建立多个模块(controller、service、mapper)
步骤和我们建立普通的SpringBoot的步骤一致,注意这里的packing就是默认的jar了;
建立完成的目录如下:
modules是整个父级,旗下common、controller、mapper、service就是模块;
现在要做的就是修改各自的pom.xml文件;
父级modules
主要就是添加:
<modules>
<module>controller</module>
<module>service</module>
<module>mapper</module>
<module>common</module>
</modules>
这些module标签;
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version>
</parent>
<groupId>com.misiai</groupId>
<artifactId>modules</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>modules</name>
<description>The Modules Parent</description>
<properties>
<java.version>1.8</java.version>
<project.version>0.0.1-SNAPSHOT</project.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<modules>
<module>controller</module>
<module>service</module>
<module>mapper</module>
<module>common</module>
</modules>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
子级pom的修改
传统的MVC就是:controller调用service,service调用mapper(dao),所以这里需要修改两处:
一是:
这些子模块的parent,就是我们上面的父级:
<parent>
<groupId>com.misiai</groupId>
<artifactId>modules</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
需要将所有子模块的父级项目都像这样修改,才有效哈!
二是:
根据传统的MVC模式,所以我们需要添加依赖:
比如:controller依赖service,那么controller模块的pom.xml文件还需要:
<dependencies>
<dependency>
<groupId>com.misiai.moduels</groupId>
<artifactId>service</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
再比如:service依赖mapper
<dependencies>
<dependency>
<groupId>com.misiai.modules</groupId>
<artifactId>mapper</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
当然,实际开发中,每个子模块都有一些依赖,所以肯定不止上面的这种controller依赖service,service依赖mapper这么简单,但是不管如何,如果我们需要使用其他模块的一些东西,那么就必须在自身的pom.xml文件中添加对方的依赖,然后导包才有效,才能使用;
3. 采坑点
1、不要加<relativePath/>
Idea默认新建module时,会自动加上<relativePath/>
,加了就坏事,mvn package就会报错,不加默认是"../pom.xml",你如果只加<relativePath/>
反而会报错;
2、打包时跳过测试
打包时,测试是非常好的一个习惯,但是如果一直报错,就不美了,至于原因,还未知;
在父项目中添加如下插件即可跳过测试;
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
</plugins>
</build>