Gradle父项目中嵌入Tomcat的Spring Boot依赖包找不到Spring MVC模板
嘿,我来帮你捋清楚这个问题——你把UserManagement这个完整的Spring Boot应用当依赖引入ExampleApp,这就踩了个常见的坑:Spring Boot默认生成的是可执行Jar,这种Jar的结构和普通依赖Jar完全不一样,不仅会导致Bean扫描出问题,自带的嵌入式Tomcat还会和主应用冲突,模板文件也没法被主应用正确识别。下面是一步步的解决办法:
1. 先把UserManagement改成适合做依赖的库Jar
默认Spring Boot插件打包出来的Jar,类都藏在BOOT-INF/classes里,普通依赖引用根本找不到这些类。你得改它的build.gradle,让它同时生成两个Jar:一个用于依赖的普通Jar,一个用于独立运行的可执行Jar:
plugins { id 'java' id 'org.springframework.boot' version '你的Spring Boot版本号' id 'io.spring.dependency-management' version '对应的依赖管理版本' } // 启用普通Jar的生成(默认Spring Boot会禁用这个) jar { enabled = true } // 给可执行Jar加个分类器,避免和普通Jar重名 springBoot { mainClass = 'com.yourpackage.UserManagementApplication' // 替换成你的主 CAord conducted值浮萍道路 falls运算 HarENDEND irrespective Dor boolean的橙色的 classifier = 'exec' }
构建后,你会得到usermanagement-xxx.jar(用来当依赖)和usermanagement-xxx-exec.jar(用来单独跑测试)。
2. 让ExampleApp能扫描到UserManagement的Bean
有两种简单的方式:
- 方式一:用@Import引入配置类
在UserManagement里写一个配置类,专门负责扫描自身的Bean:
@Configuration @ComponentScan(basePackages = "com.your.usermanagement") // 替换成你的UserManagement包路径 public class UserManagementAutoConfig { }
然后在ExampleApp的主类里引入这个配置:
@SpringBootApplication @Import(UserManagementAutoConfig.class) public class ExampleAppApplication { public static void main(String[] args) { SpringApplication.run(ExampleAppApplication.class, args); } }
- 方式二:直接扩大ExampleApp的扫描范围
如果两个应用的包路径差异不大,直接在ExampleApp的主类里加上UserManagement的包:
@SpringBootApplication(scanBasePackages = {"com.your.exampleapp", "com.your.usermanagement"}) public class ExampleAppApplication { // ... }
3. 关掉UserManagement的嵌入式Tomcat自动配置
既然你不想让它独立运行,就得把它自带的Tomcat自动配置关掉,不然会和ExampleApp的Tomcat冲突。
你可以在UserManagement的配置类(或者主类)上排除相关自动配置:
@Configuration @ComponentScan(basePackages = "com.your.usermanagement") @EnableAutoConfiguration(exclude = { ServletWebServerFactoryAutoConfiguration.class, EmbeddedWebServerFactoryCustomizerAutoConfiguration.class }) public class UserManagementAutoConfig { }
或者在ExampleApp的application.properties里全局排除:
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration
4. 解决MVC模板找不到的问题
如果UserManagement的模板放在src/main/resources/templates下,作为依赖Jar的一部分,ExampleApp的模板解析器默认只会扫自己的templates目录。你需要配置让它扫描所有依赖里的这个路径。
以Thymeleaf为例,在ExampleApp的application.properties加一行:
spring.thymeleaf.prefix=classpath:/templates/,classpath*:/templates/
classpath*:这个前缀会让Spring扫描所有Jar包里的/templates目录,这样就能找到UserManagement里的模板了。要是用的是Freemarker或者其他模板引擎,对应的调整一下prefix配置就行。
最后验证一下
- 重新构建UserManagement,把那个普通Jar放到本地仓库或者直接让ExampleApp引用本地Jar
- 启动ExampleApp,看看能不能正常调用UserManagement的Bean,模板也能正确渲染
内容的提问来源于stack exchange,提问作者mckenzie

