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

问题描述 投票:0回答:14

我是 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>
java spring spring-mvc tomcat spring-boot
14个回答
42
投票

尝试将

application.yaml
(或
application.properties
)中的端口号更改为其他值。


15
投票

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

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

6
投票

就我而言,我遇到了多个错误,第一个错误是:“无法启动嵌入式 Tomcat servlet 容器”。我多次尝试解决第一个错误,但真正的问题在于其余的错误。结果是我有两个不同的记录器导入,所以当我尝试初始化它时,没有编译问题,但这是一个运行时错误。

我的建议:检查所有的错误,也许问题并不像我最初想象的那样出现在第一个错误中。所以也许这个问题的解决方案就在下一个显示的错误中。

如果这是您遇到的唯一错误,解决方案可能是上述答案。


5
投票

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

通过在虚拟机上提供以下选项来尝试 8181。

-Dserver.port=8181


2
投票

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

我通过在application.properties中添加

debug=true
开启了spring boot的debug模式,

然后重新运行代码,它告诉我

java.lang.NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName()Ljava/lang/String

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

我查看了我的 pom.xml,发现我的依赖项之一正在使用 servlet2.5, 我排除了它。

现在可以了。希望有帮助。


2
投票

对于我来说,我只需要用

mvn
放置一个 -X 标志即可。查看调试日志;查找 .properties 文件时 Spring 出现问题。


2
投票

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


0
投票

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

@SpringBootApplication  
public class App extend SpringBootServletInitializer
{
    public static void main( String[] args )
    {
        SpringApplication.run(App.class, "hello");
    }
}

0
投票

处理此问题的简单方法是将其包含在您的 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


0
投票

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


0
投票

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

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

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


0
投票

您似乎可能错误地使用了您的一个(如果不是更多)实体的映射。解决这个问题。并且错误应该消失。

就我而言,我忘记了我映射了两个实体,并为其中一个实体留下了一个用 @OneToMany 注释的对象。我注释掉了,现在我已经摆脱了这个错误。


0
投票

虽然可能不是OP的解决方案,但我的搜索将我带到了这里,然后我发现我的问题导致了同样的错误消息。

我的 application-beta.yml 已正确命名,以匹配我的运行配置 > 活动配置文件设置(我的 IDE = intelliJ)。然而,我错过了 yml 文件中需要设置属性的一个位置:

spring:
  profiles: betarclocal

需要更改以匹配“测试版”活动配置文件:

spring:
  profiles: beta

简单地忽略了这一点,并且此下的 yml 配置中的所有属性都被忽略了...并且 tomcat 服务器需要其中一个属性。

长话短说:确保您的活动配置文件、弹簧配置文件和应用程序-[activeprofile].yml 都统一命名。


0
投票

Spring boot 已经嵌入了与 spring-boot-starter-web 依赖相关的嵌入 tomcat 服务器,不需要外部 tomcat 服务器,无论如何,我通过将项目使用的 JavaSE 更改为更高版本来解决问题 JavaSE-11 --> JavaSE-17

enter image description here

enter image description here

注意:我使用的是 Eclipse IDE

© www.soinside.com 2019 - 2024. All rights reserved.