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

时间:2017-04-24 03:41:19

标签: java spring spring-mvc tomcat spring-boot

我是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>

9 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:4)

您需要在pom中添加tomcat依赖项

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

答案 2 :(得分:1)

在我遇到异常“无法启动嵌入式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, 我把它排除在外。

现在它有效。希望它有所帮助。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

如果您在Linux环境上运行,则基本上您的应用没有默认端口的权限。

在VM上提供以下选项,尝试8181。

-Dserver.port=8181

答案 5 :(得分:1)

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

答案 6 :(得分:0)

您需要Tomcat Dependency并从extends SpringBootServletInitializer扩展您的Application类

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

答案 7 :(得分: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

答案 8 :(得分:0)

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