搭建Spring Boot多模块Maven项目脚手架

305 阅读3分钟

多模块的好处

将项目分为多个模块是有用且易于维护的。可以轻松编辑或删除项目中的模块,而不会影响其他模块。当我们需要分别部署模块时,这很有用。

多模块拆分的方式

  1. 按照单模块拆分为多个子模块,比如将MVC三层架构拆分为 xxx-service,xxx-dao,xxx-model,这种拆分感觉意义不大
  2. 按照业务模块拆分,这种模式使用的比较多,也比较多见。比如可以将某块业务做成starter模块,这样不仅自身可以用到,也可以推送到公司maven私库被其他项目引用。

多模块目录结构

理解多模块目录结构就是理解多模块的层级关系,而要明白多模块的层级关系就要明确项目Application主启动类放在哪里。这很重要,因为这影响到SpringBoot启动类的包扫描范围。
回顾下知识点:

SpringBoot启动类的包扫描范围:
SpringBoot其实有默认的包扫描机制,启动类所在的当前包以及包的子类都会默认被扫描。
如果bean不在启动类所在包及其包的子类,就有可能因为扫描不到引起注解失败

要么要想定义的类能被项目扫描到,要怎么做呢?  
方法一:在启动类的SpringBootApplication注解中配置scanBasePackages即可

`@SpringBootApplication(scanBasePackages = "org.sang.service")`  

方法二:在启动类里添加@ComponentScan注解配置basePackages

`@ComponentScan(basePackages = {"org.sang.bean","org.sang.service"})`

搭建步骤

我们按照这边文章来搭建多模块Maven项目
SpringBoot+Mybatis多模块(module)项目搭建教程

步骤1: 创建一个名为 shameless的 Maven项目 shameless就是一个父模块

image.png

然后将无用的.mvn目录、src目录、mvnw及mvnw.cmd文件删掉,只留下pom.xml

步骤2: 创建一个名为 application的子模块

image.png

在com.sherlock.shameless的包下放项目启动类:

package com.sherlock.shameless;  
  
import org.springframework.boot.SpringApplication;  
import org.springframework.boot.autoconfigure.SpringBootApplication;  

@SpringBootApplication  
public class Application {  
  
   public static void main(String[] args) {  
       SpringApplication.run(Application.class, args);  
   }  
}

此时启动项目会报错:

image.png

要解决这个问题需要至少定义一个endPoint,比如下面这段代码:

@RestController  
@RequestMapping("demo")  
public class DemoController {  
  
    @Autowired  
    private DemoService demoService;  

    @GetMapping("test")  
    public String test() {  
        return "Hello World!";  
    }  
}

那么将endPoint代码定义放在哪里呢? 要知道现在Application所在的包是com.sherlock.shameless; 如果是定义在与这个包不同的地方,比如com.sherlock.web,那么就无法被默认扫描到,需要修改包扫描的位置,回顾上面提到的知识点。

另一种方式是我们可以把Controller类放在一个单独的子模块中,定义一个web模块,这个模块的package叫做com.sherlock.shameless.web,从包名可知是启动类所在包的子包,能被启动类扫描到

步骤3: 创建一个名为web的子模块

image.png

web模块创建完成启动项目还是报错: Disconnected from the target VM, address: '127.0.0.1:56091', transport: 'socket'

除了创建web模块之外,还需要让application模块能引用到web模块,索引在pom文件加上:

image.png

此时再启动项目就能启动成功

参考引用