JBoss EAP 7.2部署Spring Boot 2 WAR时忽略MANIFEST.MF的Main-Class和Start-Class属性
问题根因
你遇到的问题核心原因是:部署到JBoss这类外部Servlet容器的Spring Boot WAR包,不会使用MANIFEST.MF里的Main-Class/Start-Class启动,而是通过Servlet 3.0规范的WebApplicationInitializer扫描机制加载启动类,你引入的外部WAR依赖中包含的其他Spring Boot启动类也实现了该接口,因此会被容器同时扫描到并触发启动。
解决方案(按优先级排序)
- 修正主启动类的外部容器适配逻辑
你的启动类需要继承SpringBootServletInitializer,并重写configure方法显式指定唯一的启动源:
@SpringBootApplication public class AppRunner extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { // 显式指定仅用当前类作为启动源,忽略扫描到的其他启动类 return builder.sources(AppRunner.class); } public static void main(String[] args) { SpringApplication.run(AppRunner.class, args); } }
- 配置Spring Boot属性强制指定启动类
在项目的application.properties或application.yml中添加配置,优先级高于类路径扫描结果:
spring.main.sources=the.application.path.AppRunner
- 打包时排除非预期的启动类
在maven-war-plugin中配置排除其他启动类的class文件,避免被扫描到:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <configuration> <excludes> <!-- 替换为你要排除的其他启动类路径 --> <exclude>**/AnotherRunner.class</exclude> </excludes> </configuration> </plugin>
- 调整组件扫描规则排除无关包
在主启动类的@SpringBootApplication注解中,显式限制扫描范围或排除无关包:
// 方法1:指定仅扫描当前类所在包及子包 @SpringBootApplication(scanBasePackages = "the.application.path") // 方法2:显式排除其他启动类所在的无关包 @SpringBootApplication(excludeFilters = @ComponentScan.Filter(type = FilterType.REGEX, pattern = "another.path.*"))
额外注意
你日志中打印的Spring Boot版本为2.2.4.RELEASE,与MANIFEST.MF中声明的2.5.2不一致,说明项目存在Spring Boot版本冲突,建议先执行mvn dependency:tree排查冲突的依赖并统一版本,避免衍生其他异常。
内容的提问来源于stack exchange,提问作者Alessandro C
相关产品推荐
相关产品推荐

