Spring Boot 应用自动退出剖析

简介: 今天因技术群里的小伙伴们在请教关于 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实时生图绘板
相关文章
|
8月前
|
监控 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注册中心服务 构建商品
1290 3
|
人工智能 Java API
Java也能快速搭建AI应用?一文带你玩转Spring AI可落地性
Java语言凭借其成熟的生态与解决方案,特别是通过 Spring AI 框架,正迅速成为 AI 应用开发的新选择。本文将探讨如何利用 Spring AI Alibaba 构建在线聊天 AI 应用,并实现对其性能的全面可观测性。
3194 116
|
7月前
|
SQL Java 数据库连接
Spring Data JPA 技术深度解析与应用指南
本文档全面介绍 Spring Data JPA 的核心概念、技术原理和实际应用。作为 Spring 生态系统中数据访问层的关键组件,Spring Data JPA 极大简化了 Java 持久层开发。本文将深入探讨其架构设计、核心接口、查询派生机制、事务管理以及与 Spring 框架的集成方式,并通过实际示例展示如何高效地使用这一技术。本文档约1500字,适合有一定 Spring 和 JPA 基础的开发者阅读。
743 0
|
6月前
|
消息中间件 缓存 Java
Spring框架优化:提高Java应用的性能与适应性
以上方法均旨在综合考虑Java Spring 应该程序设计原则, 数据库交互, 编码实践和系统架构布局等多角度因素, 旨在达到高效稳定运转目标同时也易于未来扩展.
498 8
|
8月前
|
Java 应用服务中间件 开发者
Spring Boot 技术详解与应用实践
本文档旨在全面介绍 Spring Boot 这一广泛应用于现代企业级应用开发的框架。内容将涵盖 Spring Boot 的核心概念、核心特性、项目自动生成与结构解析、基础功能实现(如 RESTful API、数据访问)、配置管理以及最终的构建与部署。通过本文档,读者将能够理解 Spring Boot 如何简化 Spring 应用的初始搭建和开发过程,并掌握其基本使用方法。
633 2
|
8月前
|
人工智能 监控 安全
如何快速上手【Spring AOP】?核心应用实战(上篇)
哈喽大家好吖~欢迎来到Spring AOP系列教程的上篇 - 应用篇。在本篇,我们将专注于Spring AOP的实际应用,通过具体的代码示例和场景分析,帮助大家掌握AOP的使用方法和技巧。而在后续的下篇中,我们将深入探讨Spring AOP的实现原理和底层机制。 AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架中的核心特性之一,它能够帮助我们解决横切关注点(如日志记录、性能统计、安全控制、事务管理等)的问题,提高代码的模块化程度和复用性。
|
8月前
|
安全 算法 Java
在Spring Boot中应用Jasypt以加密配置信息。
通过以上步骤,可以在Spring Boot应用中有效地利用Jasypt对配置信息进行加密,这样即使配置文件被泄露,其中的敏感信息也不会直接暴露给攻击者。这是一种在不牺牲操作复杂度的情况下提升应用安全性的简便方法。
1424 10
|
存储 人工智能 开发框架
Spring AI Alibaba 应用框架挑战赛圆满落幕,恭喜获奖选手
第二届开放原子大赛 Spring AI Alibaba 应用框架挑战赛决赛于 2 月 23 日在北京圆满落幕。
503 89
|
9月前
|
Java Linux 网络安全
Linux云端服务器上部署Spring Boot应用的教程。
此流程涉及Linux命令行操作、系统服务管理及网络安全知识,需要管理员权限以进行配置和服务管理。务必在一个测试环境中验证所有步骤,确保一切配置正确无误后,再将应用部署到生产环境中。也可以使用如Ansible、Chef等配置管理工具来自动化部署过程,提升效率和可靠性。
899 13
|
9月前
|
NoSQL Java Redis
Redis基本数据类型及Spring Data Redis应用
Redis 是开源高性能键值对数据库,支持 String、Hash、List、Set、Sorted Set 等数据结构,适用于缓存、消息队列、排行榜等场景。具备高性能、原子操作及丰富功能,是分布式系统核心组件。
746 2