it-source

스프링 부트 정보웹 환경을 올바르게 비활성화하는 방법

criticalcode 2023. 3. 7. 21:34
반응형

스프링 부트 정보웹 환경을 올바르게 비활성화하는 방법

스프링 부트 비웹 응용 프로그램 시작 시 다음 오류가 발생함

Caused by: org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.getEmbeddedServletContainerFactory(EmbeddedWebApplicationContext.java:185) ~[spring-boot-1.3.5.RELEASE.jar:1.3.5.RELEASE]

그리고 나서 나는 매너 아래를 시도했다.

new SpringApplication().setWebEnvironment(false);

시작해도 여전히 위의 오류가 발생합니다.

그리고 시도했다

@SpringBootApplication(exclude={SpringDataWebAutoConfiguration.class})

같은 에러가 발생하고 있습니다.

마지막으로 다음 구성을 추가하려고 했습니다.application.properties

spring.main.web-environment=false

이번엔 효과가 있어

처음 두 가지 방법은 왜 작동하지 않는가?

스프링 부트 2.0 이후

-web(false)/setWebEnvironment(false)는 권장되지 않으며 대신 Web-Application-Type을 사용하여 지정할 수 있습니다.

  • 응용 프로그램 속성

    spring.main.web-application-type=NONE 
    # REACTIVE, SERVLET
    
  • 또는 Spring Application Builder

    @SpringBootApplication
    public class SpringBootDisableWebEnvironmentApplication {
    
        public static void main(String[] args) {
            new SpringApplicationBuilder(SpringBootDisableWebEnvironmentApplication.class)
                .web(WebApplicationType.NONE) // .REACTIVE, .SERVLET
                .run(args);
       }
    }
    

응용 프로그램 위치유형:

  • NONE- 어플리케이션은 웹 어플리케이션으로 실행되어서는 안 되며 임베디드 웹 서버를 기동해서는 안 됩니다.
  • REACTIVE응용 프로그램은 사후 대응형 웹 응용 프로그램으로 실행되어야 하며 내장된 사후 대응형 웹 서버를 시작해야 합니다.
  • SERVLET- 응용 프로그램은 서블릿 기반 웹 응용 프로그램으로 실행되어야 하며 내장된 서블릿 웹 서버를 시작해야 합니다.

우대:다른 SO 답변

이 답변은 구식입니다.Spring Boot 2.0에 대한 다른 답변을 참고하십시오.

Spring Boot 1.x의 원래 답변:

이 설정이 기능하지 않는 이유는 다음 두 가지 인스턴스가 다르기 때문입니다.

new SpringApplication().setWebEnvironment(false); 
SpringApplication.run(SpringBootDisableWebEnvironmentApplication.class, args);

무효로 하고 있습니다.setWebEnvironment(false)new SpringApplication()오브젝트 및 콜 스태틱 방식run()SpringApplication.run(...)그건 좀 다르죠.

세 가지 방법을 알아냈어요

@SpringBootApplication
public class SpringBootDisableWebEnvironmentApplication implements CommandLineRunner{


    public static void main(String[] args) throws Exception {

//      Method#1: Using SpringApplicationBuilder.

        SpringApplication springApplication = 
                new SpringApplicationBuilder()
                .sources(SpringBootDisableWebEnvironmentApplication.class)
                .web(false)
                .build();

        springApplication.run(args);

//--------------------------------------------------------      

//      Method#2: Using SpringBootDisableWebEnvironmentApplication.     

//      SpringBootDisableWebEnvironmentApplication springBootDisableWebEnvironmentApplication = 
//              new SpringBootDisableWebEnvironmentApplication();
//      springBootDisableWebEnvironmentApplication.run(args);

//--------------------------------------------------------      

//      Method#3: Using SpringApplication().

//      SpringApplication springApplication = new SpringApplication();
//      springApplication.setWebEnvironment(false);
//      
//      Set<Object> sources = new HashSet<>();
//      sources.add(SpringBootDisableWebEnvironmentApplication.class);
//      springApplication.setSources(sources);
//      springApplication.run(args);

//--------------------------------------------------------  

    }

    @Override
    public void run(String... arg0) throws Exception {
        System.out.println("Hello, Spring Boot gives many options ;)");
    }
}

프로젝트 완료입니다.

또, 다음의 설정을 제외할 필요는 없습니다.

@SpringBootApplication(exclude = {EmbeddedServletContainerAutoConfiguration.class, 
                              WebMvcAutoConfiguration.class})

왜냐면 넌 그런게 없거든spring-boot-starter-web에 대한 의존성pom.xml

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

다른 답변에서 이미 언급했듯이 가장 간단한 해결책은 속성을 추가하는 것입니다.

  • spring.main.web-application-type=NONESpring-boot 2.x의 경우
  • spring.main.web-environment=falsespring-boot 1.x의 경우

하지만 가장 간단한 해결책은 최선의 해결책이 아닙니다. 단지 빠르고 지저분할 뿐입니다.spring-boot에는 클래스 경로의 콘텐츠에 의해 트리거되는 많은 자동 구성이 있기 때문에 앱에 불필요한 웹 관련 종속성이 있을 수 있습니다.

Spring-batch 어플리케이션이 있어서

Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean.

그것은 의 존재에 의해 야기되었다.javax.servlet-api내 POM에 저장해당.제거했더니 문제가 없어졌어요.

public static void main(String[] args) {
    SpringApplication(Application.class)
       .setWebApplicationType(WebApplicationType.NONE)
       .run(args);
}

를 사용하는 대신SpringApplicationBuilder.

언급URL : https://stackoverflow.com/questions/37187519/about-spring-boot-how-to-disable-web-environment-correctly

반응형