ApplicationContextException:由于缺少ServletWebServerFactory bean,无法启动ServletWebServerApplicationContext

时间:2018-05-08 10:45:34

标签: spring spring-boot spring-batch

我使用Spring启动编写了一个Spring批处理应用程序。当我尝试在本地系统上使用命令行和类路径运行该应用程序时,它运行正常。但是,当我试图在linux服务器上运行它时,它给了我以下异常

Unable to start web server; nested exception is
org.springframework.context.ApplicationContextException: 
Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean.

以下是我运行它的方式:

java -cp jarFileName.jar; lib\* -Dlogging.level.org.springframework=DEBUG -Dspring.profiles.active=dev -Dspring.batch.job.names=abcBatchJob com.aa.bb.StartSpringBatch > somelogs.log

23 个答案:

答案 0 :(得分:20)

对于非Web应用程序,请在属性文件中禁用web application type

application.properties

spring.main.web-application-type=none

如果您使用application.yml,请添加:

  spring:
    main:
      web-application-type: none

对于Web应用程序,在主类中扩展*SpringBootServletInitializer*

@SpringBootApplication
public class YourAppliationName extends SpringBootServletInitializer{
    public static void main(String[] args) {
        SpringApplication.run(YourAppliationName.class, args);
    }
}

答案 1 :(得分:8)

解决方案是:

我在IsAllChecked文件中明确将以下属性设置为none

application.yml

答案 2 :(得分:5)

我的解决方案与不良依赖性有关。我有:

billing

在pom中,我必须注释掉排除项才能使其正常工作。由于某种原因,它必须寻找这个tomcat软件包。

答案 3 :(得分:3)

添加以下bean对我有用。

    @Bean
    public ServletWebServerFactory servletWebServerFactory() {
        return new TomcatServletWebServerFactory();
    }

我正在使用没有SpringApplication.run(MyApplication.class, args);注释的@SpringBootApplication运行非web spring应用程序。

答案 4 :(得分:3)

就我而言,该问题解决了注释spring-boot-starte-web中排除的tomcat依赖项

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

答案 5 :(得分:2)

您可能在项目中使用了它:

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

在这种情况下,您还必须添加:

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

魔术发生了:)

PS:这是因为默认情况下,Spring会默认使用 web-MVC 而不是 web-flux

答案 6 :(得分:1)

我在使用 tomcat-jasper 较新版本时遇到同样的错误

<dependency>
    <groupId>org.apache.tomcat</groupId>
    <artifactId>tomcat-jasper</artifactId>
    <version>10.0.6</version>
</dependency>

我用稳定的旧版本替换了它,它对我来说很好用。

<dependency>
    <groupId>org.apache.tomcat</groupId>
    <artifactId>tomcat-jasper</artifactId>
    <version>9.0.46</version>
</dependency>

答案 7 :(得分:1)

我想运行 WAR 类型的 spring boot 应用程序,当我尝试将应用程序作为 spring boot 应用程序运行时,我遇到了上述错误。因此,在 application.properties 中声明 Web 应用程序类型对我有用。 spring.main.web-application-type=none

可能的网络应用程序类型:

  1. NONE - 应用程序不应作为 Web 应用程序运行,也不应启动嵌入式 Web 服务器。
  2. REACTIVE - 应用程序应作为反应式 Web 应用程序运行,并应启动嵌入式反应式 Web 服务器。
  3. SERVLET - 应用程序应作为基于 servlet 的 Web 应用程序运行,并应启动嵌入式 servlet Web 服务器。

答案 8 :(得分:1)

我确实在IntelliJ IDEA中右键单击了我的项目,然后在Maven中->重新加载项目,问题已解决。

答案 9 :(得分:1)

类似于确保已安装org.springframework.boot:spring-boot-starter-tomcat的解决方案,我在org.eclipse.jetty:jetty-server中丢失了build.gradle

org.springframework.boot:spring-boot-starter-web需要一台服务器,无论是Tomcat,Jetty还是其他服务器-它都可以编译,但没有服务器就无法运行。

答案 10 :(得分:1)

在迁移到Spring Boot时遇到了这个问题。我找到了advice to remove dependencies,它有所帮助。因此,我删除了对 jsp-api 项目的依赖。另外,还必须删除 servlet-api 依赖性。

compileOnly group: 'javax.servlet.jsp', name: 'jsp-api', version: '2.2' 

答案 11 :(得分:0)

对于我来说,我删除了tomcat依赖项中的provided范围。

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-tomcat</artifactId>
  <scope>provided</scope> // remove this scope
</dependency>

答案 12 :(得分:0)

我试图用Spring Boot创建一个Web应用程序,但遇到了同样的错误。 检查后,我发现我缺少依赖项。因此,请确保将以下依赖项添加到pom.xml文件中。

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

答案 13 :(得分:0)

就我而言,问题是我没有在日食中单独安装Tomcat服务器。我以为Springboot会自动在其内部启动服务器。

由于我的主类扩展了SpringBootServletInitializer并覆盖了configure方法,所以我肯定需要在我的IDE中安装一个Tomcat服务器。

要安装,请首先下载Apachce Tomcat(在我的情况下为版本9),然后使用“服务器”标签创建服务器。

安装后,在服务器上运行主类。

Run As -> Run on Server

答案 14 :(得分:0)

就我而言,我使用的是TOMCAT 8并更新到TOMCAT 9进行了修复:

some

相关问题:

  1. https://github.com/spring-projects/spring-boot/issues?q=missing+ServletWebServerFactory+bean
  2. https://github.com/spring-projects/spring-boot/issues/22013-Spring Boot应用程序作为模块
  3. https://github.com/spring-projects/spring-boot/issues/19141-当包含spring-boot-starter-web作为依赖项时,当主类扩展带有@SpringBootApplication注释的基类时,应用程序加载失败

答案 15 :(得分:0)

除了其他答案中可能的解决方案之外,您的计算机上还可能以某种方式发生了Maven依赖项损坏。我在尝试运行(Web)Spring引导应用程序时遇到相同的错误,并且通过运行以下命令可以解决该问题-

File1 <- structure(list(V1 = c("AT1G01010", "AT1G01020", "AT1G01030", 
"AT1G01040", "AT1G01050"), V2 = c("AT1G01010", "AT1G01020", "AT1G01030", 
"AT1G01040", "AT1G01050")), class = "data.frame", row.names = c(NA, 
-5L))
File2 <- structure(list(V1 = c("SAMN10267760-CAGATCAAGATGGCGT", "SAMN10267760-TAAGCGTTCATCGATG", 
"SAMN10267760-CGCCAAGCAAGCGTAG", "SAMN10267760-CGTTCTGTCTGACCTC", 
"SAMN10267760-GTCGTAAGTAGGGACT", "SAMN10267760-CTCGAGGCAGCGTAAG", 
"SAMN10267760-GTGCGGTCACTGCCAG", "SAMN10267760-GACACGCGTTCTGAAC", 
"SAMN10267760-TGGCTGGAGCCGATTT", "SAMN10267760-CAGATCAGTTCGTCTC"
)), class = "data.frame", row.names = c(NA, -10L))
File3 <- structure(list(V1 = c(2L, 4L, 5L), V2 = c(1L, 1L, 1L), V3 = c(41.409866, 
6.901644, 848.9022)), class = "data.frame", row.names = c(NA, 
-3L))

File4 <- data.frame(Col1=File1[File3[, 1], 1], Col2=File2[File3[, 2], 1], Col3=File3[, 3])
File4
#        Col1                          Col2       Col3
# 1 AT1G01020 SAMN10267760-CAGATCAAGATGGCGT  41.409866
# 2 AT1G01040 SAMN10267760-CAGATCAAGATGGCGT   6.901644
# 3 AT1G01050 SAMN10267760-CAGATCAAGATGGCGT 848.902200

之后

mvn dependency:purge-local-repository -DreResolve=true

我进入这个解决方案,研究另一个问题,由于不同的错误,Eclipse不允许我从IDE运行主应用程序类,类似于此SO线程上的错误-> The type org.springframework.context.ConfigurableApplicationContext cannot be resolved. It is indirectly referenced from required .class files

答案 16 :(得分:0)

使用“ public static void main”注释类,例如:@SpringBootApplication

答案 17 :(得分:0)

当我尝试以胖罐而不是从我的IDE(IntelliJ)内运行Web应用程序时遇到了这个问题。

这对我有用。只需将默认配置文件添加到 application.properties 文件。

spring.profiles.active=default

如果您已经设置了其他特定的配置文件(dev / test / prod),则不必使用default。但是,如果没有,则有必要将应用程序作为胖子运行。

答案 18 :(得分:0)

如果您使用的是IntelliJ(就像我的noob-self那样),请确保“运行”设置具有Spring Boot Application和NOT Plain Application。

答案 19 :(得分:0)

我的问题与原始问题中的问题相同,只是我通过 Eclipse 而不是 cmd 运行。尝试了列出的所有解决方案,但没有奏效。然而,对我来说最终的工作解决方案是通过 cmd 运行(或者可以通过 Eclipse 类似地运行)。使用从 cmd 附加了 spring 配置的修改命令:

start java -Xms512m -Xmx1024m <and the usual parameters as needed, like PrintGC etc> -Dspring.config.location=<propertiesfiles> -jar <jar>

我想我的问题是弹簧配置没有正确加载。

答案 20 :(得分:0)

将pom.xml中的spring-boot-starter-parent升级到最新版本为我修复了它。

答案 21 :(得分:-1)

可能是您的Spring Boot启动程序类中缺少@SpringBootApplication。

@SpringBootApplication
public class LoginSecurityAppApplication {

    public static void main(String[] args) {
        SpringApplication.run(LoginSecurityAppApplication.class, args);
    }

}

答案 22 :(得分:-2)

  1. @SpringBootApplication:已检查,无法正常工作。
  2. Pom文件中的spring-boot-starter-web:已检查,没有用。
  3. 从IntelliJ CE切换到IntelliJ Ultimate,问题已解决。