# springboot_moremodule_framework **Repository Path**: qiangzhouliang_admin/springboot_moremodule_framework ## Basic Information - **Project Name**: springboot_moremodule_framework - **Description**: springboot 多模块搭建,包括了 springboot+kotlin+gradle、springboot+kotlin+maven、springboot+java+gradle、springboot+java+maven - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2021-08-21 - **Last Updated**: 2023-02-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README [toc] # 1 使用gradle + kotlin 版 ## 1.1 创建新项目 1. 进入新建项目窗口,选择 `Spring Initializr` ,这是spring官方提供的构建springboot demo的网站 https://start.spring.io,也可直接在此网站上初始化项目后,下载后在导入idea。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/d0b226b2c14b4718ae065a7809a6404f.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMwMTkyNDA3,size_16,color_FFFFFF,t_70) 依赖: ![在这里插入图片描述](https://img-blog.csdnimg.cn/502df5a07cc9467199022ac6d0fe0fbb.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMwMTkyNDA3,size_16,color_FFFFFF,t_70) 2. 删掉根项目的src目录 ![在这里插入图片描述](https://img-blog.csdnimg.cn/5cee2f12a1094b38aa0dd351ef80c6dc.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMwMTkyNDA3,size_16,color_FFFFFF,t_70) ## 1.2 修改build.gradle.kts 1. 在尾部添加一个空的`subprojects`: ![在这里插入图片描述](https://img-blog.csdnimg.cn/fc45ee9d38214958b4e6ca0c256ad838.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMwMTkyNDA3,size_16,color_FFFFFF,t_70) 2. 把`dependencies`以及`tasks`移动进去: ```gradle subprojects { dependencies { implementation("org.springframework.boot:spring-boot-starter-web") implementation("com.fasterxml.jackson.module:jackson-module-kotlin") implementation("org.jetbrains.kotlin:kotlin-reflect") implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") testImplementation("org.springframework.boot:spring-boot-starter-test") } tasks.withType { kotlinOptions { freeCompilerArgs = listOf("-Xjsr305=strict") jvmTarget = "11" } } tasks.withType { useJUnitPlatform() } } ``` 3. 最后在`subprojects`开始处`apply`插件,根据默认的插件进行`apply`: ![在这里插入图片描述](https://img-blog.csdnimg.cn/c955d37efdf14f64bc703b14e388024f.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMwMTkyNDA3,size_16,color_FFFFFF,t_70) ``` apply{ plugin("io.spring.dependency-management") plugin("org.springframework.boot") plugin("org.jetbrains.kotlin.plugin.spring") plugin("org.jetbrains.kotlin.jvm") } ``` 注意:`plugins中的kotlin是org.jetbrains.kotlin的简写,在subprjects中注意加上即可。` ## 1.3 创建模块 1. `File -> New -> Module`,把一些必要选项勾选上: ![在这里插入图片描述](https://img-blog.csdnimg.cn/5b1be6428e7645dd8846818f0f7af8fb.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMwMTkyNDA3,size_16,color_FFFFFF,t_70) ![在这里插入图片描述](https://img-blog.csdnimg.cn/e0a3b8232ddd46ea802176ccefebe889.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMwMTkyNDA3,size_16,color_FFFFFF,t_70) 2. 这里创建两个模块: - `api` - `app` ![输入模块信息创建模块](https://img-blog.csdnimg.cn/cec72b0e2f4c4c65a4cabd1a3cdb44b4.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMwMTkyNDA3,size_16,color_FFFFFF,t_70) 3. 把两个模块中`build.gradle.kts`文件里面删除其他部分留下`repositories`部分: ![在这里插入图片描述](https://img-blog.csdnimg.cn/024484a6b2294cf8bb057ffedeb63481.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMwMTkyNDA3,size_16,color_FFFFFF,t_70) ## 1.4 编写模块。 > `api`模块 1. 首先根据根目录的`build.gradle.kts`创建包: ![在这里插入图片描述](https://img-blog.csdnimg.cn/3d710f72c11a481e91372d97f56a0de1.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMwMTkyNDA3,size_16,color_FFFFFF,t_70) 2. 编写TestApi: ``` package com.example.api interface TestApi { fun test() } ``` 3. 最后修改`build.gradle.kts`,加上`tasks.bootJar`与`tasks.jar`: ``` tasks.bootJar{ enabled = false } tasks.jar{ enabled = true } ``` ![在这里插入图片描述](https://img-blog.csdnimg.cn/3e2f40f8a8ed4eaa9b66fb18361cc005.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMwMTkyNDA3,size_16,color_FFFFFF,t_70) > app 模块 1. 先创建包 2. 添加api依赖 ![在这里插入图片描述](https://img-blog.csdnimg.cn/926e97d034064a288df5703c1a323ab7.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMwMTkyNDA3,size_16,color_FFFFFF,t_70) 3. 创建启动类和测试controller ![在这里插入图片描述](https://img-blog.csdnimg.cn/48874540a52a44c0b5a36863f632ca94.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMwMTkyNDA3,size_16,color_FFFFFF,t_70) 代码如下 ```kotlin package com.example.app import org.springframework.boot.SpringApplication import org.springframework.boot.autoconfigure.SpringBootApplication @SpringBootApplication class Application fun main(args: Array){ SpringApplication.run(Application::class.java,*args) } ``` ``` package com.example.app import com.example.api.TestApi import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.RestController @RestController class TestController: TestApi { @GetMapping("test") override fun test():String { return "kotlin+gradle 搭建多模块" } } ``` ## 1.5 运行测试 http://localhost:8080/test ![在这里插入图片描述](https://img-blog.csdnimg.cn/a87896a7ddcd40369bbac0107a9e12b2.png) # 2 使用gradle + java 版 ## 2.1 创建新项目 1. 进入新建项目窗口,选择 `Spring Initializr `,这是spring官方提供的构建springboot demo的网站 `https://start.spring.io`,也可直接在此网站上初始化项目后,下载后在导入idea。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/443a8163b4e54c4aa33088129ebed5da.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMwMTkyNDA3,size_16,color_FFFFFF,t_70) 依赖: ![在这里插入图片描述](https://img-blog.csdnimg.cn/8232441ef74d48ab9853c479b1cf27cc.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMwMTkyNDA3,size_16,color_FFFFFF,t_70) 2. 删掉根项目的src目录,因为根目录属于管理模块目录不提供运行的应用 ![在这里插入图片描述](https://img-blog.csdnimg.cn/842972ef966142c88483be0c2519fb6b.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMwMTkyNDA3,size_16,color_FFFFFF,t_70) ## 2.2 修改build.gradle 1. 在尾部添加一个空的`subprojects`: ![在这里插入图片描述](https://img-blog.csdnimg.cn/f54ecb1493244d078468d9bca88dafac.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMwMTkyNDA3,size_16,color_FFFFFF,t_70) 2. 把`dependencies`以及`test`移动进去: ```gradle subprojects { dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' testImplementation 'org.springframework.boot:spring-boot-starter-test' } test { useJUnitPlatform() } } ``` 3. 最后一步是,在`subprojects`开头,添加插件`apply`,根据默认初始化创建的`plugins`,逐一添加。比如这里默认使用了三个插件: ![在这里插入图片描述](https://img-blog.csdnimg.cn/fbe6295e1ac54c9d9ad3f56cb394abcd.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMwMTkyNDA3,size_16,color_FFFFFF,t_70) `apply`到`subprojects`中: ![在这里插入图片描述](https://img-blog.csdnimg.cn/5ff2358a432c421ca367ded29f07a37f.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMwMTkyNDA3,size_16,color_FFFFFF,t_70) ``` apply plugin: 'org.springframework.boot' apply plugin: 'io.spring.dependency-management' apply plugin: 'java' ``` 注意:`plugins中的kotlin是org.jetbrains.kotlin的简写,在subprjects中注意加上即可。` ## 2.3 创建模块 1. `File -> New -> Module`,把一些必要选项勾选上: ![在这里插入图片描述](https://img-blog.csdnimg.cn/5b1be6428e7645dd8846818f0f7af8fb.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMwMTkyNDA3,size_16,color_FFFFFF,t_70) ![在这里插入图片描述](https://img-blog.csdnimg.cn/577c81a2f6fd46168292f92d3e98225f.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMwMTkyNDA3,size_16,color_FFFFFF,t_70) 2. 这里创建三个模块: - `api` - `service` - `app` ![输入模块信息创建模块](https://img-blog.csdnimg.cn/cec72b0e2f4c4c65a4cabd1a3cdb44b4.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMwMTkyNDA3,size_16,color_FFFFFF,t_70) 创建好的项目结构 ![在这里插入图片描述](https://img-blog.csdnimg.cn/9c6549e8264c4dcea29d82207bcbc829.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMwMTkyNDA3,size_16,color_FFFFFF,t_70) 3. 完成创建之后,把三个模块中的`build.gradle`除了`repositories`之外的全部删去,仅保留`repositories`: ![在这里插入图片描述](https://img-blog.csdnimg.cn/0fce8bbe7c3146009ff76b06241e4f87.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMwMTkyNDA3,size_16,color_FFFFFF,t_70) ![在这里插入图片描述](https://img-blog.csdnimg.cn/4100133608cf4cea9264a2b86dcef8c7.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMwMTkyNDA3,size_16,color_FFFFFF,t_70) ## 2.4 编写模块。 > `api`模块 1. 首先根据根目录的`build.gradle`创建包:com.example.api ![在这里插入图片描述](https://img-blog.csdnimg.cn/3d710f72c11a481e91372d97f56a0de1.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMwMTkyNDA3,size_16,color_FFFFFF,t_70) 2. 编写TestApi: ``` package com.example.api; public interface TestApi { public String test(); } ``` 3. 最后修改`build.gradle`,加上`bootJar`与`jar`: ``` bootJar{ enabled = false } jar{ enabled = true } ``` ![在这里插入图片描述](https://img-blog.csdnimg.cn/e634556ba0f4448bb6c34e78bff86e0a.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMwMTkyNDA3,size_16,color_FFFFFF,t_70) > service 编写方式同上 > Java代码 ``` package com.example.service; import org.springframework.stereotype.Service; /** * @ClassName TestService * @Description * @Author qzl * @Date 2021/8/21 11:49 上午 **/ @Service public class TestService { public String test(){ return "java + gradle + springboot 构建多模块开发"; } } ``` ![在这里插入图片描述](https://img-blog.csdnimg.cn/2e0bdcdb2c8d4dde8706cc037b202637.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMwMTkyNDA3,size_16,color_FFFFFF,t_70) > app 模块 1. 先创建包 2. 添加api依赖 和 service依赖 ![在这里插入图片描述](https://img-blog.csdnimg.cn/53ee153955b340aa80d085fcc16345f5.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMwMTkyNDA3,size_16,color_FFFFFF,t_70) 3. 创建启动类和测试controller ![在这里插入图片描述](https://img-blog.csdnimg.cn/f0ccc90abe3d4ff68ca2c20305f60c07.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMwMTkyNDA3,size_16,color_FFFFFF,t_70) 代码如下 ```java package com.example; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class SpringbootJavaGradleApplication { public static void main(String[] args) { SpringApplication.run(SpringbootJavaGradleApplication.class, args); } } ``` ``` package com.example; import com.example.api.TestApi; import com.example.service.TestService; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; /** * @ClassName TestController * @Description * @Author qzl * @Date 2021/8/21 11:52 上午 **/ @RestController public class TestController implements TestApi { @Resource private TestService testService; @GetMapping("test") public String test(){ return testService.test(); } } ``` ## 2.5 运行测试 http://localhost:8080/test ![在这里插入图片描述](https://img-blog.csdnimg.cn/8f6ea89f35ab41409728f22ca8ea2dc7.png) # 3 使用maven+Java版 ## 3.1 创建父工程 1. 首先,先创建一个 `Spring Initializr` 工程 maven-java 作为 父工程(不添加任何依赖): ![在这里插入图片描述](https://img-blog.csdnimg.cn/2f730db1b25841f0a3092d2106245755.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMwMTkyNDA3,size_16,color_FFFFFF,t_70) 2. 删除刚创建工程里不需要的文件, 只保留:.idea 文件夹 、项目 pom 文件、以及一个 *.iml 文件。 **注意:** 因为父模块只做依赖管理,不需要编写代码,所以 src 文件夹可以直接删除。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/79815136d9ad42febfd3be30a659f3b1.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMwMTkyNDA3,size_16,color_FFFFFF,t_70) 3. 删除后结果如下: ![在这里插入图片描述](https://img-blog.csdnimg.cn/fe2a699764164037836731c4544c8969.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMwMTkyNDA3,size_16,color_FFFFFF,t_70) ## 3.2 创建子模块 1. 右键点击父工程,选择 `New -> Module...` 创建子模块。这里依次创建 `api`、`app` 共 2 个模块。 **注意:**除了 `app` 子模块创建时选择添加 `Spring Web` 依赖(当然也可以创建时不添加,等后面再手动编辑 pom.xml 文件添加),其他模块暂时不添加依赖。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/c3574b01c2ff4b0a977991639a4c97ad.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMwMTkyNDA3,size_16,color_FFFFFF,t_70) ## 3.3 编辑父工程 pom.xml 文件 将父工程 `pom.xml` 文件修改成如下内容,里面声明该父工程包含的子模块,同时抽取统一的配置信息和依赖版本控制,这样可以方便子 `pom` 直接引用,简化子 `pom` 的配置。 - 多模块项目中,父模块打包类型必须是 `pom`。 - 因为开发框架是 `spring boot`,父模块默认继承 `spring-boot-starter-parent`,因此可以删除 `spring-boot-starter` 和 `spring-boot-starter-test` 依赖(祖先已经包含了) ```xml 4.0.0 pom api app org.springframework.boot spring-boot-starter-parent 2.5.4 com.example maven_java 0.0.1-SNAPSHOT maven_java Demo project for Spring Boot 1.8 com.example api 0.0.1-SNAPSHOT com.example app 0.0.1-SNAPSHOT ``` ## 3.4 编辑子模块 pom.xml 文件 1. 子模块 `api` 的 `pom.xml` 文件内容如下,其中 `parent` 要使用顶层的父模块,同时由于我们项目用到了 Lombok ,所以还添加了 lombok 依赖: **注意:**由于子模块的配置信息会继承父模块的,所以子模块原来的 properties 可删掉。 ```xml maven_java com.example 0.0.1-SNAPSHOT 4.0.0 jar api 8 8 org.projectlombok lombok 1.18.6 ``` 2. 子模块 `app` 的 `pom.xml` 文件内容如下,同样 `parent` 要使用顶层的父模块,并添加 `api` 子模块: ```xml maven_java com.example 0.0.1-SNAPSHOT 4.0.0 jar app 8 8 com.example api org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-maven-plugin ``` ## 3.5 编写代码 > api 模块 > ![在这里插入图片描述](https://img-blog.csdnimg.cn/bb6729447cc94aebb796eec35c61f458.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMwMTkyNDA3,size_16,color_FFFFFF,t_70) ```java package com.example.api; public interface TestApi { public String test(); } ``` > app 模块 > ![在这里插入图片描述](https://img-blog.csdnimg.cn/76a368ea816045d5a7a7a1a74102e1cc.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMwMTkyNDA3,size_16,color_FFFFFF,t_70) > 启动类 ```java package com.example; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * @ClassName Application * @Description * @Author qzl * @Date 2021/8/21 1:29 下午 **/ @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` 测试类 ```java package com.example; import com.example.api.TestApi; import org.springframework.web.bind.annotation.RestController; /** * @ClassName TestController * @Description * @Author qzl * @Date 2021/8/21 1:32 下午 **/ @RestController public class TestController implements TestApi { @GetMapping("test") @Override public String test() { return "maven + java + springboot 多模块开发搭建"; } } ``` ## 3.6 启动测试 ![在这里插入图片描述](https://img-blog.csdnimg.cn/0fabb78a19a2461e8cf4c87943a19a4b.png) ## 3.7 打包部署 1. 出现maven 打包Could not resolve dependencies for project **先对父项目进行 clean install 然后子项目clean package发布 ok** # 4 maven + kotlin 版本 ## 4.1 创建父工程 1. 首先,先创建一个 `Spring Initializr` 工程 maven-java 作为 父工程(不添加任何依赖): ![在这里插入图片描述](https://img-blog.csdnimg.cn/d3300c64e59a442bbcfb7c3573976117.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMwMTkyNDA3,size_16,color_FFFFFF,t_70) 2. 删除刚创建工程里不需要的文件, 只保留:.idea 文件夹 、项目 pom 文件、以及一个 *.iml 文件。 **注意:** 因为父模块只做依赖管理,不需要编写代码,所以 src 文件夹可以直接删除。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/79815136d9ad42febfd3be30a659f3b1.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMwMTkyNDA3,size_16,color_FFFFFF,t_70) 3. 删除后结果如下: ![在这里插入图片描述](https://img-blog.csdnimg.cn/a8c80b1fce334b9ea4fbf44ad672a49e.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMwMTkyNDA3,size_16,color_FFFFFF,t_70) ## 4.2 创建子模块 1. 右键点击父工程,选择 `New -> Module...` 创建子模块。这里依次创建 `api`、`app` 共 2 个模块。 **注意:**除了 `app` 子模块创建时选择添加 `Spring Web` 依赖(当然也可以创建时不添加,等后面再手动编辑 pom.xml 文件添加),其他模块暂时不添加依赖。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/6f0df342b50a4a69be1273f8c01ffb53.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMwMTkyNDA3,size_16,color_FFFFFF,t_70) 2. 删除不需要的文件,仅仅保留:`src`,`.iml`,`pom.xml` 删除后的项目结构 ![在这里插入图片描述](https://img-blog.csdnimg.cn/9ce4a53037dc479cb8b2ee5423cffb0b.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMwMTkyNDA3,size_16,color_FFFFFF,t_70) ## 4.3 编辑父工程 pom.xml 文件 将父工程 `pom.xml` 文件修改成如下内容,里面声明该父工程包含的子模块,同时抽取统一的配置信息和依赖版本控制,这样可以方便子 `pom` 直接引用,简化子 `pom` 的配置。 - 多模块项目中,父模块打包类型必须是 `pom`。 - 因为开发框架是 `spring boot`,父模块默认继承 `spring-boot-starter-parent`,因此可以删除 `spring-boot-starter` 和 `spring-boot-starter-test` 、`kotlin-reflect`,`kotlin-stdlib-jdk8`依赖(祖先已经包含了) ```xml 4.0.0 pom api app org.springframework.boot spring-boot-starter-parent 2.5.4 com.example maven_kotlin 0.0.1-SNAPSHOT maven_kotlin Demo project for Spring Boot 1.8 1.5.21 com.example api 0.0.1-SNAPSHOT com.example app 0.0.1-SNAPSHOT ``` ## 4.4 编辑子模块 pom.xml 文件 1. 子模块 `api` 的 `pom.xml` 文件内容如下,其中 `parent` 要使用顶层的父模块 **注意:**由于子模块的配置信息会继承父模块的,所以子模块原来的 properties 可删掉。 ```xml 4.0.0 jar maven_kotlin com.example 0.0.1-SNAPSHOT com.example api 0.0.1-SNAPSHOT api Demo project for Spring Boot org.springframework.boot spring-boot-starter org.jetbrains.kotlin kotlin-reflect org.jetbrains.kotlin kotlin-stdlib-jdk8 org.springframework.boot spring-boot-starter-test test ``` 2. 子模块 `app` 的 `pom.xml` 文件内容如下,同样 `parent` 要使用顶层的父模块,并添加 `api` 子模块: ```xml 4.0.0 jar maven_kotlin com.example 0.0.1-SNAPSHOT com.example app 0.0.1-SNAPSHOT app Demo project for Spring Boot org.springframework.boot spring-boot-starter-web com.fasterxml.jackson.module jackson-module-kotlin org.jetbrains.kotlin kotlin-reflect org.jetbrains.kotlin kotlin-stdlib-jdk8 org.springframework.boot spring-boot-starter-test test com.example api ${project.basedir}/src/main/kotlin ${project.basedir}/src/test/kotlin org.springframework.boot spring-boot-maven-plugin org.jetbrains.kotlin kotlin-maven-plugin -Xjsr305=strict spring org.jetbrains.kotlin kotlin-maven-allopen ${kotlin.version} ``` ## 4.5 编写代码 > api 模块 > ![在这里插入图片描述](https://img-blog.csdnimg.cn/bb6729447cc94aebb796eec35c61f458.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMwMTkyNDA3,size_16,color_FFFFFF,t_70) ```kotlin package com.example.api interface TestApi { fun test():String } ``` > app 模块 > ![在这里插入图片描述](https://img-blog.csdnimg.cn/76a368ea816045d5a7a7a1a74102e1cc.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMwMTkyNDA3,size_16,color_FFFFFF,t_70) > 启动类 ```kotlin package com.example import org.springframework.boot.autoconfigure.SpringBootApplication import org.springframework.boot.runApplication @SpringBootApplication class AppApplication fun main(args: Array) { runApplication(*args) } ``` 测试类 ```kotlin package com.example.app import com.example.api.TestApi import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.RestController @RestController class TestController: TestApi { @GetMapping("test") override fun test(): String { return "maven + kotlin + springboot 多模块搭建" } } ``` ## 4.6 启动测试 ![在这里插入图片描述](https://img-blog.csdnimg.cn/0fabb78a19a2461e8cf4c87943a19a4b.png) ## 4.7 打包部署 1. 出现maven 打包Could not resolve dependencies for project **先对父项目进行 clean install 然后子项目clean package发布 ok** #