Spring boot:无法启动嵌入式 Tomcat servlet 容器

Posted

技术标签:

【中文标题】Spring boot:无法启动嵌入式 Tomcat servlet 容器【英文标题】:Spring boot: Unable to start embedded Tomcat servlet container 【发布时间】:2017-09-20 14:58:31 【问题描述】:

我是 Spring Boot 新手,在运行我的应用程序时遇到了错误。 我正在学习一个教程,我相信我对 POM 有适当的父级和依赖项,请帮助我

主类:

package com.boot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

/**
 * Hello world!
 *
 */

@SpringBootApplication
public class App 

    public static void main( String[] args )
    
        SpringApplication.run(App.class, "hello");
    

错误是:

   org.springframework.boot.context.embedded.EmbeddedServletContainerException: Unable to start embedded Tomcat servlet container
        at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer.start(TomcatEmbeddedServletContainer.java:165) ~[spring-boot-1.3.1.RELEASE.jar:1.3.1.RELEASE]
        at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.startEmbeddedServletContainer(EmbeddedWebApplicationContext.java:293) ~[spring-boot-1.3.1.RELEASE.jar:1.3.1.RELEASE]
        at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.finishRefresh(EmbeddedWebApplicationContext.java:141) ~[spring-boot-1.3.1.RELEASE.jar:1.3.1.RELEASE]
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:541) ~[spring-context-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118) ~[spring-boot-1.3.1.RELEASE.jar:1.3.1.RELEASE]
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:764) [spring-boot-1.3.1.RELEASE.jar:1.3.1.RELEASE]
        at org.springframework.boot.SpringApplication.doRun(SpringApplication.java:357) [spring-boot-1.3.1.RELEASE.jar:1.3.1.RELEASE]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:305) [spring-boot-1.3.1.RELEASE.jar:1.3.1.RELEASE]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1124) [spring-boot-1.3.1.RELEASE.jar:1.3.1.RELEASE]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1113) [spring-boot-1.3.1.RELEASE.jar:1.3.1.RELEASE]
        at com.boot.App.main(App.java:18) [classes/:na]Caused by: java.lang.IllegalStateException: Tomcat connector in failed state
        at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer.start(TomcatEmbeddedServletContainer.java:159) ~[spring-boot-1.3.1.RELEASE.jar:1.3.1.RELEASE]
        ... 10 common frames omitted

POM:

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>

  <groupId>com.boot</groupId>
  <artifactId>das-boot</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.3.1.RELEASE</version>
    </parent>
  <name>das-boot</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
  <dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

【问题讨论】:

发布整个堆栈跟踪。那里有一条直接来自 Tomcat 的附加行,可能是说您已经在端口上打开了一些东西。 【参考方案1】:

尝试将application.yaml(或application.properties)中的端口号更改为其他内容。

【讨论】:

我找不到这个目录,你指的是哪个IDE?但是,当我以编程方式设置此端口时,它正在工作,尽管我必须在每次运行时更改端口..请建议如何解决这个问题。 System.getProperties().put( "server.port", 130 ); 看看这个:github.com/khoubyari/spring-boot-rest-example/blob/master/src/… ..虽然我的应用程序没有这个配置文件。 TCP 端口冲突是问题所在,所以这篇文章仍然很有帮助。关键错误是:无法启动与 ProtocolHandler 和 java.net.BindException 关联的端点:地址已在使用中【参考方案2】:

你需要在你的pom中添加tomcat依赖

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

【讨论】:

我有这个依赖,仍然得到异常 org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat【参考方案3】:

如果你在linux环境下运行,基本上你的应用没有默认端口的权限。

通过在 VM 上提供以下选项来尝试 8181。

-Dserver.port=8181

【讨论】:

【参考方案4】:

在我遇到异常“无法启动嵌入式 Tomcat servlet 容器”时,

我通过在application.properties中添加debug=true打开spring boot的调试模式,

然后重新运行代码,它告诉我java.lang.NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName()Ljava/lang/String

因此,我们知道可能我使用的是较低版本的servlet API,它与spring boot版本冲突。

我去了我的 pom.xml,发现我的依赖项之一是使用 servlet2.5, 我排除了它。

现在可以了。希望对您有所帮助。

【讨论】:

【参考方案5】:

对我来说,我只需要在 mvn 上加上一个 -X 标志。查看调试日志;查找 .properties 文件时 Spring 出现问题。

【讨论】:

【参考方案6】:

这可能是由于项目的 java 版本发生变化而发生的。例如,如果项目是在 java 8 中构建的,如果我们将 java 版本更改为 11,那么可能会出现这样的问题。在 intellij idea 中转到 File->Project Structure 然后更改 Project SDK Version

【讨论】:

【参考方案7】:

您需要 Tomcat 依赖,并且还需要从扩展 SpringBootServletInitializer 扩展您的应用程序类

@SpringBootApplication  
public class App extend SpringBootServletInitializer

    public static void main( String[] args )
    
        SpringApplication.run(App.class, "hello");
    

【讨论】:

【参考方案8】:

处理此问题的简单方法是将其包含在您的 application.properties 或 .yml 文件中: server.port=0 用于 application.properties,server.port: 0 用于 application.yml 文件。当然需要注意这些可能会根据您使用的 springboot 版本而改变。 这些将允许您的机器动态分配任何可用的可用端口。 要静态分配端口,请将上述更改为server.port = someportnumber。如果运行基于 unix 的操作系统,您可能需要检查相关端口上的僵尸活动,并在可能的情况下使用fuser -k theport/tcp 将其杀死。 您的 .yml 或 .properties 应如下所示。 server: port: 8089 servlet: context-path: /somecontextpath

【讨论】:

【参考方案9】:

对我来说,问题在于 XML 迁移。我删除了所有表和序列,它可以在下一次 bootRun 上运行

【讨论】:

【参考方案10】:

如上所述,如果您在 Linux 上运行,您的应用无法访问 80 端口。有两种方法可以解决这个问题:

    使用 root 权限运行您的应用程序 - 仅适用于本地的好主意 测试,不用于任何生产。

    例如在 8081 端口运行应用,使用 nginx 设置反向代理,并将请求从 80 重定向到 8081。

【讨论】:

以上是关于Spring boot:无法启动嵌入式 Tomcat servlet 容器的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot - 无法启动嵌入式tomcat错误

Spring boot:无法启动嵌入式 Tomcat servlet 容器

无法在 Spring Boot 中启动嵌入式 Tomcat [重复]

无法启动嵌入式容器 Spring Boot Application org.apache.catalina.LifecycleException:子容器在启动期间失败

将 Spring Boot 战争部署到 Tomcat 服务器并收到“无法启动嵌入式 Tomcat org.springframework.context.ApplicationContextExcep

部署在tomcat上的Spring Boot无法启动