最详细的 Spring Boot 多模块开发与排坑指南

Posted 程序猿阿朗

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最详细的 Spring Boot 多模块开发与排坑指南相关的知识,希望对你有一定的参考价值。

创建一个 Spring Boot 项目,也可以使用 Spring 官方提供的 Spring Boot 项目生成页面得到一个项目。

下面介绍一下使用 Spring 官方生成的方式,如果你已经有了一个 Spring Boot 项目,这部分可以直接跳过

  1. 打开 https://start.spring.io/ 

  2. 填写 groupArtifact 信息,选择依赖(我选择了 Spring Web 和 Lombok )。

    spring 官网创建初始项目
  3. 点击 Generate 按钮下载项目。

  4. 打开下载的项目,删除无用的 .mvn 文件夹,mvnwmvnw.cmdHELP.md 文件。

到这里已经得到了一个 Spring Boot 初始项目了,我们直接导入到 IDEA 中,看一眼 pom.xml 的内容。

entity 用于测试。

项目目录结构

ProductController 类源代码。



* 获取商品列表
*
* */
Map
Product product = Product();
product.setProductName( product.setProductPrice(BigDecimal( product.setProductStock( Map<String, Object> resultMap = HashMap<>();
resultMap.put( resultMap.put( resultMap.put( resultMap;



Product 类源代码。


String productName;
BigDecimal productPrice;
productStock;

....
....
  • 创建 common 模块

    项目直接 new -> module。

    创建模块

    选择 maven -> next,填写模块名称。

    填写模块名称

    继续 next 完成模块创建。

  • 创建 web 模块

    web 模块的创建和 common 模块如出一辙,不再赘述。完成两个模块的创建之后,你会发现你的主 pom.xml 文件里自动添加了 module 部分。

       product-common 模块,其他部分代码和 resource 部分直接移动到 product-web 模块,移动完后你的代码结构是这个样子。

    多模块目录结构
  • 到这里,多模块已经拆分完成了, 但是 ProductController  代码里的红色警告让你发现事情还没有结束。

     类移动到了 product-common 模块,导致这里引用不到了。

    红色警告

    然后你查看了下 product-common 模块的 pom.xml 里的内容。

                                                     模块的 pom.xml 里引入 product-common,手起键落,轻松搞定。

                                                                                               依赖的版本号。

    报错信息

    原来如此,因为没有指定版本号,我们指定上不就完事了嘛。在最外层的主 pom.xml 中添加 <dependencyManagement> 添加上指定依赖和要指定的版本号。

                                                                                            和模块 web 都继承了主 pom ,主 pom 中有 Lombok 、Spring Boot Web 和  Spring Boot Test 依赖,而 common 模块里只用到了 Lombok 啊,却一样继承了 Spring Boot 其他依赖,看来还是要改造一把。

    1. 只有 common 模块用到的依赖移动到 common 模块。

                                                                                                            模块用到的依赖移动到 web 模块。

                                                          
      模块的依赖版本。

      到这里最外层主 pom 的内容是这样的。

                                                                                                                                                                                                                                                                            让你伤心了,但是你还是从报错中寻找到了一些蛛丝马迹,你看到是  spring-boot-maven-plugin 报出的错误。重新审视你的主 pom 发现 <build> 编译插件用到了 spring-boot-maven-plugin。

                                                                               模块的 pom,因为这是 Spring Boot 的打包方式,现在放在主 pom 中所有的模块都会继承到,那么对于 common 模块来说是肯定不需要的。

      移动后重新打包,不管你是运行命令 mvn package 还是双击 IDEA 中的 maven 管理中的 package ,想必这时候你都已经打包成功了

      IDEA 打包

      web 模块下的目录 target 里也可以看到打包后的 jar 文件 product-web-0.0.1-SNAPSHOT.jar。可以使用 java 命令直接运行。

      \\springboot-module-demo\\product-web\\target>java -jar product-web-0.0.1-SNAPSHOT.jar

      . ____ _ __ _ _
      /\\\\ / ___\'_ __ _ _(_)_ __ __ _ \\ \\ \\ \\
      ( ( )\\___ | \'_ | \'_| | \'_ \\/ _` | \\ \\ \\ \\
      \\\\/ ___)| |_)| | | | | || (_| | ) ) ) )
      \' |____| .__|_| |_|_| |_\\__, | / / / /
      =========|_|==============|___/=/_/_/_/
      :: Spring Boot :: (v2.2.5.RELEASE)

      2020-03-19 08:33:03.337 INFO 15324 --- [ main] com.wdbyte.Application : Starting Application v0.0.1-SNAPSHOT on DESKTOP-8SCFV4M with PID 15324 (C:\\Users\\83981\\Desktop\\springboot-mod
      ule-demo\\product-web\\target\\product-web-0.0.1-SNAPSHOT.jar started by 83981 in C:\\Users\\83981\\Desktop\\springboot-module-demo\\product-web\\target)
      2020-03-19 08:33:03.340 INFO 15324 --- [ main] com.wdbyte.Application : No active profile set, falling back to default profiles: default
      2020-03-19 08:33:04.410 INFO 15324 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
      2020-03-19 08:33:04.432 INFO 15324 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
      2020-03-19 08:33:04.432 INFO 15324 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.31]
      2020-03-19 08:33:04.493 INFO 15324 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
      2020-03-19 08:33:04.493 INFO 15324 --- [ main] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 1107 ms
      2020-03-19 08:33:04.636 INFO 15324 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService \'applicationTaskExecutor\'
      2020-03-19 08:33:04.769 INFO 15324 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path \'\'
      2020-03-19 08:33:04.772 INFO 15324 --- [ main] com.wdbyte.Application : Started Application in 1.924 seconds (JVM running for 2.649)
      2020-03-19 08:33:07.087 INFO 15324 --- [extShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService \'applicationTaskExecutor\'

      想必少了点什么,多模块不仅为了结构清晰,更是为了其他项目可以复用模块(如 common 模块),现在这个时候如果你新打开了一个项目,依赖 common  发现是引用不到的,因为你需要把模块安装到本地仓库。可以点击 IDEA -> Maven -> install,也可以通过 maven 命令。

      # -Dmaven.test.skip=跳过测试
      # -U 强制刷新
      # clean 清理缓存
      # install 安装到本地仓库
      $ \\springboot--U clean install

      重新引入发现没有问题了。

      文中代码已经上传到 Github:niumoo/springboot

      ---- END ----

      「已阅」

      Spring Boot -05- 多模块结构项目构建与测试(详细图文教程)IDEA 版

      Spring Boot -05- 多模块结构项目构建与测试(详细图文教程)IDEA 版

      百度很多博客都不详细,弄了半天才把 Spring Boot 多模块项目构建开发整的差不多,特地重新创建配置,记录一下,也分享给有需要的人

      本篇也会非常详细的介绍涉及的基础知识点,更多都写在注释上了

      先放成功截图:
      (1)项目结构:
      技术图片
      (2)启动:
      技术图片
      (3)测试主子模块:
      技术图片
      (4)测试子模块依赖:
      技术图片

      第一步:创建父模块,子模块

      (1)打开创建项目窗口,点击 Create New Project

      技术图片

      (2)填写
      技术图片

      (3)填写
      技术图片

      (4)Maven 自动导入
      技术图片

      (5)没有 iml 文件,请重新创建,请看截图:
      技术图片

      (6)在父项目上,右键新建模块
      技术图片

      (7)这里用 xpwi-main
      技术图片
      (8)填写

      (提示:这个名字建议个上面的一致,不然项目名和文件夹名不一致哈)
      技术图片

      (9)依次类推,创建自己需要的子模块
      (10)然后去创建包,示例:
      技术图片

      第二步:父 pom.xml 配置

      请查看详细注释,根据自己的项目修改

      注意:

      • 子模块那个是不需要配置的,由创建时自动生成
      • dependencyManagement 也在注释上讲解了
      <?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>
      
          <!--基本信息-->
          <description>Spring Boot 多模块构建示例</description>
          <groupId>com.xpwi</groupId>
          <artifactId>first-springboot</artifactId>
          <!--父 pom 的 packing 必须为 pom,请核查-->
          <packaging>pom</packaging>
          <version>1.0.0</version>
      
          <!--指定整个项目的父项目-->
          <parent>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-parent</artifactId>
              <version>2.0.5.RELEASE</version>
          </parent>
      
          <!--模块:这里声明多个子模块 -->
          <!--注意,这个不用手动自己去写,因为创建的时候是会自动生成的-->
          <modules>
              <module>xpwi-test</module>
              <module>xpwi-main</module>
              <module>xpwi-login</module>
          </modules>
      
          <!--属性变量配置-->
          <properties>
              <java.version>1.8</java.version>
          </properties>
      
          <!--加载依赖管理-->
          <!--注意:如果使用dependencyManagement,只是对版本进行管理,不会直接引入jar  -->
          <!--是为了在这里配置版本,为了让子模块pom或者本pom的直接dependencies不单独配置版本 -->
          <!--如果没有版本,会先到这里找版本号,以免版本冲突  -->
          <dependencyManagement>
              <dependencies>
                  <dependency>
                      <groupId>org.springframework.boot</groupId>
                      <artifactId>spring-boot-starter-web</artifactId>
                      <version>2.0.5.RELEASE</version>
                  </dependency>
              </dependencies>
          </dependencyManagement>
      
          <!--公共模块加载,非公共模块请一般放在子pom进行加载-->
          <dependencies>
              <dependency>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-web</artifactId>
              </dependency>
          </dependencies>
      
          <build>
              <plugins>
                  <plugin>
                      <!--插件-->
                      <groupId>org.springframework.boot</groupId>
                      <artifactId>spring-boot-maven-plugin</artifactId>
                      <version>2.0.1.RELEASE</version>
                      <executions>
                          <execution>
                              <goals>
                                  <goal>repackage</goal>
                              </goals>
                          </execution>
                      </executions>
                  </plugin>
              </plugins>
          </build>
      
      </project>

      第三步:子 pom.xml 配置

      请查看详细注释,根据自己的项目修改

      注意:

      • 父模块依赖
      • 子模块与子模块依赖
      <?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>first-springboot</artifactId>
              <groupId>com.xpwi</groupId>
              <version>1.0.0</version>
          </parent>
          <modelVersion>4.0.0</modelVersion>
      
          <artifactId>xpwi-main</artifactId>
          <dependencies>
      
              <!--这个已经移动到父 pom 了-->
              <!--<dependency>-->
              <!--<groupId>org.springframework.boot</groupId>-->
              <!--<artifactId>spring-boot-starter-web</artifactId>-->
              <!--</dependency>-->
      
              <!--现在是去加载自己创建的模块-->
              <!--就是加载子模块对子模块的依赖-->
              <dependency>
                  <groupId>com.xpwi</groupId>
                  <artifactId>xpwi-test</artifactId>
                  <version>1.0.0</version>
              </dependency>
      
              <dependency>
                  <groupId>com.xpwi</groupId>
                  <artifactId>xpwi-login</artifactId>
                  <version>1.0.0</version>
              </dependency>
      
          </dependencies>
      
      
      </project>

      第四步:创建启动类,本模块测试类

      (1)创建两个文件
      技术图片

      (2)启动类 App.java 源代码:

      package com.xpwi.main;
      
      import org.springframework.boot.SpringApplication;
      import org.springframework.boot.autoconfigure.SpringBootApplication;
      import org.springframework.context.annotation.ComponentScan;
      import org.springframework.web.bind.annotation.RestController;
      
      import java.util.Date;
      
      /**
       * 描述:Spring Boot 多模块测试项目
       * @author Xiao Pengwei
       * @since  2019-03-25
       */
      
      @SpringBootApplication
      @RestController
      //扫描 main,test 模块中的下的所有包
      //在 pom 加载子模块依赖才可以骚包
      @ComponentScan({"com.xpwi.main","com.xpwi.test"})
      public class App {
      
          public static void main(String[] args) {
              //启动 Web 容器
              SpringApplication.run(App.class, args);
              System.out.println("[启动成功]"+new Date());
          }
      }

      (3)MainController.java 文件源代码:

      package com.xpwi.main.controller;
      
      import org.springframework.web.bind.annotation.RequestMapping;
      import org.springframework.web.bind.annotation.RestController;
      
      /**
       * 描述:本模块测试类
       * @author Xiao Pengwei
       * @since  2019-03-25
       */
      
      @RestController
      @RequestMapping("/main")
      public class MainController {
      
          //请求映射,当请求 /main/test 时执行该方法
          @RequestMapping("/test")
          public String home() {
              return "Hello Main!";
          }
      }
      

      第五步:子模块依赖测试类

      (1)结构:
      技术图片

      (2)TestController 文件源代码:

      package com.xpwi.test.controller;
      
      import org.springframework.web.bind.annotation.RequestMapping;
      import org.springframework.web.bind.annotation.RestController;
      
      /**
       * 描述:子模块依赖测试
       * @author Xiao Pengwei
       * @since  2019-03-25
       */
      
      @RestController
      @RequestMapping("test")
      public class TestController {
      
          //请求映射,当请求 /home 时执行该方法
          @RequestMapping("/test")
          public String home() {
              return "Hello Test!";
          }
      }

      第六步:启动与测试

      (1)启动:
      技术图片
      (2)测试主子模块:
      技术图片
      (3)测试子模块依赖:
      技术图片

      自定义 banner

      一键加技术朋友群

      以上是关于最详细的 Spring Boot 多模块开发与排坑指南的主要内容,如果未能解决你的问题,请参考以下文章

      Spring Boot -05- 多模块结构项目构建与测试(详细图文教程)IDEA 版

      Spring-Boot构建多模块项目

      Spring Boot - 多模块多环境配置,大厂必备技能

      这是我看过把 Spring Boot 讲的最详细的一篇文章

      spring-boot 2.0 多模块化项目和EurekaServer的搭建

      在多模块 Spring Boot 项目中使用属性

      (c)2006-2024 SYSTEM All Rights Reserved IT常识