Spring Boot 应用自动退出剖析

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 今天因技术群里的小伙伴们在请教关于 Spring Boot 微服务应用启动成功后自动退出问题,故特此顺便整理下,以供大家在实际的业务场景中能够有所借鉴及参考。

    今天因技术群里的小伙伴们在请教关于 Spring Boot 微服务应用启动成功后自动退出问题,故特此顺便整理下,以供大家在实际的业务场景中能够有所借鉴及参考。    

   在实际的业务场景中,我们经常会遇到如下异常提示:“Process finished with exit code x “。通常表现为:创建好的 Spring Boot 微服务项目,启动时无异常,却立马自动退出,无论基于何种方式启动均无效且控制台无任何有效信息。此类异常的处理往往较为繁琐,尤其是在无任何 Log 、无明显关键字输出的场景下,尤为让人摸不着头脑。

    那么,针对此类问题,如何能够快速定位、分析?有没有相应的针对性解决方案呢?

其实,针对每一种可能出现的场景都有其独特的处理方式,常见的案例场景,具体如下所示:

    1、 无 Spring 框架日志输出

    此类异常往往无任何线索,没有相关的日志产生

    解决策略:

   针对此类型场景,若我们直接通过启动脚本或者 java -jar 命令行启动,且无任何 Spring 相关日志。此时,需要检测启动脚本文件,启动时定义 Java 虚拟机相关内存参数及垃圾回收策略,检查其语法:内存的适配性、回收算法的匹配性、命令行正确性以及完整性等。

    举一个简单的示例,例如:当部署的 Spring Boot 微服务 运行在 4C 8G 的虚拟机之上,若我们给应用程序分配的堆内存大小超过操作系统所分配的物理内存 8G时,则其是无法启动起来的。除此之外,若启动脚本文件中所定义的年轻代与年老代 GC 策略或模型不匹配,基于特定的环境约束,也有可能是无法启动成功的。当然,命令行正确性及完整性同样也会导致如上场景异常。

    2、 Process finished with exit code 1

    此类异常通常仅输出 Spring 框架日志,即输出框架版本信息,再无其他可用信息,或者借助 Debug 可打印更多信息。具体如下所示:

   (1)引用包异常

    解决策略:

    针对此类问题,往往建议强制异常捕获并打印出来,然后再次启动,可用的信息将会显示出来,通常可能因配置文件少了某一些组件的配置,导致项目启动过程中初始化组件失败。

  (2)Yaml、POM 及 XML 文件配置异常

    解决策

    针对此类问题,着重检查文件内容“格式”的规范性、“参数”的正确性以及可能存在的组件依赖性缺失。针对版本参数正确性问题,往往在 Maven下面的 Dependencies 中的Spring Boot 的版本与 pom.xml 文件中所定义的 Spring Boot 的版本不一致,导致启动异常。针对组件依赖性,可参考如下所示:


<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <!-- 移除对Tomcat的内置依赖 -->
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>

    或如下,


<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-web</artifactId>
</dependency>

  (3)日志框架冲突异常

    解决策

    针对此类问题,往往因 Log4j 和 Common-logs 日志包冲突,为此,我们可通过以下方式解决,具体如下所示:

    方式1:解决冲突,排除掉 Slf4j、Common-logs 其中一方,Spring 使用 slf4j,那可以排除掉 Common-logs

    方式2:  打通Log4j 和 Common-logs,Maven 相关依赖如下所示:


<dependency>
     <groupId>org.slf4j</groupId>
     <artifactId>jcl-over-slf4j</artifactId>
</dependency>

    此依赖可以有效将 Log4j 输出到 Slf4j,从而从 Slf4j输出。

  (4)环境变量异常

    解决策略:

    针对此类异常,往往因程序启动过程中找不到对应的环境变量,无法正确加载环境配置,导致服务启动异常。此时,需要检测 Active Profiles 等相关参数正确性。具体如下所示:


#日志配置-选择一个日志输出环境
spring.profiles.active=dev

    3、 Process finished with exit code 0

    针对此类问题,主要表现为“兼容性”问题,程序往往能够正常运行,但同时出现自动退出现象,具体如下:

   (1)项目中组件依赖兼容性异常

    解决策略:

    针对此类异常,往往需要清除 Maven 工程下面的依赖,具体如下所示:


<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-tomcat</artifactId>
   <scope>provided</scope>
</dependency>

    若我们的环境不是基于 Maven工程,则需要将 spring-boot-starter-tomcat 这个包去除掉即可。

  (2)Spring Boot 不同版本兼容性异常

    解决策略:

    针对此类异常,往往需要对高版本的 Spring Boot 相关 pom.xml 进行调整,需要注意的时,以下依赖必须至少包含:


<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>

   或


<dependency>
  <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>

    综上所述,基于Spring Boot 应用自动退出的相关场景案例,本文简要剖析到此为止,其他不常见的场景以及解决策略暂未在本文中描述,大家有任何问题或建议,可以随时留言、沟通。


相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
30天前
|
监控 Java API
Spring Boot 3.2 结合 Spring Cloud 微服务架构实操指南 现代分布式应用系统构建实战教程
Spring Boot 3.2 + Spring Cloud 2023.0 微服务架构实践摘要 本文基于Spring Boot 3.2.5和Spring Cloud 2023.0.1最新稳定版本,演示现代微服务架构的构建过程。主要内容包括: 技术栈选择:采用Spring Cloud Netflix Eureka 4.1.0作为服务注册中心,Resilience4j 2.1.0替代Hystrix实现熔断机制,配合OpenFeign和Gateway等组件。 核心实操步骤: 搭建Eureka注册中心服务 构建商品
242 3
|
7月前
|
人工智能 Java API
Java也能快速搭建AI应用?一文带你玩转Spring AI可落地性
Java语言凭借其成熟的生态与解决方案,特别是通过 Spring AI 框架,正迅速成为 AI 应用开发的新选择。本文将探讨如何利用 Spring AI Alibaba 构建在线聊天 AI 应用,并实现对其性能的全面可观测性。
1680 100
|
14天前
|
人工智能 监控 安全
如何快速上手【Spring AOP】?核心应用实战(上篇)
哈喽大家好吖~欢迎来到Spring AOP系列教程的上篇 - 应用篇。在本篇,我们将专注于Spring AOP的实际应用,通过具体的代码示例和场景分析,帮助大家掌握AOP的使用方法和技巧。而在后续的下篇中,我们将深入探讨Spring AOP的实现原理和底层机制。 AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架中的核心特性之一,它能够帮助我们解决横切关注点(如日志记录、性能统计、安全控制、事务管理等)的问题,提高代码的模块化程度和复用性。
|
1月前
|
安全 算法 Java
在Spring Boot中应用Jasypt以加密配置信息。
通过以上步骤,可以在Spring Boot应用中有效地利用Jasypt对配置信息进行加密,这样即使配置文件被泄露,其中的敏感信息也不会直接暴露给攻击者。这是一种在不牺牲操作复杂度的情况下提升应用安全性的简便方法。
414 10
|
2月前
|
安全 Java Nacos
0代码改动实现Spring应用数据库帐密自动轮转
Nacos作为国内被广泛使用的配置中心,已经成为应用侧的基础设施产品,近年来安全问题被更多关注,这是中国国内软件行业逐渐迈向成熟的标志,也是必经之路,Nacos提供配置加密存储-运行时轮转的核心安全能力,将在应用安全领域承担更多职责。
|
2月前
|
NoSQL Java Redis
Redis基本数据类型及Spring Data Redis应用
Redis 是开源高性能键值对数据库,支持 String、Hash、List、Set、Sorted Set 等数据结构,适用于缓存、消息队列、排行榜等场景。具备高性能、原子操作及丰富功能,是分布式系统核心组件。
286 2
|
2月前
|
Java Linux 网络安全
Linux云端服务器上部署Spring Boot应用的教程。
此流程涉及Linux命令行操作、系统服务管理及网络安全知识,需要管理员权限以进行配置和服务管理。务必在一个测试环境中验证所有步骤,确保一切配置正确无误后,再将应用部署到生产环境中。也可以使用如Ansible、Chef等配置管理工具来自动化部署过程,提升效率和可靠性。
232 13
|
7月前
|
存储 人工智能 开发框架
Spring AI Alibaba 应用框架挑战赛圆满落幕,恭喜获奖选手
第二届开放原子大赛 Spring AI Alibaba 应用框架挑战赛决赛于 2 月 23 日在北京圆满落幕。
300 93
|
3月前
|
SQL Java 数据库
解决Java Spring Boot应用中MyBatis-Plus查询问题的策略。
保持技能更新是侦探的重要素质。定期回顾最佳实践和新技术。比如,定期查看MyBatis-Plus的更新和社区的最佳做法,这样才能不断提升查询效率和性能。
135 1
|
4月前
|
安全 Java API
Spring Boot 功能模块全解析:构建现代Java应用的技术图谱
Spring Boot不是一个单一的工具,而是一个由众多功能模块组成的生态系统。这些模块可以根据应用需求灵活组合,构建从简单的REST API到复杂的微服务系统,再到现代的AI驱动应用。

热门文章

最新文章