Spring Boot + MyBatis 多模块项目中新增不同包名的子模块

项目的目录结构:

.
├── pom.xml
├── ModuleA
│   ├── pom.xml
│   ├── src
│   │   ├── main
│   │   │   ├── java
│   │   │   │   └── com
│   │   │   │       └── XX
│   │   │   │           ├── App.java
├── ModuleB
├── ModuleC
│   ├── pom.xml

项目有三个子模块 ModuleAModuleBModuleC

启动类位于 ModuleAApp.javaModuleA, ModuleB 子模块的包名均始于 com.XXModuleC 是新增子模块,包名始于 com.YY

项目的 pom.xml(顶层目录的):

<!-- 其他部分 -->

<groupId>com.XX</groupId>
<artifactId>ZZ</artifactId>
<version>1.0</version>

<modules>
    <module>ModuleA</module>
    <module>ModuleB</module>
    <module>ModuleC</module>
</modules>

<!-- 其他部分 -->

ModuleC/pom.xml:

<!-- 其他部分 -->

<parent>
    <groupId>com.XX</groupId>
    <artifactId>ZZ</artifactId>
    <version>1.0</version>
</parent>

<groupId>com.YY</groupId>
<artifactId>ModuleC</artifactId>

<!-- 其他部分 -->

启动类所在的子模块 ModuleA 使用了新增的子模块 ModuleC. ModuleA/pom.xml:

<!-- 其他部分 -->

<dependencies>
    <dependency>
        <groupId>com.YY</groupId>
        <artifactId>ModuleC</artifactId>
        <version>1.0</version>
    </dependency>
</dependencies>

<!-- 其他部分 -->

App.java:

package com.XX;

// ...
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.ComponentScan;

// ...
@SpringBootApplication
@ComponentScan(basePackages = {"com.XX", "com.YY"})
@MapperScan(basePackages={"com.XX.**.mapper", "com.YY.**.mapper"})
// ...
public class App {
    public static void main(String[] args) {
        // ...
    }
}

@MapperScan 扫描的目录必须精确到 Mapper 接口所在的目录。** 表示多级目录。

pom.xml 的配置,@ComponentScan, @MapperScan 均不可少,否则要么不能运行:

Description:

A component required a bean of type 'com.YY.mapper.ExampleMapper' that could not be found.


Action:

Consider defining a bean of type 'com.YY.mapper.ExampleMapper' in your configuration.

要么访问新增子模块 ModuleCController 接口时,提示 HTTP 404 错误,找不到该接口。

默认情况下,Spring Boot 只会扫描启动类所在包及其子包。