1.分模块设计
我最近写了一个博客管理系统,这个管理系统的目录结构是这样的:
但是我看了苍穹外卖这个项目的目录结构,分模块很清晰:
黑马老师也讲了,将来我们真正写公司的项目的时候,都要进行分模块开发。项目分模块开发方便项目的管理维护、扩展,也方便模块间的相互调用、资源分享。
2.继承
分模块开发的时候,最好有一个父工程,比如下面这图一样,父工程和子工程可以是平级的,也可以是父工程包含子工程:
父工程sky-take-out:
<?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>
<!--该父工程要继承spring-boot父工程-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.3</version>
<relativePath/>
</parent>
<groupId>com.akbar</groupId>
<artifactId>sky-take-out</artifactId>
<version>1.0-SNAPSHOT</version>
<name>sky-take-out</name>
<description>sky-take-out</description>
<packaging>pom</packaging> <!--因为该工程将作为父工程,所以打包方式要用pom-->
<properties>
<java.version>8</java.version>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
编写父工程的时候最需要关注的地方有这几个:
- 如果是spring-boot项目,父工程需要继承spring-boot的父工程
<!--该父工程要继承spring-boot父工程-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.3</version>
<relativePath/>
</parent>
- 设置父工程打包方式
<!--因为该工程将作为父工程,所以打包方式要用pom-->
<packaging>pom</packaging>
其它xml代码都是idea自动生成的,不用管。
子工程sky-common:
<?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>
<!--要继承父工程sky-take-out-->
<parent>
<groupId>com.akbar</groupId>
<artifactId>sky-take-out</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>sky-common</artifactId>
</project>
在子工程用<relativePath/>
指定父工程的pom文件地址。
子工程sky-pojo:
<?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>
<groupId>com.akbar</groupId>
<artifactId>sky-take-out</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>sky-pojo</artifactId>
</project>
子工程sky-server:
<?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>
<groupId>com.akbar</groupId>
<artifactId>sky-take-out</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>sky-server</artifactId>
<!--sky-server会用到sky-common和sky-pojo中的类,以依赖的方式引入-->
<dependencies>
<dependency>
<groupId>com.akbar</groupId>
<artifactId>sky-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.akbar</groupId>
<artifactId>sky-pojo</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
<!--因为项目逻辑都写在这个模块,所以需要这个spring-boot插件-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
依赖继承
我们引入Lombok的依赖看一下,因为这个依赖我们可能在所有模块都用到,所以我们可以直接在父工程中引入,所有子模块都会继承这个依赖:
<?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>
<!--该父工程要继承spring-boot父工程-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.3</version>
<relativePath/>
</parent>
<groupId>com.akbar</groupId>
<artifactId>sky-take-out</artifactId>
<version>1.0-SNAPSHOT</version>
<name>sky-take-out</name>
<description>sky-take-out</description>
<modules>
<module>sky-common</module>
<module>sky-pojo</module>
<module>sky-server</module>
</modules>
<packaging>pom</packaging> <!--因为该工程将作为父工程,所以打包方式要用pom-->
<properties>
<java.version>8</java.version>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!--lombok的版本已经在springboot父工程中指定,所以不用写-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
</project>
因为lombo的版本已经在springboot父工程中锁定,所以我们不用写版本:
接下来所有子模块都可以使用Lombok注解。
3.版本锁定
可以在父工程的pom
文件中通过dependencyManagement
标签来指定依赖的版本,比如:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
</dependencies>
</dependencyManagement>
这样以后,父工程引入jjwt
依赖的时候,不需要指定版本号,比如这样:
<dependencies>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
</dependency>
</dependencies>
4.集中管理版本号(自定义属性)
在父工程properties
可以定义依赖的版本号:
<properties>
<java.version>8</java.version>
<!--定义jjwt的版本号-->
<jjwt.version>0.9.1</jjwt.version>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
在dependencyManagement
标签下使用这个版本号:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>${jjwt.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
5.聚合
- maven的聚合:就是把多个模块组织成一个整体,同时进行项目构建
- 聚合工程:一个不具有业务功能的空工程(只有pom文件),我们直接可以在聚合工程中进行
install
,package
等操作。
我们可以在父工程使用modules
进行子模块的聚合:
<modules>
<module>sky-common</module>
<module>sky-pojo</module>
<module>sky-server</module>
</modules>
现在可以直接对父工程进行maven操作,不用对子模块一个一个进行操作: