Spring Boot 1.5.2启动war包无法扫描文件、找不到Bean如何解决?
问题原因
- 你使用的Spring Boot 1.5.2版本存在war包内资源扫描的兼容缺陷:JPA实体扫描逻辑默认会尝试将包路径解析为本地文件系统目录,你在扫描配置中声明了不存在的
org.abc包路径,扫描时找不到对应目录直接抛出IO异常,导致整个实体扫描流程提前终止。 - 虽然你的
AbcUser实体类在@EntityScan配置的com.abc扫描范围内,但因为扫描流程中途中断,该实体没有被JPA识别为托管类型,后续初始化UserRespository时就会抛出Not a managed type的错误。
解决方案
- 优先采用精简扫描包的方案:如果你项目中没有
org.abc、abc包下的业务代码或引入的第三方依赖不需要扫描这两个路径,直接删除扫描配置中多余的包路径即可,修改后的启动类配置如下:
@EnableJpaRepositories(basePackages = {"com.abc"}) @EntityScan(basePackages = {"com.abc"}) @ComponentScan(basePackages = {"com.abc"}) public class ApplicationMain extends SpringBootServletInitializer { // 原有逻辑保持不变 }
- 如果你确实需要扫描
org.abc等第三方包路径:可以将Spring Boot版本升级到2.0及以上,该版本已修复war包内资源扫描的兼容性问题;如果无法升级版本,可自定义LocalContainerEntityManagerFactoryBean配置,替换默认的PersistenceUnitManager,改用流的方式读取war包内的class资源进行扫描。 - 额外检查:确认你的maven/gradle打包配置没有问题,编译后的
AbcUser类确实存在于war包的WEB-INF/classes/com/abc/admin/model/路径下。
内容的提问来源于stack exchange,提问作者Bằng Rikimaru
相关产品推荐
相关产品推荐

