Spring Boot微服务构建成功但启动卡住无报错问题求助
Spring Boot启动无报错但卡住的排查方案
问题概述
Spring Boot Starter应用构建成功,但启动时卡在某阶段无进展、无任何错误输出,等待后问题仍未解决。启动状态截图如下:
项目build.gradle完整配置:
buildscript { dependencies{ // classpath(libs.plugin.sphinx.gradle) classpath("com.github.davidmc24.gradle.plugin:gradle-avro-plugin:1.2.0") } ext { // jib_version = '2.7.1' gradle_git_version = '1.5.1' spring_boot_version = '2.6.6' spring_dependency_management_version = '1.0.11.RELEASE' // sphinx_version = '2.6.1' // sonar_qube_version = '2.8' // johnrengelman_processes = '0.5.0' // openapi_gradle_plugin = '1.3.0' // franzbecker_gradle_plugin = '4.0.0' // openapi_core_version = '1.4.3' } } plugins { id 'java' id 'maven-publish' id 'groovy' id 'jacoco' alias(libs.plugins.plugin.gcloud.jib) alias(libs.plugins.plugin.springframework.boot) alias(libs.plugins.plugin.gradle.git.properties) alias(libs.plugins.plugin.spring.dependencymgmt) // alias(libs.plugins.plugin.openapi.gen) alias(libs.plugins.plugin.sonarqube) alias(libs.plugins.plugin.freeair.lombok) // alias(libs.plugins.plugin.kotlin.jvm) } /* plugins.withType(JacocoPlugin) { tasks["test"].finalizedBy 'jacocoTestReport' }*/ springBoot { buildInfo() } /*jib { // specify the name of docker image to be built to.image = "eu.gcr.io/dmn01-rskctl-bld-01-2fd1/rsk/nfr-op-consumer-svc/nfr-op-consumer-svc" // specify the exact base image to be used. //eg: harbor.mgmt-bld.oncp.dev/mve_tools_rtl/sbs-java-wss-distroless:release_v0.8.0 // from.image = "<key your base image>" from.image = "harbor.mgmt-bld.oncp.dev/base_images/distroless/java:nonroot_912dc0513659" container.user = "nonroot" }*/ configurations { all*.exclude module : 'spring-boot-starter-logging' } repositories { maven { url = "https://nexus.mgmt-bld.oncp.dev/repository/maven-public/" } maven { url = "https://nexus.sbs-bld.oncp.dev/repository/shared-services/" } mavenCentral() } def spring_cloud_version = 'Hoxton.SR12' def gcp_cloud_version = '24.3.0' def lombok_version = '1.18.26' def spring_boot_version = '2.6.6' def spring_cloud_gcp_version = "4.1.4" dependencies { implementation "org.projectlombok:lombok:${lombok_version}" implementation 'org.json:json:20220320' implementation "org.springframework.boot:spring-boot-starter-log4j2:${spring_boot_version}" implementation 'org.springframework:spring-core:5.3.20' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'com.google.cloud:google-cloud-core' implementation 'com.google.cloud:spring-cloud-gcp-starter-storage' implementation 'com.google.cloud:google-cloud-bigquery' implementation platform('com.google.cloud:libraries-bom:26.11.0') testImplementation ('org.springframework.boot:spring-boot-starter-test:2.6.6') { exclude group: 'junit', module: 'junit' } annotationProcessor "org.projectlombok:lombok:${lombok_version}" } dependencyManagement { imports { mavenBom "org.springframework.cloud:spring-cloud-dependencies:${spring_cloud_version}" mavenBom "com.google.cloud:libraries-bom:${gcp_cloud_version}" mavenBom "com.google.cloud:spring-cloud-gcp-dependencies:${spring_cloud_gcp_version}" } } group = "com.lbg.dmn01.rsk" version = "1.0.0" sourceCompatibility = '11' targetCompatibility = '11' publishing { publications { maven(MavenPublication) { from(components.java) } } } tasks.withType(JavaCompile) { options.encoding = "UTF-8" // dependsOn openApiGenerate } /*sphinx { sourceDirectory = "${projectDir}/documentation/source" outputDirectory = "${projectDir}/documentation/target" }*/ sonarqube { properties { property "sonar.sourceEncoding", "UTF-8" property "sonar.exclusions", "**/package-name1/**, **/package-name2/**, **/ClassName1.java, **/ClassName2.java" property 'sonar.coverage.jacoco.xmlReportPaths', "$projectDir/build/reports/jacoco/test/jacocoTestReport.xml" property "sonar.junit.reportsPath", "$projectDir/build/test-results/test" //ignore listed rules property "sonar.issue.ignore.multicriteria", "e1" //Local-Variable Type Inference should be used (Declare this local variable with "var" instead., ) property "sonar.issue.ignore.multicriteria.e1.ruleKey", "java:S6212" property "sonar.issue.ignore.multicriteria.e1.resourceKey", "**/*" } } /*jacocoTestReport { reports { xml.enabled true csv.enabled false } }*/ tasks.named('test') { useJUnitPlatform() }
排查步骤
1. 优先排查GCP资源依赖阻塞
项目引入了spring-cloud-gcp-starter-storage和google-cloud-bigquery,这类组件启动时会尝试连接GCP服务。如果环境未配置GCP认证(如未设置GOOGLE_APPLICATION_CREDENTIALS环境变量、权限不足),应用会卡在认证/连接阶段,且无明确报错。
- 临时验证:注释掉这两个GCP依赖,重新启动应用,看是否能正常完成启动。
- 解决措施:配置GCP服务账号密钥,确保应用有权访问对应资源;开发环境可临时添加
spring.cloud.gcp.enabled=false禁用GCP自动配置。
2. 调高日志级别,捕获启动细节
当前日志级别可能不足以输出阻塞点的细节,调整日志配置:
- 在
application.properties或log4j2.xml中添加:
重启后查看最后输出的日志内容,定位具体阻塞的Bean或初始化步骤。logging.level.org.springframework=DEBUG logging.level.com.google.cloud=DEBUG
3. 检查自定义初始化逻辑的阻塞
Tomcat已初始化端口,但应用未完成启动,可能是自定义Bean的初始化逻辑(如@PostConstruct、CommandLineRunner、ApplicationRunner)存在阻塞操作(比如无限循环、等待外部资源)。
- 排查代码中所有初始化相关逻辑,检查是否有同步阻塞代码。
- 使用
jstack命令分析线程堆栈:
查看堆栈中处于# 获取应用进程ID jps # 导出线程堆栈 jstack <进程ID> > thread_dump.txtWAITING或RUNNABLE状态的线程,找到阻塞源头。
4. 修复版本不匹配的依赖冲突
你的Spring Boot版本是2.6.6,但Spring Cloud使用的是Hoxton.SR12(适配Spring Boot 2.3.x-2.4.x),版本不匹配可能导致隐式依赖冲突,引发启动阻塞。
- 调整Spring Cloud版本为2021.0.5(Jubilee,适配Spring Boot 2.6.x);或降低Spring Boot版本到2.4.x匹配Hoxton版本。
- 执行
gradle dependencies查看依赖树,排查重复或冲突的依赖(比如Spring Core版本是否统一)。
5. 禁用冗余自动配置类
添加配置禁用不必要的自动配置类,逐步排查:
spring.autoconfigure.exclude=org.springframework.cloud.gcp.autoconfigure.storage.GcpStorageAutoConfiguration,com.google.cloud.spring.autoconfigure.bigquery.BigQueryAutoConfiguration
内容的提问来源于stack exchange,提问作者Harmeet Kaur
相关产品推荐
相关产品推荐

