spring?boot應(yīng)用無法啟動也沒報(bào)錯信息的解決辦法
問題描述
springboot應(yīng)用昨天還能正常好好啟動,忽然之間就啟動不了了,也不報(bào)任何錯誤,只見到控制臺輸出"Stopping service".這個問題已經(jīng)連續(xù)出現(xiàn)過3次了,這次狠下決心要找出個所以然。
在此,先說下個人經(jīng)歷的前面三次無法啟動沒有報(bào)錯。
舉例說明
第一次:和環(huán)境有關(guān)
當(dāng)某個中間件無法連接的時候,我們的同事在try catch中錯誤的使用了System.exit()導(dǎo)致異常;
try{ …… }catch(Exception e){ System.exit(); log.error(e) }
第二次:和jar包沖突有關(guān)
當(dāng)時項(xiàng)目中用到了hbase,需要集成hbase,所以引入了hbase-client 2.1.0 版本,但是該包對curator包版本有要求,導(dǎo)致和其他組件的curator版本沖突,最終程序輸出的信息中,只有幾行INFO日志。
2019-09-12 10:39:30.350 INFO 37343 --- [5311@0x040943a6] org.apache.zookeeper.ZooKeeper : Session: 0x16b72a291d73e73 closed 2019-09-12 10:39:30.351 INFO 37343 --- [3a6-EventThread] org.apache.zookeeper.ClientCnxn : EventThread shut down for session: 0x16b72a291d73e73 2019-09-12 10:39:30.566 INFO 37343 --- [tor-Framework-0] o.a.c.f.imps.CuratorFrameworkImpl : backgroundOperationsLoop exiting
最終通過jar包沖突,不斷試錯,不斷對比和其他能正常啟動應(yīng)用的依賴,才解決沖突。
第三次:和代碼編寫有關(guān)
也就是剛剛發(fā)生的,讓筆者決定狠下心挖掘"無報(bào)錯信息"的罪魁禍?zhǔn)住R欢ㄊ怯挟惓5?,只是不知道在哪個環(huán)節(jié)丟失了。
先說結(jié)論:本次"無緣無故"無法啟動的原因,其實(shí)是昨天筆者開發(fā)過程中,代碼中添加了一個dubbo服務(wù)依賴,但是沒有在dubbo xml文件中注冊reference,所以導(dǎo)致依賴缺失,最終應(yīng)用起不來。
當(dāng)然,和前面幾次一樣,控制臺,日志文件,沒有任何地方有錯誤信息輸出。
排查分析
根據(jù)下面這篇文章,給出了提示。
引用:SpringBoot啟動項(xiàng)目后自動關(guān)閉: https://blog.csdn.net/laoxilaoxi_/article/details/83654186
先說結(jié)論:不是沒有輸出異常,是新版本的Spring boot 在出錯后,不再輸出錯誤到控制臺了,而是將異常在Application main方法中拋出。
劃重點(diǎn):新版本Spring boot 2.x 不再輸出錯誤到日志中,將異常在Application main方法中拋出。 而低版本Spring boot 1.3.x,1.4.x版本,是會直接在控制臺輸出錯誤的。
解決方法
**解決:**有了上面的靈感,那好辦我在main 啟動方法中捕捉,自己打印,不就能看出來錯誤原因了嗎?
事實(shí)上,確實(shí)應(yīng)該如此。
最后,筆者在main方法啟動spring boot 時,進(jìn)行一場捕捉并輸出日志。然后錯誤就一目了然了。
@Slf4j
@ImportResource("classpath*:spring-*.xml")
@SpringBootApplication
public class SupportApplication {
public static void main(String[] args) {
try {
SpringApplication.run(SupportApplication.class, args);
System.out.println("Server startup done.");
}catch (Exception e){
log.error("服務(wù)xxx-support啟動報(bào)錯", e);
}
}
}
最終在控制臺輸出久違的異常信息:
2019-09-12 11:18:18.799 ERROR 38420 --- [ main] c.c.xxx.support.xxxSupportApplication : 服務(wù)xxx-support啟動報(bào)錯
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'xxxController': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'xxxCoreService': Unsatisfied dependency expressed through field 'xxxSpotService'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.test.xxx.api.service.XxxSpotService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:321) ~[spring-context-5.0.10.RELEASE.jar:5.0.10.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1336) ~[spring-beans-5.0.10.RELEASE.jar:5.0.10
擴(kuò)展驗(yàn)證
接下來讓我們驗(yàn)證下低版本Spring boot 1.3.x,1.4.x版本,是否會直接在控制臺輸出錯誤。
下面的實(shí)驗(yàn)是基于spring boot 1.4.7版本進(jìn)行的,低版本的spring boot 都會在控制臺或日志文件中先輸出錯誤信息,再退出啟動main方法。所以,對于從低版本升到高版本的,請?jiān)趍ain啟動時,自行捕捉異常。
@Controller
@RequestMapping("/test")
public class TestErrorController {
/**
* 1.制造一個不存在的Spring bean;
* 2.并對其進(jìn)行依賴;
* 3.啟動應(yīng)用XxxApplication;
* 4.控制臺有明顯報(bào)錯信息輸出;
* 2019-09-12 10:44:38.014 INFO 37477 --- [ main] o.apache.catalina.core.StandardService : Stopping service [Tomcat]
* 2019-09-12 10:44:38.026 INFO 37477 --- [ main] utoConfigurationReportLoggingInitializer :
*
* <p>Error starting ApplicationContext. To display the auto-configuration report re-run your
* application with 'debug' enabled. 2019-09-12 10:44:38.155 ERROR 37477 --- [ main] o.s.b.d.LoggingFailureAnalysisReporter :
* <p>*************************** APPLICATION FAILED TO START ***************************
* <p>Description:
* <p>A component required a bean of type
* 'cn.test.lee.service.TestErrorService' that could not be found.
* <p>Action:
* <p>Consider defining a bean of type 'cn.test.service.TestErrorService'
* in your configuration.
* <p>Disconnected from the target VM, address: '127.0.0.1:57403', transport: 'socket'
* <p>Process finished with exit code 1
*/
@Resource
private TestErrorService testErrorService;
public String testError(){
testErrorService.testError();
return "啟動就報(bào)錯了!";
}
}總結(jié)
到此這篇關(guān)于spring boot應(yīng)用無法啟動也沒報(bào)錯信息解決辦法的文章就介紹到這了,更多相關(guān)spring boot應(yīng)用無法啟動沒報(bào)錯信息內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring @Primary作用和實(shí)現(xiàn)原理詳解
今天分享一下Spring中的@Primary注解,Primary的意思是主要的,我們在使用spring的時候,難免會定義多個類型相同的bean,這時候如果不采取一些方法,那么是無法正常使用bean的,所以本就給大家介紹Spring @Primary的作用和實(shí)現(xiàn)原理2023-07-07
深入解析反編譯字節(jié)碼文件中的代碼邏輯JVM中的String操作
這篇文章主要介紹了深入解析反編譯字節(jié)碼文件中的代碼邏輯JVM中的String操作,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10
springboot啟動過程中常用的回調(diào)示例詳解
springboot提供非常豐富回調(diào)接口,利用這些接口可以做非常多的事情,本文通過實(shí)例代碼給大家介紹springboot啟動過程中常用的回調(diào)知識感興趣的朋友跟隨小編一起看看吧2022-01-01
Java報(bào)錯:java.util.concurrent.ExecutionException的解決辦法
在Java并發(fā)編程中,我們經(jīng)常使用java.util.concurrent包提供的工具來管理和協(xié)調(diào)多個線程的執(zhí)行,va并發(fā)編程中,然而,在使用這些工具時,可能會遇到各種各樣的異常,其中之一就是java.util.concurrent.ExecutionException,本文將詳細(xì)分析這種異常的背景、可能的原因2024-09-09
spring?boot配置dubbo方式(properties)
這篇文章主要介紹了spring?boot配置dubbo方式(properties),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-01-01
synchronized?和?Lock?的異同點(diǎn)(如何讓選擇)
這篇文章主要介紹了?synchronized和Lock的異同點(diǎn)(如何讓選擇),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-09-09

