Spring Boot без веб-сервера


104

У мене є проста програма Spring Boot, яка отримує повідомлення з черги JMS і зберігає деякі дані у файлі журналу, але не потребує веб-сервера. Чи можна запустити Spring Boot без веб-сервера?


3
Якщо вам не потрібна мережа, тоді не включайте її, якщо вона не включена, вбудований сервер не запускається. Вам знадобиться лише початковий батько і додати spring-jms(я думаю) як залежність. Тоді просто запустіть програму, жоден сервер не буде запущений.
M. Deinum


1
Ви помиляєтесь, я використовую лише пакет spring-boot-starter-batch, я не включаю жодну конфігурацію tomcat чи інший сервер у свій pom.xml, однак запуск програми запускає веб-контейнер. Він повинен десь брати параметр.
Мехді

Відповіді:


25

Spring завантаження не включатиме вбудований tomcat, якщо у вас немає залежностей Tomcat від шляху до класу. Ви можете переконатися в цьому самі в класі EmbeddedServletContainerAutoConfiguration, джерело якого ви можете знайти тут .

Основним елементом коду є використання @ConditionalOnClassанотації до класуEmbeddedTomcat


Крім того, для отримання додаткової інформації перегляньте цей і цей посібник, а також цю частину документації


У своїй поточній версії, gs-convert-jar-to-war/completeпроект Maven дійсно додати вбудований сервер Tomcat, незважаючи на spring-boot-starter-tomcatзалежності оголошена з розмахом provided. Це схоже на помилку. Також див. Stackoverflow.com/q/25991789/923560
Абдулл

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працює абсолютно нормально.
Вім Деблауве

8
Це працює, але застаріло у Spring Boot 2.0. Дивіться цю відповідь для версії 2.0: stackoverflow.com/a/44394305/66686
Йенс Шаудер

1
FYI: Ця властивість spring.main.web-environmentзараз застаріла. Все ще працює для Boot 2.1.1
Сергій Карпушин

1
Завантаження 2.x - application.setWebApplicationType (WebApplicationType.NONE);
Майкл

1
Ти, що ти повинен використовувати в ці дні,spring.main.web-application-type=none
проклятий

95

Весняний завантажувач 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 - Додаток повинен працювати як веб-програма на основі сервлету та запускати вбудований веб-сервлетний сервлет.

53

Ви можете створити щось подібне:

@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
Саймон Логік

Зверніть увагу, рішення 1 застаріло
ACV

9

Найпростіше рішення. у файлі application.properties. додайте наступну властивість, як згадувалося в попередній відповіді:

spring.main.web-environment = false

Для версії 2.0.0 початкового завантажувача Spring використовуйте таку властивість:

spring.main.web-application-type = немає

Для документації щодо всіх властивостей використовуйте це посилання: https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html


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, і програма працює як автономна (сервлети, spring-webmvc тощо не включені в пам’ять). Що саме ви хотіли (хоча, можливо, вам доведеться додати деякі речі, специфічні для JMS, на що вже вказує хтось інший).

[* Я використовую Maven, але припустимо, що збірка Gradle працюватиме аналогічно].


2

Видалити залежність від вашого файлу pom для мене буде працювати

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

1

Для Котлінга ось що я використовував останнім часом:


// 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. Якщо ви видалите spring-boot-starter-web залежність у pom.xml, тоді він не надає вбудований веб-сервер.

видалити наступну залежність

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

0

Подібно до @nayun о, відповідь вище, але для старих версій Spring використовуйте цей код:

SpringApplication application = new SpringApplication(DemoApplication.class);
application.setApplicationContextClass(AnnotationConfigApplicationContext.class);
application.run(args);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.