You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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启动类也实现了该接口,因此会被容器同时扫描到并触发启动。


解决方案(按优先级排序)

  1. 修正主启动类的外部容器适配逻辑
    你的启动类需要继承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);
    }
}
  1. 配置Spring Boot属性强制指定启动类
    在项目的application.properties或application.yml中添加配置,优先级高于类路径扫描结果:
spring.main.sources=the.application.path.AppRunner
  1. 打包时排除非预期的启动类
    在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>
  1. 调整组件扫描规则排除无关包
    在主启动类的@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 17:15:08