У меня есть простое приложение Spring Boot, которое получает сообщения из очереди JMS и сохраняет некоторые данные в файл журнала, но не требует веб-сервера. Есть ли способ запустить Spring Boot без веб-сервера?
У меня есть простое приложение Spring Boot, которое получает сообщения из очереди JMS и сохраняет некоторые данные в файл журнала, но не требует веб-сервера. Есть ли способ запустить Spring Boot без веб-сервера?
Ответы:
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
если вы хотите запустить весеннюю загрузку без контейнера сервлета, но с контейнером в пути к классам (например, для тестов), используйте следующее, как описано в документации по весенней загрузке :
@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 = none
Для документации по всем свойствам используйте эту ссылку: 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, но вам не нужны какие-либо вещи, связанные с сервлетами, которые поставляются с шаблоном «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 будет работать аналогично].
Удаление следующей зависимости от вашего файла 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 предоставляет встроенный веб-сервер Apache Tomcat. Если вы удалите зависимость spring-boot-starter-web в pom.xml, тогда он не будет предоставлять встроенный веб-сервер.
удалить следующую зависимость
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Подобно ответу @nayun oh выше, но для более старых версий Spring используйте этот код:
SpringApplication application = new SpringApplication(DemoApplication.class);
application.setApplicationContextClass(AnnotationConfigApplicationContext.class);
application.run(args);
spring-jms
элемент- стартер и добавить (я думаю) в качестве зависимости. Затем просто запустите приложение, сервер не запустится.