Spring Boot项目运行Maven打包Jar时出现BeanDefinitionStoreException异常求助
Spring Boot项目运行Maven打包Jar时出现BeanDefinitionStoreException异常求助
你好呀!看你是Spring Boot新手,遇到这个运行问题肯定很头疼,我来帮你拆解下问题根源和解决办法~
核心问题定位
从你提供的异常栈最底层可以看到关键错误:
Caused by: java.lang.ClassNotFoundException: javax.servlet.ServletContext
这说明你的Jar包中缺少Servlet相关的核心依赖,导致Spring Boot启动时无法初始化上下文。
问题原因分析
看你的pom.xml配置,存在两个关键问题点:
- 项目打包类型是
<packaging>war</packaging>,这是为部署到外部Servlet容器(比如Tomcat)准备的格式 - 你把
spring-boot-starter-tomcat和javax.servlet-api的依赖范围都设为了<scope>provided</scope>:<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency>
provided范围的含义是:这些依赖由运行时容器提供,不需要打包到Jar/War中。但如果你直接运行Jar包,Spring Boot需要依赖内置的Tomcat容器来启动,这时候这些依赖就缺失了,自然会抛出类找不到的异常。
针对性解决方案
分两种场景给你提供方案:
场景1:想直接运行Jar包(使用Spring Boot内置Tomcat)
这是新手最常用的方式,修改步骤如下:
- (可选)把
<packaging>war</packaging>改成<packaging>jar</packaging>,明确打包为可执行Jar - 修改
spring-boot-starter-tomcat的依赖范围,删掉<scope>provided</scope>,让Maven把Tomcat依赖打包进Jar:<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </dependency> - 删掉单独的
javax.servlet-api依赖:因为spring-boot-starter-web已经包含了Servlet API的依赖,重复引入可能导致版本冲突
修改完成后,重新执行Maven命令:
mvn clean package
然后运行Jar包:
java -jar target/airkommWebPortal.jar
场景2:要部署到外部Tomcat服务器(保留War包)
如果你的目标是把War包部署到外部Tomcat,那当前的provided配置是正确的,但不能直接运行Jar包,需要:
- 执行
mvn clean package生成War包 - 把
target/airkommWebPortal.war复制到Tomcat的webapps目录下 - 启动Tomcat服务器,访问对应的路径即可
额外说明
你的主类SpringMvcApplication继承SpringBootServletInitializer是完全没问题的,这个类是为了支持War包部署到外部容器,同时也不影响Jar包的直接运行,只要依赖配置正确就可以正常启动。
备注:内容来源于stack exchange,提问作者Shobhit Solanki
相关产品推荐
相关产品推荐

