Spring Boot Jar运行报NoSuchBeanDefinitionException,IDE运行正常
Spring Boot Jar运行时出现NoSuchBeanDefinitionException问题排查
问题描述
使用Gradle构建Spring Boot应用,在IntelliJ中运行正常,但执行java -jar app.jar时抛出NoSuchBeanDefinitionException,提示找不到PlayersRepository类型的Bean。
build.gradle配置
plugins { id 'java' id 'org.springframework.boot' version '3.0.5' id 'io.spring.dependency-management' version '1.1.0' } group = 'com.example' version = '0.0.1-SNAPSHOT' sourceCompatibility = '17' repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-data-jpa:3.0.5' implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-csv' developmentOnly 'org.springframework.boot:spring-boot-devtools' runtimeOnly 'com.h2database:h2' compileOnly 'org.projectlombok:lombok:1.18.24' annotationProcessor 'org.projectlombok:lombok:1.18.24' testImplementation 'org.springframework.boot:spring-boot-starter-test' implementation 'jakarta.xml.ws:jakarta.xml.ws-api:4.0.0' } tasks.named('test') { useJUnitPlatform() } jar { enabled = true archiveClassifier.set("") duplicatesStrategy(DuplicatesStrategy.EXCLUDE) manifest { attributes "Main-Class": "com.example.players.PlayersApplication" } from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } } }
Gradle Build任务输出
5:43:46 PM: Executing 'build'... > Task :compileJava UP-TO-DATE > Task :processResources UP-TO-DATE > Task :classes UP-TO-DATE > Task :resolveMainClassName > Task :bootJar > Task :jar > Task :assemble > Task :compileTestJava > Task :processTestResources NO-SOURCE > Task :testClasses > Task :test 2023-04-25T17:44:26.265+03:00 INFO 2092 --- [ionShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default' 2023-04-25T17:44:26.267+03:00 INFO 2092 --- [ionShutdownHook] .SchemaDropperImpl$DelayedDropActionImpl : HHH000477: Starting delayed evictData of schema as part of SessionFactory shut-down' 2023-04-25T17:44:26.485+03:00 INFO 2092 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... 2023-04-25T17:44:26.505+03:00 INFO 2092 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. 2023-04-25T17:44:26.511+03:00 INFO 2092 --- [ionShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default' 2023-04-25T17:44:26.512+03:00 INFO 2092 --- [ionShutdownHook] .SchemaDropperImpl$DelayedDropActionImpl : HHH000477: Starting delayed evictData of schema as part of SessionFactory shut-down' 2023-04-25T17:44:26.528+03:00 WARN 2092 --- [ionShutdownHook] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 90121, SQLState: 90121 2023-04-25T17:44:26.530+03:00 ERROR 2092 --- [ionShutdownHook] o.h.engine.jdbc.spi.SqlExceptionHelper : Database is already closed (to disable automatic closing at VM shutdown, add ";DB_CLOSE_ON_EXIT=FALSE" to the db URL) [90121-214] 2023-04-25T17:44:26.537+03:00 WARN 2092 --- [ionShutdownHook] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 90121, SQLState: 90121 2023-04-25T17:44:26.537+03:00 ERROR 2092 --- [ionShutdownHook] o.h.engine.jdbc.spi.SqlExceptionHelper : Database is already closed (to disable automatic closing at VM shutdown, add ";DB_CLOSE_ON_EXIT=FALSE" to the db URL) [90121-214] 2023-04-25T17:44:26.540+03:00 WARN 2092 --- [ionShutdownHook] o.s.b.f.support.DisposableBeanAdapter : Invocation of destroy method failed on bean with name 'entityManagerFactory': org.hibernate.exception.JDBCConnectionException: Unable to release JDBC Connection used for DDL execution 2023-04-25T17:44:26.541+03:00 INFO 2092 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-2 - Shutdown initiated... 2023-04-25T17:44:26.543+03:00 INFO 2092 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-2 - Shutdown completed. > Task :check > Task :build BUILD SUCCESSFUL in 39s 7 actionable tasks: 5 executed, 2 up-to-date 5:44:26 PM: Execution finished 'build'.
Java -jar运行报错输出
17:37:23.186 [main] ERROR org.springframework.boot.SpringApplication -- 应用启动失败 org.springframework.beans.factory.UnsatisfiedDependencyException: 创建名为'playersController'的Bean时出错:通过字段'playersService'表达的依赖不满足;创建名为'playersService'的Bean时出错:通过字段'playersRepository'表达的依赖不满足:找不到类型为'com.example.players.repositories.PlayersRepository'的合格Bean:期望至少有1个符合自动装配条件的Bean。依赖注解:{@org.springframework.beans.factory.annotation.Autowired(required=true)} at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:713) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:693) at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:133) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:482) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1416) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:597) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:520) at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:973) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:917) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:584) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:732) at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:434) at org.springframework.boot.SpringApplication.run(SpringApplication.java:310) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1304) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1293) at com.example.players.PlayersApplication.main(PlayersApplication.java:12) Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: 创建名为'playersService'的Bean时出错:通过字段'playersRepository'表达的依赖不满足:找不到类型为'com.example.players.repositories.PlayersRepository'的合格Bean:期望至少有1个符合自动装配条件的Bean。依赖注解:{@org.springframework.beans.factory.annotation.Autowired(required=true)} at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:713) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:693) at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:133) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:482) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1416) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:597) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:520) at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:254) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1417) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1337) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:710) ... 19 common frames omitted
问题原因及解决方案
核心原因
自定义了jar任务,未使用Spring Boot提供的bootJar任务构建可执行Jar。Spring Boot的bootJar会自动处理应用打包逻辑,包括配置类扫描、Bean注册等;而自定义的jar任务仅生成普通Java Jar,缺少Spring Boot自动装配支持,导致启动时无法扫描并创建PlayersRepository这类Spring Data JPA的Bean。
解决方案
- 删除自定义的
jar任务配置,保留Spring Boot默认的bootJar任务。默认情况下,bootJar生成的可执行Jar路径为build/libs/{project-name}-{version}.jar。 - 执行构建命令:
./gradlew bootJar(Windows环境使用gradlew.bat bootJar)。 - 运行生成的可执行Jar:
java -jar build/libs/players-0.0.1-SNAPSHOT.jar(根据实际项目名称和版本调整)。
若需同时生成普通Jar和可执行Jar,可修改配置避免冲突:
jar { archiveClassifier.set("plain") // 给普通Jar添加后缀,与bootJar生成的可执行Jar区分 }
此时bootJar生成可执行Jar,jar生成普通Jar,两者互不干扰。
内容的提问来源于stack exchange,提问作者jen
相关产品推荐
相关产品推荐

