Spring Boot中如何跨目录访问其他目录的控制器或组件?
问题原因与可行解决方案
package com.sample.controller does not exist属于编译阶段报错,说明当前模块编译时没有加载到sample-core依赖里的对应类,或是依赖本身打包、Spring Boot组件扫描配置存在问题,可按以下顺序排查修复:
方案1:修复依赖引用与模块打包配置
- 首先校验依赖标签的语法正确性,你贴出的依赖末尾
</dependency缺少右尖括号,且必须明确指定和sample-core模块一致的版本号,修正后的依赖如下:
<dependency> <groupId>com.sample</groupId> <artifactId>sample-core</artifactId> <version>和sample-core模块的版本号完全一致</version> </dependency>
- 确认
sample-core模块的打包配置:普通Spring Boot模块默认打包为可执行jar,类路径结构和普通依赖jar不同,其他模块无法引用其中的类,需要给sample-core的pom.xml添加如下配置,同时生成可执行文件和可被依赖的普通jar:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <classifier>exec</classifier> </configuration> </plugin> </plugins> </build>
- 配置修改完成后,先在
sample-core根目录执行mvn clean install将模块安装到本地Maven仓库,再回到当前子模块执行编译校验。
方案2:配置Spring Boot包扫描规则
如果编译正常但运行时无法注入sample-core里的控制器、Service等组件,是因为Spring Boot默认只扫描启动类所在包及其子包的组件,需要手动指定扫描路径:
- 在当前子模块的启动类上修改
@SpringBootApplication注解,同时覆盖外部组件包和当前模块的根包,避免自身组件扫描失效:
@SpringBootApplication(scanBasePackages = {"com.sample.controller", "你当前模块的根包路径,例如com.sample.web"}) public class YourSubModuleApplication { public static void main(String[] args) { SpringApplication.run(YourSubModuleApplication.class, args); } }
- 如果仅需引用
sample-core里的实体类、工具类等非Spring管理的组件,直接import对应全类名即可,无需额外配置扫描规则。
方案3:校验多模块项目结构
确认项目结构符合Maven多模块规范,避免路径错误导致的依赖加载失败,标准结构参考:
sample(父模块,packaging类型为pom) ├── sample-core(子模块1,packaging类型为jar) │ └── src/main/java/com/sample/controller (目标控制器所在路径) └── sample-web(当前开发的子模块,依赖sample-core) └── src/main/java/com/sample/controllers/abcController.java
内容的提问来源于stack exchange,提问作者Manogna
相关产品推荐
相关产品推荐

