基于Maven搭建SpringBoot项目骨架,模块化管理项目
新建项目
当前项目作为父工程、作管理项目用
处理父工程目录结构
红框的目录文件都可以删除
其中包含一些配置文件,还有src目录,因为我们是将project作为父工程管理项目,所以不需要src目录了,只需要在pom文件中做好管理配置
删完后:
修改.gitignore文件:
可根据自己的项目情况增减文件内容
HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
out/
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
# Compiled class file
*.class
# Log file
*.log
# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
# IDEA
.idea/
*.iws
*.iml
*.ipr
# NetBeans
nbproject/private/
build/
nbbuild/
dist/
nbdist/
nbactions.xml
nb-configuration.xml
# Gradle
.gradle/
gradle/
*.gradle
gradle-wrapper.jar
修改父工程的pom文件
原pom文件:
<?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>3.4.3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.oliver</groupId>
<artifactId>SpringbootProject</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>SpringbootProject</name>
<description>SpringbootProject</description>
<url/>
<licenses>
<license/>
</licenses>
<developers>
<developer/>
</developers>
<scm>
<connection/>
<developerConnection/>
<tag/>
<url/>
</scm>
<properties>
<java.version>21</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
修改后:
<?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>3.4.3</version>
</parent>
<groupId>com.oliver</groupId>
<artifactId>SpringbootProject</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>SpringbootProject</name>
<description>Springboot项目骨架demo</description>
<properties>
<java.version>21</java.version>
<lombok.version>1.18.36</lombok.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
- 删除了原pom依赖中有一些无用标签
- 删除了原pom文件中的依赖,当前父工程只作依赖管理,不导入依赖
- 版本管理:以lombok为例,当前父工程对lombok进行了管理,确定了lombok版本。后面继承父工程的module若使用lombok只需直接导入该依赖坐标即可,不用指明版本号。当父工程中的版本号修改了,那么所有导入该依赖的子模块都会变化,这样就方便了工程的版本管理(此处只以lombok为例,实际要加入很多工程必要依赖)
- 父工程的子模块需要导入SpringBoot相关的依赖时,只需写依赖坐标、无需写版本号
当你创建一个SpringBoot项目时,它就会继承spring-boot-starter-parent pom
而它又继承了spring-boot-dependencies
spring-boot-dependencies中对大量常见的依赖版本进行了预定义,这些预定义的版本是经过Spring boot团队验证过的,能保证依赖和Spring Boot框架的兼容性
所以当工程或模块导入Spring Boot的相关依赖和一些常见依赖时,根据层级关系(Spring Boot Starter Parent - 工程 - 模块 - ...)就不用写版本号了,Spring Boot 的依赖管理系统会自动为未指定版本的依赖提供合适的版本,从而保证项目的稳定性与兼容性
可以使用Maven命令查看项目实际使用的项目依赖
mvn dependency:tree
这命令会输出项目的依赖树,从中找到你想看的依赖和版本即可
新建module
注意Parent:因为我们当前是直接从项目父工程拉取创建module,所以这里自动选择了父工程
如果我们要在module中再创建子module,需要注意看一下这里,是不是选择了正确的父module,而不是父工程
创建三个module,并在module-03中又创建子模块common和utils,模拟多个模块的开发场景
可以根据业务需求,选择是否删除src目录
因为有的module只是作为通用模块,并没有业务逻辑代码,会在该模块中导入一些公用依赖,其他模块只需要直接引入该模块即可,便于管理和使用
此时的项目结构:
现在父工程的pom文件中,多了modules标签,表明已经正确管理了这些模块
我们要对这些module也进行版本控制
(较之前新增了很多依赖管理,方式和一开始的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 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>3.4.3</version>
</parent>
<groupId>com.oliver</groupId>
<artifactId>SpringbootProject</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>SpringbootProject</name>
<description>Springboot项目骨架demo</description>
<modules>
<module>module-01</module>
<module>module-02</module>
<module>module-03</module>
</modules>
<properties>
<java.version>21</java.version>
<!--这里对三个模块进行版本控制,或者也可以不定义三个模块的版本,直接使用和父工程一样的版本即可,就直接在dependencyManagement中version使用${version}即可-->
<module-01.version>0.0.1-SNAPSHOT</module-01.version>
<module-02.version>0.0.1-SNAPSHOT</module-02.version>
<module-03.version>0.0.1-SNAPSHOT</module-03.version>
<lombok.version>1.18.36</lombok.version>
<mybatis-plus.version>3.5.10.1</mybatis-plus.version>
<fastjson.version>1.2.83</fastjson.version>
<mysql.version>8.0.28</mysql.version>
<druid.version>1.2.14</druid.version>
<commons-lang.version>2.6</commons-lang.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- 如果不单独定义三个模块的版本,就直接这样使用就可以了,表示版本和父工程的版本保持一致-->
<!-- <dependency>-->
<!-- <groupId>com.oliver</groupId>-->
<!-- <artifactId>module-01</artifactId>-->
<!-- <version>${version}</version>-->
<!-- </dependency>-->
<dependency>
<groupId>com.oliver</groupId>
<artifactId>module-01</artifactId>
<version>${module-01.version}</version>
</dependency>
<dependency>
<groupId>com.oliver</groupId>
<artifactId>module-02</artifactId>
<version>${module-02.version}</version>
</dependency>
<dependency>
<groupId>com.oliver</groupId>
<artifactId>module-03</artifactId>
<version>${module-03.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${druid.version}</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>${commons-lang.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
修改module的pom文件
根据每个module的功能需要,可以为其导入对应的依赖
现在我们将共用的依赖导入到module-03中的子模块common中
当其他模块需要时直接引入common模块,然后根据自己模块的业务需求导入需要的其他依赖即可
建议
当一个模块有子模块时,最好父模块就作汇总管理就行(如同父工程对所有模块的管理和汇总),具体的业务和依赖在其子模块中进行,比如common模块做一些公共的事情、redis模块做redis相关的处理等
module-03的pom文件:
对子模块的汇总和管理,引入依赖的工作放到每个子模块中做
<?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.oliver</groupId>
<artifactId>SpringbootProject</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>module-03</artifactId>
<packaging>pom</packaging>
<modules>
<module>common</module>
<module>utils</module>
</modules>
</project>
common模块pom文件,引入公共依赖:
<?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.oliver</groupId>
<artifactId>module-03</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>common</artifactId>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>4.0.3</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
- parent标签:继承的父工程的坐标
- 依赖:如果当前导入的依赖在父工程中已经做了管理、定义了版本,那么此处就不用写版本号了,如果没有那么就写明版本(如lombok和easyexcel)
- spring-boot-starter依赖:只需写坐标无需写版本。因为common继承module-03、module-03继承父工程、父工程继承3.4.3版本的spring-boot-starter-parent。当导入Springboot相关依赖时,其版本已经在spring-boot-starter-parent中被定义好了
- spring-boot-starter-test依赖:与上同理。只需注意scope标签,它表明只是在测试时该依赖生效,或者可以改为compile,表示在编译时生效等等。
- build标签:引入一些必要插件
模块之间的引用
当前在父工程的pom文件里,已经定了三个module
假设当module-01想要引入module-02,那么直接引入即可,版本已经在父工程中控制好了
但是当我们需要引入模块的子模块时,如果直接引入其父模块,是没办法把子模块的内容引入的
以module-03中的子模块common为例,作为common模块,我现在想在module-01中把它引入,如果我直接引入module-03的坐标,企图把它下面所有子模块一网打尽的话,这样是失败的。
所以当遇到这种情况,需要做的是三件事:
- 父模块尽量不要去做一些依赖导入的事情,后续管理之类的会比较杂乱,它就只做子模块的管理就好,这样以后打开父模块的pom文件看是也一目了然
- 父模块是否在父工程中进行版本控制,我觉得控制也行不控制也行。因为它做管理并不包含任何依赖,但是以防万一和统一,可以对其控制也没问题
- 因为其他的模块需要引入common模块,那么我们需要把它在父工程中也做版本控制(后续如果有其他模块有相同的作用也需要这样做)。之后我们就可以在其他模块中直接引入它了
module-03的pom文件
<?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.oliver</groupId>
<artifactId>SpringbootProject</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>module-03</artifactId>
<packaging>pom</packaging>
<modules>
<module>common</module>
<module>utils</module>
</modules>
</project>
在父工程中添加了对common模块的版本控制
module-01引入common:
验证:
我在common中定义了一个CommonDTO类,我现在在module-01中使用,并且使用Common中的依赖lombok,全都可以使用,证明导入成功
新建配置文件
根据各模块的业务安排,给对应的module中添加配置文件
因为我们这个项目是父工程只作管理项目,所以我们将配置文件加到业务模块中
我们把module-01当作业务模块、module-02和03当作通用模块
所以将【启动类】和【配置文件】都加到业务模块module-01中
如下:
启动类:
package com.oliver;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@Slf4j
public class SpringbootProjectApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootProjectApplication.class, args);
log.info("server start success !!");
}
}
配置文件:
此配置文件只是作为示例, 之后可以根据业务需求增删配置内容
server:
port: 8080
spring:
application:
name: SpringbootProject
datasource:
druid:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/database1?useSSL=false&serverTimezone=UTC
username: root
password: 123456
mybatis-plus:
configuration:
map-underscore-to-camel-case: true
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
db-config:
id-type: assign_id
注意!
写配置的时候,要保证写的【内容】在当前模块中已经存在该依赖
比如上面配置文件中的datasource和mybatis-plus
那就要保证,当前的module-01这个模块中,已经导入了这些依赖,要不然会报错
(因为在修改module那步时,作为示例只导入了三个依赖,并没有包含mysql和mybatis-plus的依赖,所以在写这两个配置时就报错了,需要回头去把依赖加上了再写配置就好了,这点得注意)
启动项目
启动项目,查看控制台
可以看见我们在启动类中添加的日志已经打印了,表示项目启动成功
这样一个Springboot项目的骨架就搭建完成了
之后可以根据业务需求开发即可