springboot在tomcat中启动两次

文章目录

    • 代码配置类问题
      • 1. 重复的Context Listener/多余的web.xml
        • 1.1 原因
        • 1.2 解决方案
      • 2. SpringBoot的内置Tomcat没有去掉
        • 2.1 原因
        • 2.2 解决方案
      • 3. 代码中有两个类继承了SpringApplication
        • 3.1 原因
        • 3.2 解决方案
      • 4. Tomcat的server.xml中的配置问题
        • 4.1 原因
        • 4.2 解决方案
      • 5. 多个Spring Boot启动器
        • 5.1 原因
        • 5.2 解决方案
    • 本地配置问题
      • 6. Maven插件配置问题
        • 6.1 原因
        • 6.2 解决方案
      • 7. Deployment下有一个war, 一个war exploded
        • 7.1 原因
        • 7.2 解决方案

最近接手运维一个旧项目,遇到了项目一直起不来的问题,检查日志发现应用竟然启动了两次导致了一些端口冲突,本文就springboot在tomcat中启动两次的问题提供一些可能的原因和处理方案

代码配置类问题

1. 重复的Context Listener/多余的web.xml

1.1 原因

在早期的Servlet和JSP应用程序中,web.xml文件是必须的,它用于配置Servlet、过滤器、监听器等。然而,从Servlet 3.0开始,引入了注解(如@WebServlet、@WebFilter、@WebListener等),使得开发者可以不再需要web.xml文件。
对于Spring Boot应用程序,它默认使用嵌入式的Servlet容器(如Tomcat),并且自动配置了大部分的设置。因此,web.xml文件通常是不需要的。
然而,如果你的Spring Boot应用程序仍然包含web.xml文件,那么可能会导致应用程序启动两次。这是因为Spring Boot会自动注册一个ContextLoaderListener,而web.xml文件中可能也注册了一个。这样,就会有两个ContextLoaderListener,导致应用程序启动两次。

<!-- web.xml -->
<listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
// Spring Boot主类
@SpringBootApplication
public class MyApplication {public static void main(String[] args) {SpringApplication application = new SpringApplication(MyApplication.class);application.addListeners(new ContextLoaderListener());application.run(args);}
}
1.2 解决方案

解决这个问题的方法是去掉web.xml文件。如果你的应用程序需要一些特定的配置,你可以使用Spring Boot的各种特性来实现,如添加自定义的Servlet、过滤器、监听器等,总的来说,确保你的应用中只有一个Context Listener,可以避免你的应用程序启动两次的问题。

2. SpringBoot的内置Tomcat没有去掉

2.1 原因

Spring Boot默认会自动配置并启动一个内嵌的Tomcat服务器,这使得开发者可以很方便地进行开发和测试,无需自行配置和管理一个独立的Tomcat服务器。然而,当你的Spring Boot应用程序需要部署到一个独立的Tomcat服务器上时,这就可能会导致问题。
如果你没有正确地配置你的Spring Boot应用程序,那么当你的应用程序启动时,可能会同时启动两个Tomcat服务器:一个是Spring Boot内嵌的Tomcat服务器,另一个是你的独立Tomcat服务器。这就是为什么你的应用程序会启动两次的原因。

2.2 解决方案

解决这个问题的方法是在你的Spring Boot应用程序中排除内嵌的Tomcat服务器。
在你的Spring Boot应用程序的pom.xmlbuild.gradle文件中,你需要找到spring-boot-starter-web依赖。这个依赖默认会包含一个内嵌的Tomcat服务器。
你需要修改这个依赖,排除内嵌的Tomcat服务器。在pom.xml文件中:

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

build.gradle文件中:

dependencies {implementation('org.springframework.boot:spring-boot-starter-web') {exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat'}
}

3. 代码中有两个类继承了SpringApplication

3.1 原因

在一个Spring Boot应用程序中,通常会有一个主类继承了SpringApplication或者调用了SpringApplication.run()方法,这个类被称为主类或启动类,它是Spring Boot应用程序的入口点。当你启动你的Spring Boot应用程序时,Spring Boot会运行这个主类,初始化Spring应用上下文,然后启动内嵌的Tomcat服务器(如果有的话)。
如果你的代码中有两个类都继承了SpringApplication或者都调用了SpringApplication.run()方法,那么当你启动你的应用程序时,这两个类可能都会被运行,导致你的应用程序启动两次。

3.2 解决方案

解决这个问题的方法是确保你的代码中只有一个类继承了SpringApplication或者调用了SpringApplication.run()方法。

4. Tomcat的server.xml中的配置问题

4.1 原因

Tomcat的server.xml文件是Tomcat服务器的主要配置文件,它包含了一些关于服务器的重要配置。如果在这个文件中的配置不正确,可能会导致应用程序启动两次。
一个常见的问题是,在server.xml文件中配置了两个或更多的<Host>元素。每个<Host>元素代表一个虚拟主机,在Tomcat启动时,每个虚拟主机都会尝试启动部署在其上的应用程序。因此,如果你在server.xml文件中配置了两个<Host>元素,并且它们都部署了同一个应用程序,那么这个应用程序会启动两次。

4.2 解决方案

解决这个问题的方法是检查你的server.xml文件,确保只有一个<Host>元素部署了你的应用程序。

5. 多个Spring Boot启动器

5.1 原因

Spring Boot启动器(starters)是一种便捷的方式,可以将一组相关的依赖添加到你的项目中。例如,spring-boot-starter-web就是一个常用的启动器,它包含了构建web应用程序所需要的所有基本依赖。
然而,如果你的项目中包含了多个启动器,尤其是那些有相互冲突的启动器,就可能会导致问题。例如,spring-boot-starter-webspring-boot-starter-webflux都是用于构建web应用程序的启动器,但它们使用的是不同的技术栈(Servlet和Reactive),在同一个项目中同时使用这两个启动器可能会导致应用程序行为的不确定性,甚至可能导致应用程序启动两次。

5.2 解决方案

解决这个问题的方法是仔细审查你的项目依赖,确保没有添加冲突的启动器。
首先,你需要检查你的pom.xmlbuild.gradle文件,找出所有的Spring Boot启动器。
然后,你需要理解每个启动器的功能,并确定你的项目是否真的需要这个启动器。如果你的项目中包含了冲突的启动器,你需要选择其中一个,并移除其他的。
例如,如果你的项目中同时包含了spring-boot-starter-webspring-boot-starter-webflux,你需要根据你的应用程序的需求选择其中一个。如果你的应用程序是基于Servlet的,你应该保留spring-boot-starter-web并移除spring-boot-starter-webflux。反之亦然。

本地配置问题

6. Maven插件配置问题

6.1 原因

Maven是一个强大的项目管理工具,它使用插件来执行各种任务。然而,如果你不正确配置Maven插件,可能会导致应用程序启动两次。

例如,你可能在pom.xml文件中配置了spring-boot-maven-plugin,并在<configuration>部分设置了<fork>true</fork>。这会导致Maven在一个新的进程中启动应用程序,然后在主进程中再次启动应用程序。

<!-- pom.xml -->
<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><fork>true</fork> <!-- 这会导致应用程序启动两次 --></configuration></plugin></plugins>
</build>
6.2 解决方案

解决这个问题的方法是正确配置spring-boot-maven-plugin

首先,你需要检查你的pom.xml文件,确保你没有设置<fork>true</fork>

然后,你需要将<fork>设置为false。这会导致Maven在同一个进程中启动应用程序,从而避免应用程序启动两次的问题。

<!-- pom.xml -->
<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><fork>false</fork> <!-- 这会防止应用程序启动两次 --></configuration></plugin></plugins>
</build>

总的来说,正确配置spring-boot-maven-plugin,可以避免你的应用程序启动两次的问题。

7. Deployment下有一个war, 一个war exploded

7.1 原因

在IntelliJ IDEA中,你可以选择将你的应用程序打包为war文件或者war explodedwar文件是一个压缩的文件,包含了你的应用程序的所有代码和资源。而war exploded是一个解压的版本,它包含了你的应用程序的所有代码和资源,但是它们是以文件和文件夹的形式存在的。
如果你在Deployment中同时配置了warwar exploded,那么当你启动你的应用程序时,IntelliJ IDEA会尝试启动两个应用程序。

7.2 解决方案

解决这个问题的方法是在Deployment中只配置一个war或者war exploded

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/16529.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cpolar内网穿透工具—无需部署,远程访问网址

文章目录 cpolar介绍安装教程隧道管理VIP客户cpolar介绍 cpolar是一种安全的内网穿透服务,它将局域网下面的本地服务器通过加密隧道暴露至公网,使得公网用户可以正常访问内网服务。 只需一行命令,就可以将内网站点发布至公网,方便给客户演示。高效调试微信公众号、小程序…

若依 ruoyi-vue SpringBoot聊天敏感词过滤sensitive-word

组件地址 https://github.com/houbb/sensitive-word 网上博客版本不是最新&#xff0c;查看官方文档&#xff0c;基于0.16.1整理总结&#xff0c;快速上手 pom文件引入 <dependency><groupId>com.github.houbb</groupId><artifactId>sensitive-word…

全域运营平台的优缺点各有哪些?听听使用者怎么说!

作为多个创业者交流群内的热点话题&#xff0c;关于全域运营平台优缺点的分析和点评不断涌现&#xff0c;为许多创业者更多信息的同时&#xff0c;也让他们的选择过程变得非常艰难。而在众多的全域运营平台中&#xff0c;被分析和点评次数最多的&#xff0c;当属全域运营平台。…

css3实现0.5px边框

效果图 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>css3实现0.5px边框</title><s…

电商API接口助力直播带货选品||助力电商平台搭建选品

如今&#xff0c;直播带货如火如荼。直播带货的核心是卖货、品牌盈利&#xff0c;那想要带货效果更好&#xff0c;选品及定价是最关键的环节。 事实上&#xff0c;品牌企业可以直接使用API接口工具来辅助自身选品及定价&#xff0c;这主要是因为比价工具在直播带货选品环节能起…

dubbo复习:(4) 和springboot 整合时,客户端负载均衡的配置

需要在DubboReference注解指定loadbalance属性。示例如下&#xff1a; package cn.edu.tju.service;import org.apache.dubbo.config.annotation.DubboReference; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Ser…

Java+IDEA+SpringBoot药物不良反应ADR智能监测系统源码 ADR智能化监测系统源码

JavaIDEASpringBoot药物不良反应ADR智能监测系统源码 ADR智能化监测系统源码 药物不良反应&#xff08;Adverse Drug Reaction&#xff0c;ADR&#xff09;是指在使用合格药品时&#xff0c;在正常的用法和用量下出现的与用药目的无关的有害反应。这些反应往往因药物种类、使用…

yolov8 ultralytics库进行多机多卡DDP训练

参考: https://github.com/ultralytics/ultralytics/issues/6286 ddp训练报错,问题修改: https://blog.csdn.net/weixin_41012399/article/details/134379417 RuntimeError: CUDA error: invalid device ordinal CUDA kernel errors might be asynchronously reported at s…

【全开源】排队叫号系统源码(FastAdmin+GatewayWorker)

一款基于FastAdminGatewayWorker开发的多项目多场景排队叫号系统&#xff0c;支持大屏幕投屏&#xff0c;语音播报叫号&#xff0c;可用于餐厅排队取餐、美甲店排队取号、排队领取、排队就诊、排队办理业务等诸多场景&#xff0c;助你轻松应对各种排队取号叫号场景。 ​打造高…

LabVIEW全自动样品处理系统有哪些优势?

基于LabVIEW的全自动样品处理系统在现代科研和工业应用中展现出显著的优势&#xff0c;其在数据采集、分析和控制方面的性能使其成为提高效率和精度的理想选择。以下是该系统的详细优势&#xff1a; 高效自动化 LabVIEW的图形化编程语言极大地简化了自动化流程的开发。用户可…

03. Spring 事务管理

文章目录 1. Spring 事务管理简介2. Transactional 注解属性信息3. Transactional 简单使用4. Transactional 使用注意事项4.1 正确指定事务回滚的异常类型4.1.1 Java 异常继承体系 4.2 Transactional 注解应用在 public 方法或类上才有效4.3 正确设置 Transactional 的 propag…

面向ai时代的新型数据底座有哪些?

在AI时代&#xff0c;数据底座指的是一个集成了大规模数据存储、管理、处理和分析功能的平台。它是建立在云计算和大数据技术基础上的&#xff0c;旨在为企业和组织提供高效、可靠的数据管理和分析能力。 新型数据底座具有以下特点&#xff1a; 弹性扩展性&#xff1a;新型数据…

西门子smart line触摸屏软件安装 WinCC Flexible Smart V4SP1 V3

提示&#xff1a;Wincc flexible smart软件为西门子Smart line系列触摸屏的专用组态软件&#xff0c;这款屏不能用博途来组态&#xff0c;只能用这个软件来组态。西门子Smart line系列触摸屏的常用型号为SMART 700 IE V3/V4&#xff0c;SMART 1000 IE V3/V4。 Wincc flexible …

类和对象(上)【有关类的全面学习】【this指针的学习】

类和对象&#xff08;上&#xff09; 1.面向过程和面向对象初步认识 C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题。 C语言注重过程&#xff1a; C是基于面向对象的&#xff0c;关注的是对象&#xff0…

Spring - Spring Cache 缓存注解这样用,实在是太香了!

作者最近在开发公司项目时使用到 Redis 缓存&#xff0c;并在翻看前人代码时&#xff0c;看到了一种关于 Cacheable 注解的自定义缓存有效期的解决方案&#xff0c;感觉比较实用&#xff0c;因此作者自己拓展完善了一番后分享给各位。 Spring 缓存常规配置 Spring Cache 框架给…

IC解析之TPS1HB08-Q1

目录 1.主要参数2. 接口定义3. 工作原理分析高低边驱动的作用TPS1HB08-Q1架构TPS1HB08-Q1典型应用电路参数设置 4.总结 1.主要参数 2. 接口定义 其中&#xff0c;不同的IC版本在故障反馈引脚有所差异&#xff0c;A/B版本则为ILIM功能&#xff0c;F版本则为FLT功能&#xff0c;两…

javaEE—图书管理系统(基础代码版)

前言&#xff1a; 本篇博客是集合了javaEE所学的知识构建的一个基础框架&#xff0c;讲述着面向对象的过程是如何做到多对象交互协作完成框架的构建的。利用了数组&#xff0c;接口&#xff0c;类和对象&#xff0c;抽象类&#xff0c;Object类等知识来完成。 后续会加入数据…

力扣刷题--268. 丢失的数字【简单】

题目描述&#x1f357; 给定一个包含 [0, n] 中 n 个数的数组 nums &#xff0c;找出 [0, n] 这个范围内没有出现在数组中的那个数。 示例 1&#xff1a; 输入&#xff1a;nums [3,0,1] 输出&#xff1a;2 解释&#xff1a;n 3&#xff0c;因为有 3 个数字&#xff0c;所以…

PyTorch深度学习快速入门——P1-P13

环境配置 Anaconda&#xff0c;创建conda create -n pytorch python3.12&#xff0c;使用conda activate pytorch切换到环境。安装pytorch&#xff0c;conda install pytorch torchvision torchaudio pytorch-cuda11.8 -c pytorch -c nvidia&#xff0c;使用import torch&…

水滴式粉碎机:让破碎多样化

水滴式粉碎机以其新的粉碎技术和卓越的性能&#xff0c;引领着粉碎技术的新革命。它采用了高速旋转技术&#xff0c;通过转子对物料进行撞击和摩擦&#xff0c;实现了对物料的精细粉碎&#xff0c;制备出了高品质、高附加值的产品。 水滴式粉碎机在多个行业中都有着广泛的应用…