У мене є проста програма Spring Boot, яка отримує повідомлення з черги JMS і зберігає деякі дані у файлі журналу, але не потребує веб-сервера. Чи можна запустити Spring Boot без веб-сервера?
У мене є проста програма Spring Boot, яка отримує повідомлення з черги JMS і зберігає деякі дані у файлі журналу, але не потребує веб-сервера. Чи можна запустити Spring Boot без веб-сервера?
Відповіді:
Spring завантаження не включатиме вбудований tomcat, якщо у вас немає залежностей Tomcat від шляху до класу. Ви можете переконатися в цьому самі в класі EmbeddedServletContainerAutoConfiguration
, джерело якого ви можете знайти тут .
Основним елементом коду є використання @ConditionalOnClass
анотації до класуEmbeddedTomcat
Крім того, для отримання додаткової інформації перегляньте цей і цей посібник, а також цю частину документації
gs-convert-jar-to-war/complete
проект Maven дійсно додати вбудований сервер Tomcat, незважаючи на spring-boot-starter-tomcat
залежності оголошена з розмахом provided
. Це схоже на помилку. Також див. Stackoverflow.com/q/25991789/923560
якщо ви хочете запустити весняне завантаження без контейнера сервлета, але з одним на шляху до класу (наприклад, для тестів), використовуйте наступне, як описано в документації про весняне завантаження :
@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
application.properties
працює абсолютно нормально.
spring.main.web-environment
зараз застаріла. Все ще працює для Boot 2.1.1
spring.main.web-application-type=none
spring.main.web-application-type=NONE
# REACTIVE, SERVLET
@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
- Додаток повинен працювати як веб-програма на основі сервлету та запускати вбудований веб-сервлетний сервлет.
Ви можете створити щось подібне:
@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
}
}
Залежність все ще існує, хоча не використовується.
Найпростіше рішення. у файлі 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
Для Spring boot v2.1.3.RELEASE просто додайте наступні властивості до application.propertes:
spring.main.web-application-type=none
Якщо вам потрібна веб-функціональність у вашому додатку (наприклад, 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>
Через програму:
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
Якщо ви хочете скористатися одним із шаблонів "Початок роботи" з сайту spring.io, але вам не потрібні речі, пов'язані з сервлетами, які постачаються із шаблоном "за замовчуванням" ("gs / spring-boot"), замість цього ви можете спробувати шаблон планування завдань (чий pom * містить spring-boot-starter тощо):
https://spring.io/guides/gs/scheduling-tasks/
Це дає вам Spring Boot, і програма працює як автономна (сервлети, spring-webmvc тощо не включені в пам’ять). Що саме ви хотіли (хоча, можливо, вам доведеться додати деякі речі, специфічні для JMS, на що вже вказує хтось інший).
[* Я використовую Maven, але припустимо, що збірка Gradle працюватиме аналогічно].
Видалити залежність від вашого файлу pom для мене буде працювати
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Для Котлінга ось що я використовував останнім часом:
// 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")
}
}
І все завантаження, як правило, закінчується оболонкою з моєю спеціальною командою.
Під час завантаження Spring Spring Web залежність забезпечує вбудований веб-сервер Apache Tomcat. Якщо ви видалите spring-boot-starter-web залежність у pom.xml, тоді він не надає вбудований веб-сервер.
видалити наступну залежність
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Подібно до @nayun о, відповідь вище, але для старих версій Spring використовуйте цей код:
SpringApplication application = new SpringApplication(DemoApplication.class);
application.setApplicationContextClass(AnnotationConfigApplicationContext.class);
application.run(args);
spring-jms
(я думаю) як залежність. Тоді просто запустіть програму, жоден сервер не буде запущений.