Tengo una aplicación Spring Boot simple que recibe mensajes de una cola JMS y guarda algunos datos en un archivo de registro, pero no necesita un servidor web. ¿Hay alguna forma de iniciar Spring Boot sin el servidor web?
Tengo una aplicación Spring Boot simple que recibe mensajes de una cola JMS y guarda algunos datos en un archivo de registro, pero no necesita un servidor web. ¿Hay alguna forma de iniciar Spring Boot sin el servidor web?
Respuestas:
Spring boot no incluirá tomcat incrustado si no tiene dependencias de Tomcat en la ruta de clase. Puede ver este hecho usted mismo en la clase EmbeddedServletContainerAutoConfiguration
cuya fuente puede encontrar aquí .
La esencia del código es el uso de la @ConditionalOnClass
anotación en la clase.EmbeddedTomcat
Además, para obtener más información, consulte esta y esta guía y esta parte de la documentación.
gs-convert-jar-to-war/complete
proyecto de Maven no añadir un servidor Tomcat incluido, a pesar de la spring-boot-starter-tomcat
dependencia declarada de alcance provided
. Esto se siente como un error. También vea stackoverflow.com/q/25991789/923560
Si desea ejecutar Spring Boot sin un contenedor de servlet, pero con uno en la ruta de clases (por ejemplo, para pruebas), use lo siguiente, como se describe en la documentación de Spring Boot :
@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);
}
}
Además, me encontré con esta propiedad:
spring.main.web-environment=false
application.properties
funciona perfectamente bien.
spring.main.web-environment
ahora está en desuso. Todavía funciona para 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);
}
}
Donde WebApplicationType :
NONE
- La aplicación no debe ejecutarse como una aplicación web y no debe iniciar un servidor web integrado.REACTIVE
- La aplicación debe ejecutarse como una aplicación web reactiva y debe iniciar un servidor web reactivo integrado.SERVLET
- La aplicación debe ejecutarse como una aplicación web basada en servlet y debe iniciar un servidor web de servlet incorporado.
Puedes crear algo como esto:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
new SpringApplicationBuilder(Application.class).web(false).run(args);
}
}
Y
@Component
public class CommandLiner implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
// Put your logic here
}
}
Sin embargo, la dependencia sigue ahí, pero no se utiliza.
La solucion mas sencilla. en su archivo application.properties. agregue la siguiente propiedad como se menciona en una respuesta anterior:
spring.main.web-environment = false
Para la versión 2.0.0 de Spring boot starter, use la siguiente propiedad:
spring.main.web-application-type = none
Para obtener documentación sobre todas las propiedades, use este enlace: https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
Para Spring boot v2.1.3.RELEASE, simplemente agregue las siguientes propiedades en application.propertes:
spring.main.web-application-type=none
Si necesita funcionalidad web en su aplicación (como org.springframework.web.client.RestTemplate
para las llamadas REST) pero no desea iniciar un servidor TOMCAT, simplemente exclúyalo en el 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>
A través del programa:
ConfigurableApplicationContext ctx = new SpringApplicationBuilder(YourApplicationMain.class)
.web(WebApplicationType.NONE)
.run(args);
A través del archivo application.properties:
spring.main.web-environment=false
A través del archivo application.yml:
spring:
main:
web-environment:false
Si desea utilizar una de las plantillas "Getting Started" del sitio spring.io, pero no necesita ninguna de las cosas relacionadas con el servlet que vienen con la plantilla "predeterminada" ("gs / spring-boot"), puede probar la plantilla de tareas de programación (cuyo pom * contiene spring-boot-starter, etc.) en su lugar:
https://spring.io/guides/gs/scheduling-tasks/
Eso le brinda Spring Boot, y la aplicación se ejecuta de forma independiente (no se incluyen servlets o spring-webmvc, etc. en el pom). Que es lo que quería (aunque es posible que deba agregar algunas cosas específicas de JMS, como alguien más ya señaló).
[* Estoy usando Maven, pero supongo que una compilación de Gradle funcionará de manera similar].
Eliminar la dependencia siguiente en su archivo pom funcionará para mí
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Para Kotling, esto es lo que usé últimamente:
// 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")
}
}
Y todo arranca normalmente terminando con un shell con mi comando personalizado disponible.
Similar a @nayun oh respuesta anterior, pero para versiones anteriores de Spring, use este código:
SpringApplication application = new SpringApplication(DemoApplication.class);
application.setApplicationContextClass(AnnotationConfigApplicationContext.class);
application.run(args);
spring-jms
(supongo) como una dependencia. Luego, simplemente inicie la aplicación, no se iniciará ningún servidor.