programing

Application Context Exception:ServletWebServerFactory 빈이 없어 ServletWebServerApplicationContext를 시작할 수 없습니다.

telecom 2023. 3. 11. 08:37
반응형

Application Context Exception:ServletWebServerFactory 빈이 없어 ServletWebServerApplicationContext를 시작할 수 없습니다.

스프링 부츠를 사용하여 스프링 배치 애플리케이션을 작성했습니다.로컬 시스템에서 명령줄과 클래스 경로를 사용하여 응용 프로그램을 실행하려고 하면 정상적으로 실행됩니다.그러나 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

케이스 1:

@SpringBootApplication스프링 부트 스타터 클래스에 주석이 없습니다.

케이스 2:

의 애플리케이션의 경우는, 「」를 무효로 .web application type를 클릭합니다.

»application.properties:

spring.main.web-application-type=none

「 」를 사용하고 application.yml다음과 같이 덧붙입니다.

  spring:
    main:
      web-application-type: none

의 경우,는 「」를 확장합니다.*SpringBootServletInitializer*본교에서

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

케이스 3:

「 」를 사용하고 spring-boot-starter-webflux에 ㄴㄴㄴ데 하다를 같이 넣어요.spring-boot-starter-web존관관의

너는 ★★★★★★★★★★★★★★★★★★★★★★★★★★★@SpringBootApplication스프링 부츠 스타터 수업에서요

@SpringBootApplication
public class LoginSecurityAppApplication {

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

}

해결책은 다음과 같습니다.

으로 아아 the the the the the the the the the로 했습니다.noneapplication.ymlfilename을 클릭합니다.

spring:
  main:
    web-application-type: none

내 해결책은 나쁜 의존관계와 관련이 있었다.나는 다음을 가지고 있었다.

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

내 pom과 나는 그것을 작동시키기 위해 제외를 언급해야 했다.어떤 이유로든 이 Tomcat 패키지를 찾아야 합니다.

이 경우 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> 

프로젝트에서는 다음과 같은 기능을 사용할 수 있습니다.

<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-flux 대신 web-mvC를 사용하기 때문에 둘 다 사용할 수 있습니다.

나는 다음 콩을 첨가하는 것이 효과가 있었다.

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

.SpringApplication.run(MyApplication.class, args); 없이@SpringBootApplication석입니니다다

" " " "public static void main예를 들어 다음과 같습니다.@SpringBootApplication

Spring boot wen 응용 프로그램을 스탠드아론으로 변환하려면 다음 절차를 수행합니다.

  1. application.properties를 설정합니다.
spring.main.web-application-type=none
  1. 또는 응용 프로그램콘텍스트를 NONE 웹 콘텍스트로 갱신합니다.
ApplicationContext ctx = new SpringApplicationBuilder(MigrationRunner.class)
                .web(WebApplicationType.NONE).run(args);

애플리케이션 콘텍스트를 사용하면 다음과 같은 이점을 얻을 수 있습니다.

myBean = (MyBean) ctx.getBean("myBean", MyBean.class), bean.call_a_class(..);

Spring Boot로 이행할 때 이 문제가 발생하였습니다.의존관계를 없애라는 조언을 찾았는데 도움이 됐어요.그래서 jsp-api Project에 대한 의존성을 없앴습니다.또한 servlet-api 의존관계도 삭제해야 합니다.

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

저 같은 경우에는, 제가 이걸 없앴어요.provided dependencyscope in tomcat dependency

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

IntelliJ IDEA에서 프로젝트를 오른쪽 클릭하고 Maven에서 프로젝트를 새로고침하면 문제가 해결되었습니다.

IntelliJ 를 사용하고 있는 경우, (내 noob-self 에서와 같이) 이 문제가 발생하는 경우, [Run]설정에 [Spring Boot Application](스프링 부트 어플리케이션)과 [NOT 플레인 어플리케이션](NOT 플레인 어플리케이션)이 설정되어 있는 것을 확인합니다.

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>

다른 답변에서 생각할 수 있는 해결책과는 별도로, 어떤 식으로든 당신의 머신에서 메이븐 의존성 손상이 발생했을 수도 있습니다.(Web) Spring 부팅 응용 프로그램을 실행하려고 할 때 동일한 오류가 발생했습니다.이러한 오류는 다음 실행으로 해결되었습니다.

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

이어서

mvn package

이 솔루션에서는 이클립스가 다른 오류로 인해 IDE에서 메인 어플리케이션클래스를 실행할 수 없게 된 다른 문제를 조사했습니다.이 SO 스레드에서는 org.springframework.context 타입입니다.구성 가능한 ApplicationContext를 확인할 수 없습니다. 필요한 .class 파일에서 간접적으로 참조됩니다.

org.springframework.boot:spring-boot-starter-tomcat, was 、 가 、 가 、 가 、 가 was 。org.eclipse.jetty:jetty-server 내 my my my build.gradle

org.springframework.boot:spring-boot-starter-web서버는 Tomcat, Jetty 또는 다른 것으로 컴파일되지만 서버가 없으면 실행되지 않습니다.

WAR 타입의 spring boot 어플리케이션을 실행하려고 했는데, spring boot 어플리케이션으로 실행하려고 하면 위의 에러가 발생하였습니다.따라서 application.properties에서 웹 어플리케이션 유형을 선언한 것은 나에게 효과가 있었습니다.spring.main.web-application-type=none

가능한 웹 응용 프로그램 유형:

  1. 없음 - 응용 프로그램은 웹 응용 프로그램으로 실행되어서는 안 되며 내장된 웹 서버를 실행해서는 안 됩니다.
  2. 사후 대응형 - 응용 프로그램은 사후 대응형 웹 애플리케이션으로 실행되어야 하며 내장된 사후 대응형 웹 서버를 시작해야 합니다.
  3. SERVLET - 응용 프로그램은 서블릿 기반 웹 응용 프로그램으로 실행되어야 하며 내장된 서블릿 웹 서버를 시작해야 합니다.

제 경우, 문제는 일식에 Tomcat 서버를 따로 설치하지 않았다는 것입니다.저는 Springboot이 자동으로 서버를 시작할 것이라고 생각했습니다.

이 연장되어 있기 SpringBootServletInitializer「」를 덮어씁니다.configure「Tomcat」 「IDE」 「Tomcat」 「IDE」 「Tomcat」

설치하려면 먼저 Apachce Tomcat(이 경우 버전9)을 다운로드하고 Servers 탭을 사용하여 서버를 만듭니다.

설치 후 서버에서 기본 클래스를 실행합니다.

Run As -> Run on Server

스프링 부트로 웹 어플리케이션을 작성하려고 했는데 같은 오류가 발생하였습니다.검사한 결과 종속성이 결여되어 있는 것을 알았습니다.따라서 pom.xml 파일에 다음 종속성을 추가해야 합니다.

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

의존 관계가 없는 것이 이 문제의 원인일 수 있습니다.

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

웹 어플리케이션을 IDE(IntelliJ)가 아닌 Fat jar로 실행하려고 할 때 이 문제가 발생했습니다.

이게 나한테 효과가 있었어.application.properties 파일에 기본 프로파일을 추가합니다.

spring.profiles.active=default

다른 특정 프로파일(dev/test/prod)을 이미 설정한 경우에는 기본값을 사용할 필요가 없습니다.그러나 아직 실행하지 않은 경우 응용 프로그램을 뚱뚱한 병으로 실행하려면 이 작업이 필요합니다.

업그레이드spring-boot-starter-parentpom.xml최신 버전으로 수정해 주셨어요.

제 경우 Tomcat 8을 사용하고 있었는데 Tomcat 9로 업데이트하면 다음과 같이 수정되었습니다.

  <modelVersion>4.0.0</modelVersion>
  <groupId>spring-boot-app</groupId>
  <artifactId>spring-boot-app</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>

  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.1.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
  </parent>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
      <groupId>com.h2database</groupId>
      <artifactId>h2</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>exec-maven-plugin</artifactId>
        <version>1.2.1</version>
        <executions>
          <execution>
            <goals>
              <goal>java</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <mainClass>com.example.Application</mainClass>
        </configuration>
      </plugin>
    </plugins>
  </build>

  <properties>
    <tomcat.version>9.0.37</tomcat.version>
  </properties>

관련 문제:

  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-boot-web이 의존관계로 포함되어 있는 경우 메인 클래스가 @SpringBootApplication으로 주석을 붙인 기본 클래스를 확장하면 응용 프로그램이 로드되지 않습니다.

제 문제는 원래 질문의 문제점과 같았습니다만, 이클립스를 통해 실행 중이었고 cmd를 사용하지 않았습니다.리스트 되어 있는 모든 솔루션을 시험했지만, 동작하지 않았다.그러나 최종적으로 동작하는 솔루션은 cmd(또는 Eclipse를 통해 비슷하게 동작할 수 있음)를 통해 동작하는 것이었습니다.cmd에서 spring config가 추가된 수정된 명령어 사용:

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

스프링 구성이 올바르게 로드되지 않은 것이 문제였던 것 같습니다.

제 경우 gretty 플러그인(3.0.6)은 아직 활성화되어 있습니다.Gretty는 내장된 Tomcat 의존성에 어떤 영향을 끼친다.Gretty를 제거하면 오류가 수정되었습니다.

다음과 같은 코멘트를 주세요.

여기에 이미지 설명 입력

언급URL : https://stackoverflow.com/questions/50231736/applicationcontextexception-unable-to-start-servletwebserverapplicationcontext

반응형