웹 서버가없는 스프링 부트


104

JMS 큐에서 메시지를 가져오고 일부 데이터를 로그 파일에 저장하지만 웹 서버가 필요하지 않은 간단한 Spring Boot 애플리케이션이 있습니다. 웹 서버없이 Spring Boot를 시작할 수있는 방법이 있습니까?


3
웹이 필요하지 않으면 포함하지 마십시오. 포함되지 않은 경우 내장 서버가 시작되지 않습니다. 시작 부모 만 필요하고 spring-jms종속성으로 추가 합니다. 그런 다음 응용 프로그램을 시작하면 서버가 시작되지 않습니다.
M. Deinum 2014 년


1
당신은 틀 렸습니다. 나는 spring-boot-starter-batch 만 사용하고, pom.xml에 바람둥이 또는 다른 서버 구성을 포함하지 않았지만 응용 프로그램을 실행하면 웹 컨테이너가 시작됩니다. 어딘가에 매개 변수를 가져와야합니다.
Mehdi

답변:


25

클래스 경로에 Tomcat 종속성이없는 경우 Spring 부트에는 임베디드 Tomcat이 포함되지 않습니다. 여기에서EmbeddedServletContainerAutoConfiguration 소스를 찾을 수 있는 수업에서이 사실을 직접 볼 수 있습니다. .

코드의 @ConditionalOnClass핵심은 클래스 에서 주석을 사용하는 것입니다.EmbeddedTomcat


또한, 자세한 내용은 체크 아웃에 대한 가이드와 문서의 일부


현재 버전에서 gs-convert-jar-to-war/completeMaven 프로젝트 spring-boot-starter-tomcat scope로 선언 된 종속성 에도 불구하고 임베디드 Tomcat 서버를 추가합니다 provided. 이것은 버그처럼 느껴집니다. 또한 stackoverflow.com/q/25991789/923560
Abdull

137

서블릿 컨테이너없이 스프링 부트를 실행하고 싶지만 클래스 경로 (예 : 테스트 용)에 하나를 사용하려면 스프링 부트 문서에 설명 된대로 다음을 사용하십시오 .

@Configuration
@EnableAutoConfiguration
public class MyClass{
    public static void main(String[] args) throws JAXBException {
                 SpringApplication app = new SpringApplication(MyClass.class);
         app.setWebEnvironment(false); //<<<<<<<<<
         ConfigurableApplicationContext ctx = app.run(args);
    }
}

또한이 속성을 우연히 발견했습니다.

spring.main.web-environment=false

12
속성을 추가하면 application.properties완벽하게 작동합니다.
Wim Deblauwe

8
이것은 작동하지만 Spring Boot 2.0에서는 더 이상 사용되지 않습니다. : 2.0 버전이 대답을 참조하십시오 stackoverflow.com/a/44394305/66686
옌스 Schauder

1
참고 :이 속성 spring.main.web-environment은 이제 더 이상 사용되지 않습니다. 여전히 Boot 2.1.1에서 작동
Sergey Karpushin

1
2.x 부팅-application.setWebApplicationType (WebApplicationType.NONE);
Michael Munsey

1
당신이 요즘 사용해야하는 것은spring.main.web-application-type=none
damd

96

스프링 부트 2.x

  • 응용 프로그램 속성

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

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

어디 WebApplicationType를 :

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

54

다음과 같이 만들 수 있습니다.

@SpringBootApplication
public class Application {
  public static void main(String[] args) {
    new SpringApplicationBuilder(Application.class).web(false).run(args);
  }
}

@Component
public class CommandLiner implements CommandLineRunner {

  @Override
  public void run(String... args) throws Exception {
    // Put your logic here
  }

}

종속성은 여전히 ​​존재하지만 사용되지는 않습니다.


sprign-boot-starter-web 의존성을 안전하게 제거 할 수 있습니까? 지금은 앱을 웹이 아닌 것으로 만들고이 종속성을 제거하면 예외가 발생합니다. ClassNotFound : javax.servlet.ServleContext
Simon Logic

솔루션 1은 더 이상 사용되지 않습니다
ACV

지구상에서 최고의 답변
prash


7

Spring boot v2.1.3.RELEASE의 경우 application.propertes에 다음 속성을 추가하십시오.

spring.main.web-application-type=none

6

이 코드를 사용하십시오.

SpringApplication application = new SpringApplication(DemoApplication.class);
application.setWebApplicationType(WebApplicationType.NONE);
application.run(args);

3

애플리케이션에 웹 기능 (예 org.springframework.web.client.RestTemplate: REST 호출)이 필요하지만 TOMCAT 서버를 시작하지 않으려는 경우 POM에서 제외하면됩니다.

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

3
  • 프로그램을 통해 :

    ConfigurableApplicationContext ctx =  new  SpringApplicationBuilder(YourApplicationMain.class)
    .web(WebApplicationType.NONE)
    .run(args);
  • application.properties 파일을 통해 :

    spring.main.web-environment=false 
  • application.yml 파일을 통해 :

    spring:
     main:
      web-environment:false

2

spring.io 사이트에서 "시작하기"템플릿 중 하나를 사용하고 싶지만 "기본"( "gs / spring-boot") 템플릿과 함께 제공되는 서블릿 관련 항목이 필요하지 않은 경우, 대신 스케줄링 작업 템플릿 (pom *에 spring-boot-starter 등이 포함되어 있음)을 사용해 볼 수 있습니다.

https://spring.io/guides/gs/scheduling-tasks/

그러면 Spring Boot가 제공되고 앱은 독립형으로 실행됩니다 (pom에 서블릿 또는 spring-webmvc 등이 포함되지 않음). (다른 사람이 이미 지적했듯이 JMS 관련 항목을 추가해야 할 수도 있지만) 원하는 것입니다.

[* Maven을 사용하고 있지만 Gradle 빌드도 비슷하게 작동한다고 가정합니다.]


2

pom 파일에 대한 다음 의존성을 제거하면 나를 위해 작동합니다.

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

1

Kotling의 경우 최근에 사용한 것입니다.


// src/main/com.blabla/ShellApplication.kt

/**
 * Main entry point for the shell application.
 */
@SpringBootApplication
public class ShellApplication : CommandLineRunner {
    companion object {
        @JvmStatic
        fun main(args: Array<String>) {
            val application = SpringApplication(ShellApplication::class.java)
            application.webApplicationType = WebApplicationType.NONE
            application.run(*args);
        }
    }

    override fun run(vararg args: String?) {}
}

// src/main/com.blabla/command/CustomCommand.kt

@ShellComponent
public class CustomCommand {
    private val logger = KotlinLogging.logger {}

    @ShellMethod("Import, create and update data from CSV")
    public fun importCsv(@ShellOption() file: String) {
        logger.info("Hi")
    }
}

그리고 모든 것이 정상적으로 부팅되며 내 사용자 지정 명령을 사용할 수있는 셸로 끝납니다.


1

spring-boot-starter 종속성을 사용할 수 있습니다. 이것은 웹 물건이 없을 것입니다.

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

1

Spring 부트에서 Spring Web 종속성은 임베디드 Apache Tomcat 웹 서버를 제공합니다. pom.xml에서 spring-boot-starter-web 종속성 을 제거 하면 내장 웹 서버를 제공하지 않습니다.

다음 종속성 제거

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

참고 : 스타터는 종속성이 아닌 상위 POM이어야합니다
OneCricketeer

0

위의 @nayun oh 대답과 비슷하지만 이전 버전의 Spring의 경우 다음 코드를 사용하십시오.

SpringApplication application = new SpringApplication(DemoApplication.class);
application.setApplicationContextClass(AnnotationConfigApplicationContext.class);
application.run(args);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.