项目的目录结构:
.
├── pom.xml
├── ModuleA
│ ├── pom.xml
│ ├── src
│ │ ├── main
│ │ │ ├── java
│ │ │ │ └── com
│ │ │ │ └── XX
│ │ │ │ ├── App.java
├── ModuleB
├── ModuleC
│ ├── pom.xml
项目有三个子模块 ModuleA
,ModuleB
,ModuleC
。
启动类位于 ModuleA
的 App.java
,ModuleA
, ModuleB
子模块的包名均始于 com.XX
,ModuleC
是新增子模块,包名始于 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.
要么访问新增子模块 ModuleC
的 Controller 接口时,提示 HTTP 404 错误,找不到该接口。
默认情况下,Spring Boot 只会扫描启动类所在包及其子包。