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


104

У меня есть простое приложение Spring Boot, которое получает сообщения из очереди JMS и сохраняет некоторые данные в файл журнала, но не требует веб-сервера. Есть ли способ запустить Spring Boot без веб-сервера?


3
Если вам не нужен Интернет, не включайте его, если он не включен, встроенный сервер не запустится. Вам понадобится только родительский spring-jmsэлемент- стартер и добавить (я думаю) в качестве зависимости. Затем просто запустите приложение, сервер не запустится.
M. Deinum


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

Ответы:


25

Spring boot не будет включать встроенный 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
К сведению: это свойство spring.main.web-environmentустарело. Все еще работает для Boot 2.1.1
Сергей Карпушин

1
Boot 2.x - application.setWebApplicationType (WebApplicationType.NONE);
Майкл Манси

1
То, что вы должны использовать в наши дни,spring.main.web-application-type=none
чертовски

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

лучший ответ на земле
праш

10

Самое простое решение. в вашем файле application.properties. добавьте следующее свойство, как указано в предыдущем ответе:

spring.main.web-environment = false

Для версии 2.0.0 стартера загрузки Spring используйте следующее свойство:

spring.main.web-application-type = none

Для документации по всем свойствам используйте эту ссылку: 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, но вам не нужны какие-либо вещи, связанные с сервлетами, которые поставляются с шаблоном «default» («gs / spring-boot»), вместо этого вы можете попробовать шаблон scheduling-tasks (чей 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

Вот что я использовал для Котлинга в последнее время:


// 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 предоставляет встроенный веб-сервер Apache Tomcat. Если вы удалите зависимость spring-boot-starter-web в pom.xml, тогда он не будет предоставлять встроенный веб-сервер.

удалить следующую зависимость

<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);
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.