温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

springboot启动后卡住无日志的情况有哪些

发布时间:2021-12-18 17:04:58 来源:亿速云 阅读:424 作者:小新 栏目:开发技术

这篇文章主要介绍了springboot启动后卡住无日志的情况有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

1.场景复现

springboot项目启动后卡住无日志,肯定是报错了或者其他原因,并且日志没有打印出来。

1.1 说一下比较通用常见的场景

检查一下 是否 exclude了springboot自带的日志包,放开后可能就有具体的错误原因了。

  <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
        <version>2.0.5.RELEASE</version>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

1.2 不太常见的场景

加载到如下图的地方,直接停了。

springboot启动后卡住无日志的情况有哪些

或者直接打印 INFO [class:org.apache.juli.logging.DirectJDKLog | method:log | line:180] logInfo==> Stopping service [Tomcat],没有打印具体的报错信息

是具体报错的地方用的日志框架和你本身项目中的冲突了。

1.2.1 apollo忘记配置

比如就拿我们项目来说,apollo少配了一个key,项目直接启动失败,只是报了上面的错误信息,没有报出具体报错信息。

apollo加载的时候用的日志框架或者版本不一致导致的,一般来说log4j,slf4j,logback这些都会引用,但是版本很难统一,尤其引用了其他的第三方包。

在apollo那个问题上,将commons-logging的冲突解决后保留 1.1.1 版本,就打印出报错信息了。

<dependency>
  <groupId>commons-logging</groupId>
  <artifactId>commons-logging</artifactId>
  <version>1.1.1</version>
</dependency>

1.2.2 tomcat版本冲突

去除第三方引用的不同版本的tomcat依赖,仅保留一个

<exclusions>
        <exclusion>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <groupId>org.springframework.boot</groupId>
        </exclusion>
        <exclusion>
            <artifactId>spring-boot-starter-web</artifactId>
            <groupId>org.springframework.boot</groupId>
        </exclusion>
    </exclusions>

1.2.3 apollo引用的包找不到

找不到 gson 包,这个和上面那个类似,也是apollo加载的时候失败了,后来日志打印出来了,问题也比较好找,加上gson依赖。

Caused by: java.util.ServiceConfigurationError: com.ctrip.framework.apollo.internals.Injector: Providercom.ctrip.framework.apollo.internals.DefaultInjector could not be instantiated
at java.util.ServiceLoader.fail(ServiceLoader.java:232)
at java.util.ServiceLoader.access$100(ServiceLoader.java:185)
at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:384)
at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:404)
at java.util.ServiceLoader$1.next(ServiceLoader.java:480)
at com.ctrip.framework.foundation.internals.ServiceBootstrap.loadFirst(ServiceBootstrap.java:14)
at com.ctrip.framework.apollo.build.ApolloInjector.getInjector(ApolloInjector.java:20)
... 26 common frames omitted
Caused by: com.ctrip.framework.apollo.exceptions.ApolloConfigException: Unable to initialize Guice Injector!
at com.ctrip.framework.apollo.internals.DefaultInjector.<init>(DefaultInjector.java:30)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at java.lang.Class.newInstance(Class.java:442)
at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:380)
... 30 common frames omitted
Caused by: com.google.common.util.concurrent.ExecutionError: com.google.common.util.concurrent.ExecutionError: java.lang.NoClassDefFoundError: Lcom/google/gson/Gson;

1.2.4 项目改成打包lib目录后,部分包打包不完整

这个问题是最棘手了,找了一天,之前由于项目打jar包过大,想把jar和第三方不常用的包分开,打成jar和lib,具体可以看这篇。

同样的pom依赖,在改成lib之后就启动停止

INFO [class:org.apache.juli.logging.DirectJDKLog | method:log | line:180] logInfo==> Stopping service [Tomcat]

只能把原来的100多M的jar解压缩后和新方式打的lib目录做对比,最后发现第三方包在循环依赖后打包有问题,大小也不一样。lib目录只打了自己那层,没有打循环依赖那些包,导致加载的时候报错了。

2.解决思路

总结一下,出现的问题场景

2.1 springboot 本身日志被排除了,tomcat版本不一致

2.2 apollo找不到key 由于 commons-logging 版本过高

2.3 找不到gson包

2.4 打包lib目录后,循环依赖的包和单次依赖打包大小不一致,导致部分类缺失

如果项目是个新项目,搭建工程的时候尽量保证使用的第三方包的兼容性。如果是老的项目,加新包的时候要注意,尽量避免冲突,以之前的包为准。

感谢你能够认真阅读完这篇文章,希望小编分享的“springboot启动后卡住无日志的情况有哪些”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI